easyrsaでSAN証明書を作成する(5) for Sophos Firewall Home Edition

Internet

 Sophos Firewall Home Edition を使っています。以前は XG Firewall という名前でした。個人利用であれば『無償で使える』非常に優秀なUTMです。この Sophos Firewall は Proxmox 上の仮想マシンとして構築しており、自宅ネットワークにおいて24時間体制でサーバー保護・インターネット通信の制御を担っています。

Sophos Firewallの用途

  • IPv4 環境での各種サーバ公開に利用。実験室ブログのvirgoサーバはProxmox仮想マシンです。
  • 家庭内ネットワークを「DMZ」「LANサーバセグメント」「クライアントセグメント」に分割

 物理的な光回線は1本ですが、OpenWrt 経由の IPoE 経路Sophos 経由の PPPoE 経路2系統でインターネットアクセスを行う構成 にしています。結果的に、クライアント端末 → IPoE経由、サーバ群 → PPPoE経由という住み分けが自然にできています。

SSL証明書の発行(更新)

 昨年の夏にプライベートCAから発行した有効期限 1年 のSSL証明書で Sophos Firewall を運用していましたが、期限切れていることを今月に気が付きました。今回は、easyrsaを使ったSSL証明書の更新手順 を備忘録としてまとめます。以前、作成した証明書を組み込んだ際には、アクティブ化できなかったトラブルについても回顧録として記録しておきます。

Sophos Firewall への証明書インストール

 この作業、実は過去に初挑戦した際に失敗、敗走しておりました。Sophos firewall にプライベートCAから発行したSSL証明書とCA証明書をインストールしたのですが、SSL証明書がUntrustの表示のまま、Trustに切り替わってくれないのです。そのため、最終局面において、管理画面用のSSL証明書として設定ができないような状況でした。

  • 2024年 夏
    SSL証明書がuntrustの表示のままTrustに切り替わらず、管理画面用のSSL証明書として割り当て不能。
    原因不明。
  • 2024年 年末
    年末休暇に再挑戦。夏に作成したSSL証明書を再設定したところ、あっさり Trusted判定で成功。
  • 2025年秋(今回)
    証明書期限切れ → 今回、CSR再生成、発行。
2024年夏の顛末

2024年夏時点では、いろいろな角度から切り分け・検証をしましたが・・・

試したこと内容結果
プライベートCA 2号 追加構築Easy-RSAベースで新CA構築❌ Untrustedのまま
プライベートCA 3号 追加構築OpenSSLベースで新CA構築❌ 変化なし
証明書チェーンの見直し中間CAを追加、PEM連結など検証❌ 改善せず

なにやってもダメ。ただし、実際の影響は少なく、管理画面にブラウザでアクセスするときにSSL証明書エラーとなるだけですから『べ、別に致命的な問題ではないんだからねっ!』ということで、いったん諦めたというのが当時の経緯でした。

2024年 年末: なにごともなかったかのように成功。

年末の休暇のタイミングで、「せっかくだしもう一度試してみるか」と軽い気持ちで再挑戦。

まったく同じ証明書を再インポートしただけで Trusted 判定に。
Sophos、やってんな……🤔

まさにそんな感じでした。違いはSophos Firewallのファームウェア。CAが悪いとか、俺が悪いとかそういうんじゃなくて、実際、証明書は正しかったってことじゃん!と逆転無罪となりました。

ようやく本題:SSL証明書の発行処理

1.プライベートCA証明書のアップロード

 Sophos Firewall コンソールログイン、メニューの[証明書]-[証明機関(CA)]から[追加]ボタンをクリック。
プライベートCA証明書をアップロードします。
(前回アップロードしていますので、今回はオペレーションしていません)

2.Sophos FirewallコンソールでCSR作成

メニューの[証明書]から[追加]ボタンをクリック。アクションを「証明書署名要求(CSR)の生成」に変更、パラメータを入力します。

