Softether の sstp-vpn で証明書認証する備忘録です.
証明書認証とは?
公式による説明は
にありますが,いわゆる,証明書を用いた,
- X509 認証
- チャレンジ・レスポンス認証
- パスワードレス認証
ですね.Softether の場合,標準で2048 bit のキーが使われるので,10進数換算で桁数が600桁以上の鍵で暗号された通信でやり取りされる毎回異なる設問による認証ですから,ID とパスワードとは強度が違いすぎます.
ただし,実際に設定してみると,Softether の sstp-vpn で証明書認証を行うにはいろいろ気をつけないといけないことがあって,大ハマりしてしましました.
Softether を証明書認証に対応させる
今回使用するのはオープンソース版の Softether です.
ただし,オープンソース版の softehter はそのままでは日本と中国語環境の場合,証明書認証に対応しないようで,対応させるにはソースコードの一部を以下のようにコメントアウトする必要があるようです.
$ git clone https://github.com/SoftEtherVPN/SoftEtherVPN.git $ vi SoftEtherVPN/src/Cedar/Server.c .... bool SiIsEnterpriseFunctionsRestrictedOnOpenSource(CEDAR *c) { /* char region[128]; bool ret = false; // Validate arguments if (c == NULL) { return false; } SiGetCurrentRegion(c, region, sizeof(region)); if (StrCmpi(region, "JP") == 0 || StrCmpi(region, "CN") == 0) { ret = true; } return ret; */ return false; } ....
書き換え後は,コンパイルして実行可能な状態にしなければなりませんが,これについては,Softether オープンソース版のページの「Build from Source code」の頁をご覧ください.
なお,私の場合,LANG=C とした環境で使っていたので当初この制限があることを知りませんでした.と言うことで,ソースコードの書き換えとコンパイルが面倒な場合は,UNIX 版を LANG=C で使うと言う手もあります.
また,Softether を OS の起動と同時に自動起動させるなども必要ですが,この辺りについては別記事をご覧ください(これは Alpine linux の例です.systemd に対応した Ubuntu などのディストリビューションだと単に,systemctl enable softether-vpnserver.service とするだけです).
クライアント証明の発行準備
次はクライアント証明の発行準備を行う必要がありますが,これについては以下3つのパターンに分けて方法を示します.
Softether VPN Server のみに正規の証明書を使う
2025年1月1日追記:この方法は認証局の証明書をインストールしないで済む手軽さはあるのですが,以下の2つの理由からあまり適当ではないかもしれません.個人的な認証局をきちんと立てる方が良い気がします.
- PKCS #12 形式を使えば,クライアント証明の証明書と認証局の証明書を合わせて配布できる(クライアント証明はインストール必須なので,証明局の証明書も一緒にインストールしてしまえるなら手間は同じ)
- 認証用ではない Softether のサーバー証明書をクライアント証明に使っている(Softether ではなぜかこれで通ってしまう.StrongSwan とかだともちろんアウト)
なお,個人的な認証局の立て方については近日中に公開を予定している StrongSwan による ikev2 vpn の証明書による認証についての備忘録を記すつもりですが,Softether VPN 管理マネージャーだけで済ませたい場合は,以下の「オレオレ証明を使う」を参照して下さい(サーバー証明を作成する以外の部分は共通です).
Softether VPN Server のサーバー証明書のみ正規のものに置き換える方法です.比較的小規模な場合に推奨の方法です.
証明書の置き換えは,Softether VPN サーバー管理マネージャーの「暗号化と通信関係の設定」から「インポート」を選ぶだけです.
ただし,登録する証明書を発行する際は,必ず証明書の Common Name (CN) の値を VPN サーバーのインターネット側からアクセス可能なホスト名 (FQDN) にしなければなりません.
また,中間証明を Softether に登録する必要がある場合もありますが,この場合は GUI での登録はできません.
なお,この場合でも例えば Windows 組込みの sstp-vpn だと初回接続時にサーバーが検証できない旨の警告が出ることを注意しておきます(無視して1度接続すれば以後は出なくなります).
クライアント証明の発行にも外部証明機関を使う
これは,サーバーだけでなく,クライアント証明にも正規(ここでの「正規」とは,Verisign などの発行する証明書だけではなく,大企業などで,正規に運用されている証明局ので発行される証明書も含む)の証明機関の発行した証明書を使う選択肢です.クライアントの台数が多い場合の推奨になります.
まず,サーバー証明の登録は前節と同様に行なってください.
次に,Softether VPN Server にクライアント証明を発行する証明機関の証明書を組み込んでください.具体的には,クライアントが接続する仮想 HUB の管理画面の「信頼する証明機関の証明書」の部分に登録するだけです.
オレオレ証明を使う
最後にオレオレ証明書を使う場合です.VPN クライアント数が非常に少ない場合にしか現実的な選択肢ではないと思います.全てのクライアントの「信頼できるルート証明機関」に証明書を手動で登録する必要があるからです(Softether の FAQ にも記述あり).
このオレオレ証明書を用いたクライアント証明の発行準備は,以下の記事の「VPN サーバー管理マネージャの手順」と同様に行うことを推奨します.
クライアントが Windows で,さらに SSTP などの Windows 組み込みの VPN 接続を使う場合は,上のサイトで「ルート証明書」と記されている証明書を「信頼されたルート証明機関」にインポートしておく必要があります(クライアントが Windows 以外の場合も同様なことが多いと思います).Windows の場合のインポートの方法は以下のページが分かりやすいと思います.
クライアント証明の発行とサーバーへの登録
以下,Softether VPN サーバー管理マネージャーを使ってクライアント証明を発行する手順を示します.外部の証明機関(アプリ)を使う場合は,それぞれの機関(アプリ)の発行手順に従ってください.
署名用証明書の準備
まず,署名用の証明書を準備します.
Softether VPN Server のみに正規の証明書を使った場合は,この正規の証明書を署名用証明書として使ってください.この証明書は,Softether VPN 管理マネージャーの「暗号化と通信関係の設定」の「サーバー証明書」から「エクスポート」ボタンを押すだけでダウンロドできます.ダウンロードの形式は PKCS #12 をお勧めしておきます(秘密鍵と公開鍵が1ファイルでダウンロードできて手間が少し省けます).
オレオレ証明を使う場合は,前節で「ルート証明書」と記した証明書を使うことを推奨しておきたいと思います.
クライアント証明書の発行
クライアント証明は VPN 接続ユーザーごとに発行します.したがって,これは,Softether VPN サーバー管理マネージャーの「仮想 Hub の管理」の「ユーザー管理」から行うことになりますが,ここでは新規ユーザー test に対してクライアント証明を発行する例を示します.
まず,「認証方法」から「固有証明書認証」を選択します.すると,画面右側の「固有証明書認証」が有効化されるので,「証明書作成ツール」ボタンをクリックします.すると「新しい証明書の作成」画面に切り替わるので,
- 「他の証明書によって署名された証明書」を選択
- 「証明書と秘密鍵の読み込み」ボタンをクリックして署名用の証明書を読み込み
- 名前 (CN) に test を指定(必須)
- 所属機関,組織単位他を指定(任意)
- シリアル番号(推奨)
- 証明書の有効期限を変更(825日以内が推奨)
- 暗号強度の設定(これはデフォルトの2048bitで良いと思います)
- 「OK」のクリック
とすることで,クライアント証明書が作成されます(保存を促されます).
クライアント証明については以下いくつか注意をしておきます.
- sstp-vpn を利用する場合,クライアント証明書を作成する際指定する名前 (CN) は必ず ID(上の例だと test)を指定しなければなりません(外部の証明機関で発行する場合も同様です).規格的には,サーバーに登録されている証明書とクライアントの証明書が一致すれば良いだけのはずですし,実際,Softether VPN のネィティブ接続だと,この部分が ID でなくても接続できるのですが,sstp-vpn の場合はなぜかこれができません.
- クライアント証明書の保存形式は,この証明書の利用を予定しているクライアントの OS が Windows なら PKCS #12 を,それ以外の場合は X509 をお勧めします.
- 上の手順を終えた段階で,Softether VPN Server に,作成したクライアント証明書の公開鍵が登録された状態になります.この登録された公開鍵は「証明書の表示」ボタンからダウンロードすることができます.また,「証明書の指定」ボタンで,ダウンロードしておいた証明書や外部の証明機関で発行した証明書を登録することも可能です.
固有証明書認証と署名済み証明書認証
上記の手順の最初に,「固有証明書認証」を選択せよ,としましたが,この「固有証明書認証」とは,ID に1対1で証明書を紐づける認証方式です.つまり,ID ごとに接続を許可する証明書がひとつだけの認証方式です.
これに対して,「署名済み証明書認証」とは,信頼する証明機関が発行した証明書を用いているか否かで接続を許可するか否かを決定する認証方式で,信頼する証明機関は,仮想 Hub の管理画面の「信頼する証明機関の証明書」から登録します.
固有証明書認証から署名済み証明書認証への切り替えは簡単で,単に「認証方法」欄の選択肢を選び直し,署名に用いた証明書を信頼する証明機関として登録するだけなのですが,sstp-vpn を利用する場合は固有証明書認証のときと同様に「名前 (CN)」を ID と一致させなければならないようです.
なお,Softether VPN Server の場合,署名済み証明書認証を特定の CN もしくはシリアル番号に限定することで,もう少し細かな接続制限を行うことができる仕組みとなっているようです.
クライアントの設定
前節でクライアント証明書が発行できましたので,それをクライアントに登録し,sstp-vpn 接続する手順について,Windows と Ubuntu sstp-client の例を以下示します.
Windows の場合
Windows の場合は,OS 標準で sstp-vpn 接続に 対応していますが,証明書を用いる場合はまず,その証明書を OS の証明書ストアの「個人」にインポートする必要があります.
具体的には,以下のページの「証明書インストール」節の「信頼されたルート証明機関」を選択している部分を「個人」に変更するだけです.
あとは,「設定」の「ネットワークとインターネット」の「VPN」から,「VPN を追加」を選び,
- 接続名:hogehoge(適当な接続名)
- サーバー名またはアドレス:Softether VPN Server の FQDN もしくは IP アドレス
- VPN の種類:Secure Socket トンネリングプロトコル (SSTP)
- サインインの種類:証明書
として,「保存」ボタンを押せば設定は完了です.
なお,初回のみ接続時に以下のような警告がでますが,2回目以降は出なくなります.
Ubuntu 24.04.1 sstp-client
Ubuntu の場合はまず sstp-client 用のパッケージを導入する必要があります.
$ sudo apt install sstp-client network-manager-sstp-gnome
あとは,「設定」⇨「ネットワーク」⇨「VPN」⇨「接続を追加」とすると,VPN の種類を選ぶよう促されるので「Secure Socket Tunneling Protocol (SSTP)」を選択し,「作成」とすると,VPN 接続を設定する画面が出てきますので,
- 接続名:hogehoge
- ゲートウェイ:Softether VPN Server の FQDN もしくは IP アドレス
- type:Certificates (TLS)
- User 証明書:クライアント証明書(X509形式)
- User プライベートキー:クライアント証明書の秘密鍵(X509形式)
- User キーパスワード:秘密鍵のパスワード(設定している場合)
を設定して「保存」を選択すれば設定は終了です(IPv6 を無効化しているネットワークに接続する場合は,さらに IPv6 設定のメソッドを「無効」に設定).
雑感
試行錯誤の末何とか Softether VPN Server の sstp-vpn を証明書化できましたが,全体像の把握にも時間がかかりましたし,CN を ID と一致させなければならないことや,Windows の場合,クライアント証明を証明書ストアの「個人」にインポートしないといけないことに気がつくのにかなり時間がかかってしまいました.やはり証明書への対応は一筋縄ではいかないなぁと感じています.
しかし,私の場合,sstp-vpn はメインではなく補助的に使っているだけです.メインは,strongSwan による IKEv2 VPN なのですが,こちらはいまだパスワード認証です.また,実は,この IKEv2 VPN on StrongSwan の設定記録,私の blog だと結構な人気記事です.
いろいろな方に参考にしてもらえていることは大変嬉しいのですが,時代的にパスワード認証はそろそろ止めるべきでしょう.と言うことで,近いうちに頑張って IKEv2 VPN も証明書化したいと思っています.2025年のお正月の宿題ですね.
以上!