【VyOS】SSTP を使用した SSL/TLS VPN リモートアクセス (User/Password 認証)

接続構成

Windows 端末から NAT 配下のサーバにアクセスするため、SSL/TLS VPN の一種となる SSTP (Secure Socket Tunneling Protocol) を用いて同一の LAN セグメントに接続する。

ルータで使用する SSL サーバ証明書はプライベート認証局 (CA) で署名・発行する。発行したサーバ証明書 (RSA 公開鍵) 、および RSA 秘密鍵とプライベート認証局 (CA) の証明書 (RSA 公開鍵) をルータにインポートして利用する。

OpenSSL の使用環境

プライベート認証局 (CA) の OpenSSL は以下の環境のものを使用する。

作成ディレクトリ/etc/pki/CA
設定ファイル/etc/pki/tls/openssl.cnf
OpenSSL バージョン1.1.1k
OSRed Hat Enterprise Linux 8.7
OpenSSL の使用環境

サーバ証明書は別途作成したプライベート認証局 (CA) を利用して署名・発行する。

CA 証明書

秘密鍵のフォーマットPKCS#1 (OpenSSL 1 系の標準)
サブジェクト DNO=Private Lab, CN=Private Root CA 01
X.509 エンコーディング形式PEM (Base64)
プライベート認証局 (CA) 証明書

サーバ証明書の発行

サーバ 証明書

有効期限約2年 (730日)
RSA 暗号の鍵長4,096bit (約1,233桁 log2 x 4096)
秘密鍵のフォーマットPKCS#8 (OpenSSL 3.0 系の標準)
サブジェクト DNCN=vpn.vm.lab
シリアル番号自動生成
シリアル番号情報ファイル/etc/pki/CA/serial
X.509 エンコーディング形式PEM (Base64)
X.509v3 拡張設定ファイルvpn_ext.txt
基本制約重要【critical】
CA:FALSE
鍵用途重要【critical】
digitalSignature, keyEncipherment, keyAgreement
拡張鍵用途serverAuth
サブジェクトの別名 (SAN)【DNS】vpn.vm.lab
【IP】10.0.0.254
サーバ証明書

上記のサーバ証明書を発行する。この時、秘密鍵のフォーマットを【PKCS#8】となるように注意する。サブジェクトの別名を使用してマルチドメイン用の証明書を発行する。

※VyOS 1.4 系では OpenSSL 3.0 がインストールされているため、サーバ証明書の秘密鍵をインポートする際に【PKCS#8】形式である必要がある。

# mkdir /etc/pki/CA/server/private
# cd /etc/pki/CA/server

# openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out ./private/vpn_key.pem
.....................................................++++
.................................................................................................................................................................++++

# cat ./private/vpn_key.pem
-----BEGIN PRIVATE KEY-----
MIIJQwIBADAN... (略)
-----END PRIVATE KEY-----

# openssl asn1parse -i -in ./private/vpn_key.pem
    0:d=0  hl=4 l=2371 cons: SEQUENCE
    4:d=1  hl=2 l=   1 prim:  INTEGER           :00
    7:d=1  hl=2 l=  13 cons:  SEQUENCE
    9:d=2  hl=2 l=   9 prim:   OBJECT            :rsaEncryption
   20:d=2  hl=2 l=   0 prim:   NULL
   22:d=1  hl=4 l=2349 prim:  OCTET STRING      [HEX DUMP]:30820929020... (略)


※ PKCS#1 の場合 (PKCS#8 から変換して確認)
# openssl rsa -in ./private/vpn_key.pem -out ./private/vpn_key_pcks1.pem
writing RSA key

# cat ./private/vpn_key_pcks1.pem
-----BEGIN RSA PRIVATE KEY-----
MIIJKQIBAAKCAgEAsfTKQR5oooYmOeeckG... (略)
-----END RSA PRIVATE KEY-----

# openssl asn1parse -i -in ./private/vpn_key_pcks1.pem
    0:d=0  hl=4 l=2345 cons: SEQUENCE
    4:d=1  hl=2 l=   1 prim:  INTEGER           :00
    7:d=1  hl=4 l= 513 prim:  INTEGER           :B1F4CA411E68A2862639E... (略)
  524:d=1  hl=2 l=   3 prim:  INTEGER           :010001
  529:d=1  hl=4 l= 513 prim:  INTEGER           :867A5AE12CCE9B8ACE965... (略)
 1046:d=1  hl=4 l= 257 prim:  INTEGER           :DC5954E20198427D7D2A4... (略)
 1307:d=1  hl=4 l= 257 prim:  INTEGER           :CEBF963870F4F60767F99... (略)
 1568:d=1  hl=4 l= 257 prim:  INTEGER           :CF4BFF4E2BFFE93593863... (略)
 1829:d=1  hl=4 l= 256 prim:  INTEGER           :4DBE757A9BDF4174DF805... (略)
 2089:d=1  hl=4 l= 256 prim:  INTEGER           :3E35C1E34489902FC9B21... (略)

サブジェクトの別名 (SAN) 等々、サーバ証明書に応じた個別設定の X.509v3 拡張設定ファイルを作成する。