2-1. 証明書の詳細
項目
名前xgfw1.oz.exiv.net
鍵の種類RSA
鍵長2048 bits
セキュアハッシュSHA256
2-2. サブジェクト名の属性
項目
国名Japan
都道府県Tokyo
市区町村Katsushika
組織名Exiv Networks
組織単位名oz / IT Dept.
コモンネーム(CN)xgfw1.oz.exiv.net
メールアドレスhq@exiv.net
2-3. サブジェクト代替名(SAN)
項目
DNS名 ※SAN DNS重要。Chrome利用時必須xgfw1.oz.exiv.net
IPアドレス ※IPでアクセスする場合は追加192.168.0.254
172.16.0.254

入力後、保存をクリックします。

2-4. 実際のスクリーンショット

入力後、保存をクリックします。

3.生成したCSRをCAへインポート

ダウンロードボタンをクリックします。CSRファイルのダウンロードが可能です。私はクリップボードへコピーして、プライベートCAのコンソールで貼り付け、CSRファイルを作成しました。

プライベートCAのコンソールを操作。CAルートに移動。エディタでファイル作成、

# cd /ca-root/certs
# vi xgfw1.oz.exiv.net.req

エディタにCSR文字列を貼り付けて、保存します。

-----BEGIN CERTIFICATE REQUEST-----
MIIDUTCCAjkCAQAwgZoxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzETMBEG
A1UEBwwKS2F0c3VzaGlrYTEWMBQGA1UECgwNRXhpdiBOZXR3b3JrczEWMBQGA1UE

// 省略 

YX9LTrVTo7nCUJY018Vst+lj8x72JPha6YYARd5TQkoKNMO7Xg==
-----END CERTIFICATE REQUEST-----

:wq!

作成したCSRファイルをインポートします。

# ./easyrsa import-req xgfw1.oz.exiv.net.req xgfw1.oz.exiv.net

Unable to import the request as the destination file already exists.

前回、作成したCSRファイルが残っていたようです。前回のファイルをいったん削除するか、処理日付等のフレーズを追加して別ファイル名でインポートするのが良いと思います。今回は別名に変更してインポートしました。

# mv xgfw1.oz.exiv.net.req xgfw1.oz.exiv.net_20251101.req
# ./easyrsa import-req xgfw1.oz.exiv.net_20251101.req xgfw1.oz.exiv.net_20251101

Note: using Easy-RSA configuration from: /root/ca-root/cert/vars
Using SSL: openssl OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)

The request has been successfully imported with a short name of: xgfw1.oz.exiv.net_20251101
You may now use this name to perform signing operations on this request.

# ls ./pki/reqs/xgfw1.oz.exiv.net_20251101.req
./pki/reqs/xgfw1.oz.exiv.net_20251101.req
4. インポートしたCSRファイルを元に有効なSSL証明書を生成
# ./easyrsa sign-req server xgfw1.oz.exiv.net_20251101

Note: using Easy-RSA configuration from: /root/ca-root/cert/vars
Using SSL: openssl OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 3650 days:

subject=
    countryName               = JP
    stateOrProvinceName       = Tokyo
    localityName              = Katsushika
    organizationName          = Exiv Networks
    organizationalUnitName    = oz / IT Dept.
    commonName                = xgfw1.oz.exiv.net
    emailAddress              = hq@exiv.net

X509v3 Subject Alternative Name:
    DNS:xgfw1.oz.exiv.net,IP:192.168.0.254,IP:172.16.0.254


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: 

 有効期限10年で作成してみます。今後、ブラウザエラーになる場合は作成し直します。確認プロンプトにはyesを入力します。

Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes

Using configuration from /root/ca-root/cert/pki/easy-rsa-438633.7KHlgJ/tmp.4KoPHf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'JP'
stateOrProvinceName   :ASN.1 12:'Tokyo'
localityName          :ASN.1 12:'Katsushika'
organizationName      :ASN.1 12:'Exiv Networks'
organizationalUnitName:ASN.1 12:'oz / IT Dept.'
commonName            :ASN.1 12:'xgfw1.oz.exiv.net'
emailAddress          :IA5STRING:'hq@exiv.net'
Certificate is to be certified until Oct 29 17:21:55 2035 GMT (3650 days)

Write out database with 1 new entries
Database updated

Certificate created at: /root/ca-root/cert/pki/issued/xgfw1.oz.exiv.net_20251101.crt

無事、出力できました。出力した証明書ファイルを確認します。

# cat ./pki/issued/xgfw1.oz.exiv.net_20251101.crt

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: ...省略...
        Signature Algorithm: sha512WithRSAEncryption
        Issuer: CN=oz.exiv.net
        Validity:
            Not Before: Oct 31 17:21:55 2025 GMT
            Not After : Oct 29 17:21:55 2035 GMT
        Subject: C=JP, ST=Tokyo, L=Katsushika, O=Exiv Networks,
                 OU=oz / IT Dept., CN=xgfw1.oz.exiv.net/emailAddress=hq@exiv.net
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            Public-Key: (2048 bit)
                Modulus: ...省略...
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: CA:FALSE
            X509v3 Subject Key Identifier: ...
            X509v3 Authority Key Identifier: ...
            X509v3 Extended Key Usage: TLS Web Server Authentication
            X509v3 Key Usage: Digital Signature, Key Encipherment
            X509v3 Subject Alternative Name:
                DNS:xgfw1.oz.exiv.net, IP Address:192.168.0.254, IP Address:172.16.0.254
    Signature Algorithm: sha512WithRSAEncryption
    Signature Value: ...省略...

# PEM形式
-----BEGIN CERTIFICATE-----
MIIECTCCAvGgAwIBAgIRAJ9Lc54PrHvLfa+CexsKFjQwDQYJKoZIhvcNAQENBQAw

// 途中省略

Au+MdYVtA8kAhc6Jew4erGmCUMqD8SrlbPswEgk=
-----END CERTIFICATE-----

 今回は「—–BEGIN CERTIFICATE—–」から末尾までをクリップボードへコピー、Sophos Firewallの管理画面で貼り付け操作を行うことにします。
もちろん、コピーした内容を使って、PEM形式のファイルとして作成、アップロードでも構いません。

5. Sophos Firewall へ証明書をインポート

 さきほどのCSRダウンロードアイコンの左隣にあるインポートアイコンをクリックします。

 さきほどのCSRダウンロードアイコンの左隣にあるインポートアイコンをクリックします。
証明書のインポートダイアログが表示されます。赤枠部分にクリップボードへ転送した証明書データを貼り付けします。

証明書データを貼り付けしたら、「証明書のインポート」をクリックします。

証明書のインポートが完了、開始日、終了日が表示され、「信頼する」にグリーンのチェックがあれば成功です!!

6. 管理コンソールに証明書を割り当て

インポートした証明書を管理コンソールで利用できるように設定します。
メニューの「管理」から「管理者とユーザの設定」、「管理コンソールとエンドユーザの間の操作」にある「証明書」のコンボボックスから、さきほど設定した証明書を選択します。

適用ボタンをクリックすると、確認ダイアログが表示されます。

OKボタンをクリックします。

「管理コンソールの設定の更新に成功しました」と表示されれば完了です。

7. 動作確認

クライアントPCのWebブラウザから「サブジェクト代替名(SAN)」として設定したホスト名、IPアドレスを使って、管理コンソールにアクセスします。

SSL警告が表示されなければ成功です。

※SANに設定したDNS名はOpenWrtのDNSサーバにレコード登録しています。
 これはインターネット非公開、プライベートネットワークでのみ利用可能なホスト名です。

※プライベート認証局のCA証明書は、予めクライアントPCにもインストールしておく必要があります。

結局、2024年夏の不具合はなんだった?

