この記事でSoftetherによるVPNを構築しました。
このときはパスワード認証でしたので、より安全な証明書での認証に変更しました。
通常であればWindowsでの管理ツールでやるのが簡単なのでしょうが、私はWindows PCを持っていなかったので、vpncmdでのコマンド操作で実施しました。
サーバー認証
ユーザーがサーバーをサーバー証明書で認証するようにします。
サーバー側
まずサーバー証明書と秘密鍵を作成。
SoftetherにMakeCert/MakeCert2048という便利なコマンドがありますので、これを使います。
MakeCertは鍵長が1024bit、MakeCert2048は鍵長が2048bitとのこと。
各フィールドは空(=none)でもOKなので、Enter連打。
期間は空にすると10年になるようです。
sudo /opt/vpnserver/vpncmd (略) 1. Management of VPN Server or VPN Bridge 2. Management of VPN Client 3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool) Select 1, 2 or 3: 1 (Enter) (略) Hostname of IP Address of Destination: localhost:5555 (Enter) (略) Specify Virtual Hub Name: (Enter) (略) VPN Server>MakeCert2048 MakeCert2048 command - Create New X.509 Certificate and Private Key (2048 bit) Name of Certificate to Create (CN): (Enter) Organization of Certificate to Create (O): (Enter) Organization Unit of Certificate to Create (OU): (Enter) Country of Certificate to Create (C): (Enter) State of Certificate to Create (ST): (Enter) Locale of Certificate to Create (L): (Enter) Serial Number of Certificate to Create (Hexadecimal): (Enter) Expiration Date of Certificate to Create (Days): (Enter) File Name to Save Certificate to Create: /opt/vpnserver/server.cert File Name to Save Private Key to Create: /opt/vpnserver/server.priv The command completed successfully.
作った証明書と秘密鍵をサーバー認証用ファイルに指定します。
VPN Server>Hub virtual_hub (略) VPN Server/virtual_hub>ServerCertSet ServerCertSet command - Set SSL Certificate and Private Key of VPN Server Read X.509 certificate from file name: /opt/vpnserver/server.cert Read private key from file name: /opt/vpnserver/server.priv The command completed successfully.
この時点で証明書と秘密鍵は設定ファイルに直接書き込まれているので、指定した証明書ファイルと秘密鍵ファイルは削除して構いません。
復元したくなったらServerCertGetコマンドでファイルに書き戻せます。
ユーザー側
お次は作成した証明書をユーザーのホストにコピーし、サーバー認証で使うように設定します。
sudo /opt/vpnclient/vpncmd (略) 1. Management of VPN Server or VPN Bridge 2. Management of VPN Client 3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool) Select 1, 2 or 3: 2 (Enter) (略) Hostname of IP Address of Destination: (Enter) (略) VPN Client>AccountServerCertEnable virtual_connection AccountServerCertEnable command - Enable VPN Connection Setting Server Certificate Verification Option The command completed successfully. VPN Client>AccountServerCertSet virtual_connection AccountServerCertSet command - Set Server Individual Certificate for VPN Connection Setting Read X.509 certificate from file name: ./server.cert The command completed successfully.
一度切断して再接続してみます。
どうやらうまく証明書での認証ができたようです。
VPN Client>AccountDisconnect virtual_connection AccountDisconnect command - Disconnect VPN Connection Setting During Connection The command completed successfully. VPN Client>AccountConnect virtual_connection AccountConnect command - Start Connection to VPN Server using VPN Connection Setting The command completed successfully. VPN Client>AccountStatusGet virtual_connection AccountStatusGet command - Get Current VPN Connection Setting Status Item |Value ------------------------------------------+------------------------------------------------------------------------ VPN Connection Setting Name |virtual_connection Session Status |Connection Completed (Session Established) (略) VPN Client>AccountGet virtual_connection AccountGet command - Get Setting of VPN Connection Setting Item |Value -----------------------------------------------------+--------------------------------------------------------------------------------------------------------------- (略) Verify Server Certificate |Enable Registered Server Individual Certificate |, SERIAL="00" (Digest: MD5="12345678901234567890123456789012", SHA1="1234567890123456789012345678901234567890") (略)
ユーザー認証
ユーザー認証も基本的には同じ流れでやれます。
サーバー側
MakeCert/MakeCert2048で証明書と秘密鍵を作成。
サーバー側では以下のようにしてユーザー証明書を認証に使うように指定。
VPN Server>Hub virtual_hub (略) VPN Server/virtual_hub>UserSignedSet UserSignedSet command - Set Signed Certificate Authentication for User Auth Type User Name: yasu Limit of Common Name (CN) Value: Limit of Serial Number Value: The command completed successfully. VPN Server/virtual_hub>UserCertSet UserCertSet command - Set Individual Certificate Authentication for User Auth Type and Set Certificate User Name: yasu Read X.509 certificate from file name: /opt/vpnserver/yasu.cert The command completed successfully.
ユーザー側
ユーザー側も同じように指定。
sudo /opt/vpnclient/vpncmd (略) 1. Management of VPN Server or VPN Bridge 2. Management of VPN Client 3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool) Select 1, 2 or 3: 2 (Enter) (略) Hostname of IP Address of Destination: (Enter) (略) VPN Client>AccountCertSet virtual_connection AccountCertSet command - Set User Authentication Type of VPN Connection Setting to Client Certificate Authentication Read X.509 certificate from file name: /opt/vpnserver/yasu.cert Read private key from file name: /opt/vpnclient/yasu.priv The command completed successfully.
一度切断して接続し直します。
証明書による認証ができたみたいです。
VPN Client>AccountDisconnect virtual_connection AccountDisconnect command - Disconnect VPN Connection Setting During Connection The command completed successfully. VPN Client>AccountConnect virtual_connection AccountConnect command - Start Connection to VPN Server using VPN Connection Setting The command completed successfully. VPN Client>AccountStatusGet virtual_connection AccountStatusGet command - Get Current VPN Connection Setting Status Item |Value ------------------------------------------+-------------------------------------------------------- VPN Connection Setting Name |virtual_connection Session Status |Connection Completed (Session Established) (略) VPN Client>AccountGet virtual_connection AccountGet command - Get Setting of VPN Connection Setting Item |Value -----------------------------------------------------+--------------------------------------------------------------------------------------------------------------- VPN Connection Setting Name |virtual_connection (略) Authentication Type |Client Certificate Authentication User Name |yasu Client Certificate for Authentication Use |, SERIAL="00" (Digest: MD5="12345678901234567890123456789012", SHA1="1234567890123456789012345678901234567890") (略)
これでサーバー、ユーザー、ともに証明書での認証ができるようになりました!
終わりに
いかがでしたか。
証明書認証と聞くと構えてしまいますが、コマンドを数回打つだけでそれほど難しくないですよ!
Comments