# vi ./vpn_ext.txt

================================ vpn_ext.txt ================================
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = DNS:vpn.vm.lab, IP:10.0.0.254
==============================================================================

署名リクエスト (CSR) を作成する。作成した CSR ファイルより、サブジェクト DN 、及び RSA 暗号鍵長が正しいことを確認する。

# openssl req -new -key ./private/vpn_key.pem -out vpn_csr.pem -subj "/CN=vpn.vm.lab"

# openssl req -text -in vpn_csr.pem
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: CN = vpn.vm.lab
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
                Modulus:
                    00:b1:f4:ca:41:1e:... (略)
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         42:36:cb:c2:20:91:... (略)
-----BEGIN CERTIFICATE REQUEST-----
MIIEWjCCAkICAQA... (略)
-----END CERTIFICATE REQUEST-----

署名リクエスト (CSR) をプライベート認証局 (CA) で署名することで、サーバ証明書を発行する。

# openssl ca -create_serial -days 730 -in ./vpn_csr.pem -extfile vpn_ext.txt
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            04:25:bd:31:51:c7:c8:5b:86:0d:d2:e1:92:64:8b:1f:a5:dc:af:ff
        Validity
            Not Before: Apr  6 17:16:08 2023 GMT
            Not After : Apr  5 17:16:08 2025 GMT
        Subject:
            commonName                = vpn.vm.lab
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment, Key Agreement
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            X509v3 Subject Alternative Name:
                DNS:vpn.vm.lab, IP Address:10.0.0.254