最終的には、Sophos Firewallにも、セオリー通りの一般的な手順でSSL証明書の組み込みができました。
2024年夏にSSL証明書の組み込みができなかった件、推測としては:

  • 当時の Sophosファームウェア(SFOS 20.x系)の一部ビルドで、SSL証明書の判定ロジックになんらかの不具合があった疑いあり・・・。
  • その後のアップデート(MRリリース)で改善された。

ファクトとして、2024年末には成功しており、犯人は当時のSophosファームウェアということで、間違いないかと思います。

 結局、そのまま、プライベートCAから発行したSSL証明書で運用を開始しましたが、当の本人は夏に発行した1年証明書ということを失念しており、また夏がくれば、当然、期限が切れる罠。
そして、季節は巡り、それに気が付いたのが1年を経過して10月・・・という情けない話ではあります。

余談その1:IPoEはPPPoEより本当に「速い」のか?

 最近、@nifty から「現在、お客様がご利用の接続方式(PPPoE接続)は、夜間など通信が混雑する時間帯に速度が低下する場合がございます。より快適にご利用いただけるIPoE接続への変更をお願いします」といった案内メールが届きました。

……えーと、IPoEもすでに使ってるんですけど!?おそらくPPPoE接続ユーザに通知しているんでしょうね。
それはさておき。両方同時に使っている人間の経験としては、時間帯によってはPPPoEの方が速くなることもあります。結局のところ、「どちらが速いか」フレッツ網の混雑状況に大きく左右されるものと考えらえます。

IPoE(OpenWrt) vs PPPoE(Sophos Firewall)接続速度比較

我が家の回線は、フレッツ光ネクストの一番安いやつです。Openwrt、Sophos Firewall どちらもProxmox上の仮想マシンです。Proxmoxは物理NICが2つ、そのうち1つをWANポートとしてONUに直結。どちらのVMも、それぞれの仮想NICでセッションを確立しています。

OpenWRT IPoE接続のベンチマーク

下りがやや落ちていますが、PingやJitterは安定。フレッツ光のIPoE(v6プラス系)としてはフツー?遅め?

Sophos Firewall PPPoE接続のベンチマーク

時間帯によっては、こんな感じです。PPPoE接続にもかかわらず、上り下りともに450MbpsオーバーPing/Jitterも低遅延。本当にPPPoE?というぐらい優秀と思います。結局、時間帯によるのですよね。

ベンチマーク結果のまとめ

項目OpenWrt(IPoE)Sophos Firewall(PPPoE)
DOWNLOAD272.01 Mbps457.43 Mbps
UPLOAD426.90 Mbps539.07 Mbps
PING5.00 ms5.80 ms
JITTER0.60 ms0.31 ms

NTT東日本の「フレッツ光ネクスト」は、巨大なIPv6閉域網(NGN)を多くの利用者で共有しています。
そのため、IPoE利用者が増えれば、NGN内のルーターやMAP-Eの終端装置(AFTR)が混雑し、時間帯によってはIPoEの方が遅くなることもあります。IPoEは、PPPoEと異なりNTE(網終端装置)を経由しないため、PPPoEに比べて構造的には混雑しにくい・遅くなりにくいという利点はありますが、「常に速い」というわけではなく、実際の速度はISPの設備増強に大きく依存しています。

@niftyの案内メールについては、もしかしたら、@niftyは将来的にPPPoEを廃止したがっているのかもしれません。知らんけど。
(※個人の感想です)

余談その2:ファイアウォールのホスト名「xgfw1」の由来

「xg」は かつての旧製品名 「Sophos XG Firewall」 から。「fw1」は「Check Point FireWall-1」へのオマージュ。FireWall-1 は、1990年代半ばに登場した 商用ファイアウォールの先駆け的存在でした。自宅だと自由に名前つけられるからね。なんとも懐古趣味な名前だと思いませんか?

コメント

タイトルとURLをコピーしました