Certificate is to be certified until Apr  5 17:16:08 2025 GMT (730 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            04:25:bd:31:51:c7:c8:5b:86:0d:d2:e1:92:64:8b:1f:a5:dc:af:ff
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: O=Private Lab, CN=Private Root CA 01
        Validity
            Not Before: Apr  6 17:16:08 2023 GMT
            Not After : Apr  5 17:16:08 2025 GMT
        Subject: CN=vpn.vm.lab
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
                Modulus:
                    00:b1:f4:ca:41:1e:... (略)
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment, Key Agreement
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            X509v3 Subject Alternative Name:
                DNS:vpn.vm.lab, IP Address:10.0.0.254
    Signature Algorithm: sha256WithRSAEncryption
         45:78:80:70:ef:ed:... (略)
-----BEGIN CERTIFICATE-----
MIIFKDCCAxCgAwIBAgIUBCW... (略)
-----END CERTIFICATE-----
Data Base Updated

ルータにインポートするために、プライベート認証局 (CA) の証明書、サーバ証明書、サーバ証明書の秘密鍵をそれぞれ成形して準備する。
【—–BEGIN XXX—–】から【—–END XXX—–】などの囲まれた部分の中の文字列のみを1行に成形する。※コピー&ペーストのための準備

●プライベート認証局 (CA) の証明書
# cat /etc/pki/CA/cacert.pem
-----BEGIN CERTIFICATE-----
MIIFVzCCAz+gAwIBAgIUSpcJwCZLr63cNvarTmy7ZjyNGiAwDQYJKoZIhvcNAQEL
BQAwMzEUMBIGA1UECgwLUHJpdmF0ZSBMYWIxGzAZBgNVBAMMElByaXZhdGUgUm9v
... (略)
llUXDuicIGRSPdqKO8eiA9ULh4mdgiYxAEvJ
-----END CERTIFICATE-----

⇒ MIIFVzCC... (略) ...llUXDuicIGRSPdqKO8eiA9ULh4mdgiYxAEvJ


●サーバ証明書
# cat /etc/pki/CA/newcerts/0425BD3151C7C85B860DD2E192648B1FA5DCAFFF.pem
Certificate:
... (略)
-----BEGIN CERTIFICATE-----
MIIFKDCCAxCgAwIBAgIUBCW9MVHHyFuGDdLhkmSLH6Xcr/8wDQYJKoZIhvcNAQEL
BQAwMzEUMBIGA1UECgwLUHJpdmF0ZSBMYWIxGzAZBgNVBAMMElByaXZhdGUgUm9v
... (略)
SlPuvZ1d2thvqx7JvXjIWcEQurk72eMpPEWRTA==
-----END CERTIFICATE-----

⇒ MIIFKDCCAx... (略) ...SlPuvZ1d2thvqx7JvXjIWcEQurk72eMpPEWRTA==


●サーバ証明書の秘密鍵 (PKCS#8 フォーマット)
# cat /etc/pki/CA/server/private/vpn_key.pem
-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCx9MpBHmiihiY5
55yQbIWlfaC3OtfJyX1wiv/ikBWxcA41Nar3/iCGUrwGvxRuBLdapUxH1+KfrYQ/
... (略)
g1psHIEaOzYLutgjFHXFgJgJqKWRkp0=
-----END PRIVATE KEY-----

⇒ MIIJQwIBADANBg... (略) ...g1psHIEaOzYLutgjFHXFgJgJqKWRkp0=

VyOS (1.4 系) のコンフィグ例

VyOS にプライベート認証局 (CA) の証明書、およびサーバ証明書・秘密鍵をインポートする。

[edit]
# set pki ca private_ca certificate MIIFVzCCAz+gAw... (略)
# set pki certificate server_cert private key MIIJQwIBADANBgkq... (略)
# set pki certificate server_cert certificate MIIFKDCCAxCgAwI... (略)

# run show pki
Certificate Authorities:
Name        Subject                              Issuer CN              Issued               Expiry               Private Key    Parent
----------  -----------------------------------  ---------------------  -------------------  -------------------  -------------  --------
private_ca  CN=Private Root CA 01,O=Private Lab  CN=Private Root CA 01  2023-03-21 08:42:03  2043-03-16 08:42:03  No             N/A
Certificates:
Name         Type    Subject CN     Issuer CN              Issued               Expiry               Revoked    Private Key    CA Present
-----------  ------  -------------  ---------------------  -------------------  -------------------  ---------  -------------  ----------------
server_cert  Server  CN=vpn.vm.lab  CN=Private Root CA 01  2023-04-06 17:16:08  2025-04-05 17:16:08  No         Yes            Yes (private_ca)
Certificate Revocation Lists:
CA Name    Updated    Revokes
---------  ---------  ---------

SSTP の設定を投入する。

[edit]
# edit vpn sstp

[edit vpn sstp]
# set authentication local-users username user-01 password password123
# set authentication protocols mschap-v2
# set client-ip-pool subnet 192.168.0.224/28
# set gateway-address 192.168.0.254
# set ssl ca-certificate private_ca
# set ssl certificate server_cert
# commit

以下、全体の設定表示

interfaces {
    ethernet eth0 {
        address 10.0.0.254/24
    }
    ethernet eth1 {
        address 192.168.0.254/24
        ip {
            enable-proxy-arp
        }
    }
}
nat {
    source {
        rule 1 {
            outbound-interface eth0
            source {
                address 192.168.0.0/24
            }
            translation {
                address masquerade
            }
        }
    }
}
pki {
     ca private_ca {
         certificate MIIFVzCCAz+gAwIBA... (略)
     }
     certificate server_cert {
         certificate MIIFKDCCAxCgAwIBA... (略)
         private {
             key ****************
         }
     }
}
vpn {
     sstp {
         authentication {
             local-users {
                 username user-01 {
                     password password123
                 }
             }
             protocols mschap-v2
         }
         client-ip-pool {
             subnet 192.168.0.224/28
         }
         gateway-address 192.168.0.254
         ssl {
             ca-certificate private_ca
             certificate server_cert
         }
     }
}

Windows 端末にプライベート認証局 (CA) をインポート

サーバ証明書がプライベート認証局 (CA) で発行された証明書であるため、VPN 接続する際に表示されるサーバ証明書が信頼されず、接続ができない。そのため、これを信頼されたルート証明書として Windows 端末にインポートする。

インポートは保存したファイルの拡張子が【crt, cer】であればダブルクリックから
「Install Certificate > Local Machine > Place all certificates in the following store」で「Trusted Root Certification Authorities」を選択して実施する。(要管理者権限)

●プライベート認証局 (CA) の証明書
# cat /etc/pki/CA/cacert.pem
-----BEGIN CERTIFICATE-----
MIIFVzCCAz+gAwIBAgIUSpcJwCZLr63cNvarTmy7ZjyNGiAwDQYJKoZIhvcNAQEL
BQAwMzEUMBIGA1UECgwLUHJpdmF0ZSBMYWIxGzAZBgNVBAMMElByaXZhdGUgUm9v
... (略)
llUXDuicIGRSPdqKO8eiA9ULh4mdgiYxAEvJ
-----END CERTIFICATE-----

上記のファイルの拡張子を【crt】に変更して Windows 端末に保存し、ダブルクリックでインポートを実施する。
ファイル名: cacert.crt

> certlm
※ Trusted Root Certification Authorities に該当のプライベート認証局 (CA) の証明書がインポートされたことを確認する。

また、DNS の名前解決ができない場合は、必要に応じて【hosts】ファイルを編集する。(要管理者権限)

> Set-Location "C:\WINDOWS\System32\drivers\etc"
> Write-Output "10.0.0.254  vpn.vm.lab" | Add-Content hosts -Encoding Default
> type hosts

Windows 10 の VPN クライアント設定

Windows の設定から以下の VPN 接続を追加する。

接続プロバイダーWindows (ビルトイン)
サーバ名またはアドレスvpn.vm.lab
VPN の種類Secure Socket Tunneling Protocol (SSTP)
サインイン情報の種類ユーザ名とパスワード
VPN の接続設定

VPN の接続を作成後、ネットワークアダプタが追加されているため、プロパティから設定を変更する。

セキュリティタブ認証●次のプロトコルを許可する
☑Microsoft CHAP Version 2 (MS-CHAP v2)
ネットワークタブインターネット プロトコル
バージョン 4
詳細設定
☐リモートネットワークでデフォルトゲートウェイを使う ※チェックを外す
ネットワークアダプタの設定

【参考URL】
OpenSSL 3.0のTLS証明書用プライベート鍵生成方法
RSA秘密鍵について
PKI — VyOS 1.4.x (sagitta) documentation