【Cisco IOS】OpenConnect (AnyConnect互換) を使用した SSL/TLS VPN リモートアクセス (クライアント証明書認証)

接続構成

Windows 端末から NAT 配下のサーバにアクセスするため、SSL/TLS VPN の Cisco AnyConnect 互換ソフトウェアの OpenConnect-GUI VPN Client を用いて同一の LAN セグメントに接続する。また、スプリットトンネルを使用して Cisco IOS Router 配下のその他の LAN セグメントに対する疎通を可能にする。(OpenConnect-GUI VPN Client によるルーティング追加)その他のインターネット通信は Windows 端末の既存 GW 経由での通信となる。

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

VPN 接続時の認証はクライアント証明書認証とし、 CRL によるクライアント証明書の失効を可能にする。 CRL 配布ポイントの Web サーバは Apache にて実装する。

【OpenConnect-GUI VPN Client のダウンロード】

接続端末Windows 10
SSL/TLS VPN ClientOpenConnect-GUI VPN Client (AnyConnect互換)
スプリットトンネル192.168.0.0/24
192.168.10.0/24
192.168.20.0/24
CAプライベート認証局 (CA)
サーバ証明書プライベート CA で署名されたサーバ証明書
サーバ証明書の秘密鍵RSA 2048bit (PKCS#1 3DES)
認証方式クライアント証明書認証 (CRL 確認)
Web サーバApache HTTP Server
接続要件

OpenSSL の使用環境

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

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

証明書の発行

CA 証明書

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

プライベート認証局 (CA) の証明書発行は【プライベート認証局 (CA) の構築 (OpenSSL)】 を参照。

サーバ 証明書

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

サーバ証明書の発行は【【Cisco IOS Router】OpenConnect (AnyConnect互換) を使用した SSL/TLS VPN リモートアクセス (User/Password 認証)】を参照。

クライアント証明書

ファイルの形式PKCS#12 (サーバ証明書、秘密鍵を含む)
有効期限約1年 (365日)
RSA 暗号の鍵長2,048bit (約617桁 log2 x 2048)
秘密鍵のフォーマットPKCS#8 (OpenSSL 3 系の標準)
秘密鍵の暗号化なし (PKCS#12 による暗号化)
サブジェクト DNCN=client01 (接続ユーザ名として使用)
シリアル番号自動生成
シリアル番号情報ファイル/etc/pki/CA/serial
X.509 エンコーディング形式PEM (Base64)
X.509v3 拡張設定ファイルclient01_ext.txt
基本制約重要【critical】
CA:FALSE
鍵用途重要【critical】
digitalSignature, keyEncipherment, keyAgreement
拡張鍵用途clientAuth
証明書失効リスト (CRL)URI:http://crl.vm.lab/revoke.crl
CRL エンコーディング形式DER
クライアント証明書

上記のクライアント証明書用の RSA キーペア(秘密鍵)を生成する。

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

# openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out ./private/client01_pkcs8.pem
.........+++++
..................................................................................+++++

# cat ./private/client01_pkcs8.pem   (PKCS#8 形式の秘密鍵)
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG... (略)
-----END PRIVATE KEY-----

# openssl asn1parse -i -in ./private/client01_pkcs8.pem
    0:d=0  hl=4 l=1212 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=1190 prim:  OCTET STRING      [HEX DUMP]:308204A2020... (略)

クライアント証明書に応じた個別設定の X.509v3 拡張設定ファイルを作成する。 CRL ファイルの配布先となる Web サーバを URI で指定する。

# vi ./client01_ext.txt

================================ client01_ext.txt ===============================
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment, keyAgreement
extendedKeyUsage = clientAuth
crlDistributionPoints = URI:http://crl.vm.lab/revoke.crl
==============================================================================

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

# openssl req -new -key ./private/client01_pkcs8.pem -out client01_csr.pem -subj "/CN=client01"

# openssl req -text -in client_csr.pem
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: CN = client01
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:a9:87:2b:64:65:8f... (略)
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         91:92:dc:e2:ea:1c:3d:b9... (略)
-----BEGIN CERTIFICATE REQUEST-----
MIICWDCCAUACAQAwEzERMA8G... (略)
-----END CERTIFICATE REQUEST-----

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

# openssl ca -create_serial -days 365 -in client01_csr.pem -extfile client01_ext.txt -out client01_crt.pem
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:b0:0e
        Validity
            Not Before: May 20 11:28:49 2023 GMT
            Not After : May 19 11:28:49 2024 GMT
        Subject:
            commonName                = client01
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment, Key Agreement
            X509v3 Extended Key Usage:
                TLS Web Client Authentication
            X509v3 CRL Distribution Points:

                Full Name:
                  URI:http://crl.vm.lab/revoke.crl
Certificate is to be certified until May 19 11:28:49 2024 GMT (365 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:b0:0e
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: O=Private Lab, CN=Private Root CA 01
        Validity
            Not Before: May 20 11:28:49 2023 GMT
            Not After : May 19 11:28:49 2024 GMT
        Subject: CN=client01
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:a9:87:2b:64:65:8f... (略)
                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 Client Authentication
            X509v3 CRL Distribution Points:

                Full Name:
                  URI:http://crl.vm.lab/revoke.crl
    Signature Algorithm: sha256WithRSAEncryption
         a8:a5:df:52:53:40:a8:cd:05... (略)
-----BEGIN CERTIFICATE-----
MIIEODCCAiCgAwIBAgIUBCW9MV... (略)
-----END CERTIFICATE-----
Data Base Updated

OpenConnect-GUI VPN Client で使用するために、クライアント証明書、RSA秘密鍵を統合して PKCS#12 形式に変換 (パスワード設定必要) し、 SCP等で Windows 端末にダウンロードする。また、プライベート認証局の CA 証明書は別途 PEM 形式のテキストで Windows 端末にインポートする。

※ PKCS#12 形式に変換
# openssl pkcs12 -export -in client01_crt.pem -inkey ./private/client01_pkcs8.pem -out client01.p12
Enter Export Password: ******
Verifying - Enter Export Password: ******

# openssl pkcs12 -info -in client01.p12
Enter Import Password: ******
MAC: sha1, Iteration 2048
MAC length: 20, salt length: 8
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
Bag Attributes
    localKeyID: A6 D6 A1 ED CB 30 C8 F2 14 F1 74 01 52 37 A4 38 F5 50 42 CD
subject=CN = client01

issuer=O = Private Lab, CN = Private Root CA 01

-----BEGIN CERTIFICATE-----
MIIEODCCAiCgAwIBAgIUBC... (略)
-----END CERTIFICATE-----
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
Bag Attributes
    localKeyID: A6 D6 A1 ED CB 30 C8 F2 14 F1 74 01 52 37 A4 38 F5 50 42 CD
Key Attributes: <No Attributes>
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFHDBOBgkqhkiG9w0BB... (略)
-----END ENCRYPTED PRIVATE KEY-----

証明書失効リスト (CRL) ファイルの作成 (失効前)

発行したクライアント証明書用の CRL ファイルを作成する。 CRL ファイルが Web サーバに存在しない場合、クライアント証明書の認証時に失敗する (CRL 確認が有効の場合)。
※ Cisco IOS からの CRL 確認では DER フォーマットが必須であることに注意

# openssl ca -gencrl -out ./revoke_pem.crl
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem: [CA 秘密鍵のパスフレーズ]

# cat ./revoke_pem.crl
-----BEGIN X509 CRL-----
MIICtTCBngIBATAN... (略)
-----END X509 CRL-----


※ DER フォーマットに変換する
# openssl crl -in revoke_pem.crl -out revoke_der.crl -outform der

# openssl crl -text -in revoke_der.crl -inform der
Certificate Revocation List (CRL):
        Version 2 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: O = Private Lab, CN = Private Root CA 01
        Last Update: May 20 11:49:10 2023 GMT
        Next Update: Jun 19 11:49:10 2023 GMT
        CRL extensions:
            X509v3 CRL Number:
                4
Revoked Certificates:
    Serial Number: 0425BD3151C7C85B860DD2E192648B1FA5DCAFFC
        Revocation Date: Mar 21 15:51:00 2023 GMT
    Signature Algorithm: sha256WithRSAEncryption
         76:49:c7:36:... (略)
-----BEGIN X509 CRL-----
MIICtTCBngIBATANBgkqh... (略)
-----END X509 CRL-----

作成した CRL ファイルはクライアント証明書の【CRL Distribution Points】である URI と一致させる必要がある。そのため、対象の Web サーバのパスに CRL ファイルを配備する。

# cp revoke_der.crl /var/www/html/revoke.crl
# ll /var/www/html/
total 4
-rw-r--r--. 1 root root 1246 May 20 21:36 revoke.crl

# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2023-05-20 20:49:39 JST; 5h 20min ago
     Docs: man:httpd.service(8)
  Process: 2276 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
 Main PID: 1497 (httpd)
   Status: "Total requests: 14; Idle/Busy workers 100/0;Requests/sec: 0.000729; Bytes served/sec:   2 B/sec"
    Tasks: 213 (limit: 5701)
   Memory: 30.9M
   CGroup: /system.slice/httpd.service
           ├─1497 /usr/sbin/httpd -DFOREGROUND
           ├─2279 /usr/sbin/httpd -DFOREGROUND
           ├─2280 /usr/sbin/httpd -DFOREGROUND
           ├─2281 /usr/sbin/httpd -DFOREGROUND
           └─2282 /usr/sbin/httpd -DFOREGROUND
CA 証明書【cacert.pem】
サーバ証明書【cisco_crt.pem】
RSA 秘密鍵 (サーバ証明書用)【cisco_pkcs1_3des.pem】
RSA 公開鍵 (サーバ証明書用)【cisco_pubkey.pem】
クライアント証明書【client01.p12】
CRL ファイル (フルパス)【/var/www/html/revoke.crl】
各種ファイル

Cisco IOS (15 系) のコンフィグ例

Cisco IOS に RSA 公開鍵・秘密鍵のインポート (terminal 入力)

Cisco IOS Router にRSA 公開鍵・秘密鍵をインポートする。インポートの手順は【Cisco IOS に RSA 公開鍵・秘密鍵のインポート (terminal 入力)】を参照。

Cisco IOS に CA 証明書、サーバ証明書のインポート (terminal 入力)

初めにトラストポイントを定義し、先ほどインポートした RSA キーペアを指定する。この時、 CRL のチェックを有効にし、クライアント証明書のサブジェクトフィールドのコモンネームをユーザー名として使用できるように設定する。
その後 CA の証明書をインポートし、続けてサーバ証明書をインポートする。

Router(config)# crypto pki trustpoint private_ca
Router(ca-trustpoint)# enrollment terminal
Router(ca-trustpoint)# revocation-check crl
Router(ca-trustpoint)# rsakeypair RSA_CISCO
Router(ca-trustpoint)# authorization username subjectname commonname
Router(ca-trustpoint)# exit
Router(config)# crypto pki authenticate private_ca

Enter the base 64 encoded CA certificate.
End with a blank line or the word "quit" on a line by itself

-----BEGIN CERTIFICATE-----
MIIFVzCCAz+gAwIBAgIUSpcJwCZL... (略) CA 証明書【cacert.pem】
-----END CERTIFICATE-----
quit
Certificate has the following attributes:
       Fingerprint MD5: 3C4F7B0D 4AEA3B2D C247F350 C3B4BDD6
      Fingerprint SHA1: A152B6D6 CBA1396D 94357610 23EBFB49 01AEC49B

% Do you accept this certificate? [yes/no]: yes
Trustpoint CA certificate accepted.
% Certificate successfully imported


Router(config)#do show crypto pki certificates verbose
CA Certificate
  Status: Available
  Version: 3
  Certificate Serial Number (hex): 4A9709C0264BAFADDC36F6AB4E6CBB663C8D1A20
  Certificate Usage: Signature
  Issuer:
    cn=Private Root CA 01
    o=Private Lab
  Subject:
    cn=Private Root CA 01
    o=Private Lab
  Validity Date:
    start date: 17:42:03 JST Mar 21 2023
    end   date: 11:13:47 JST Feb 8 1907
  Subject Key Info:
    Public Key Algorithm: rsaEncryption
    RSA Public Key: (4096 bit)
  Signature Algorithm: SHA256 with RSA Encryption
  Fingerprint MD5: 3C4F7B0D 4AEA3B2D C247F350 C3B4BDD6
  Fingerprint SHA1: A152B6D6 CBA1396D 94357610 23EBFB49 01AEC49B
  X509v3 extensions:
    X509v3 Key Usage: 6000000
      Key Cert Sign
      CRL Signature
    X509v3 Subject Key ID: 4DA08A4C 5B7C4736 142673CB E697D689 74DE0514
    X509v3 Basic Constraints:
        CA: TRUE
    X509v3 Authority Key ID: 4DA08A4C 5B7C4736 142673CB E697D689 74DE0514
    Authority Info Access:
  Associated Trustpoints: private_ca


Router(config)# do show crypt key pubkey-chain rsa
Codes: M - Manually configured, C - Extracted from certificate

Code Usage         IP-Address/VRF         Keyring          Name
C    Signing                              default          cn=Private Root CA 01,o=Private Lab

Router(config)# do show crypt key pubkey-chain rsa name "cn=Private Root CA 01,o=Private Lab"
 Key name: cn=Private Root CA 01,o=Private Lab
 Subject name(X.500 DN name): cn=Private Root CA 01
 o=Private Lab
 Key id: 16
 Serial number: 4A9709C0264BAFADDC36F6AB4E6CBB663C8D1A20
 Usage: Signature Key
 Source: Certificate
 Data:
  30820222 300D0609 2A864886 ... (略)


Router(config)# crypto pki import private_ca certificate

Enter the base 64 encoded certificate.
End with a blank line or the word "quit" on a line by itself

-----BEGIN CERTIFICATE-----
MIIELDCCAhSgAwIBAgIUBCW9MVH... (略) サーバ証明書【cisco_crt.pem】
-----END CERTIFICATE-----

% Router Certificate successfully imported

Cisco IOS の SSL VPN 設定 (クライアント証明書認証)

SSL-VPN の設定を投入する。 VPN 接続時の認証はルータにインポートした CA にてクライアント証明書の認証を行う。また、この時に CRL によりクライアント証明書の失効状態を確認する。そのため、Cisco IOS Router から CRL に記載の FQDN を名前解決できる必要がある。
※【no ip domain lookup】の設定をしている場合はスタティックでAレコードを指定する。
以下は主に関連する設定を抜粋。

Router(config)# no ip domain lookup
Router(config)# ip host crl.vm.lab 10.0.0.100

Router(config)# interface Loopback0
Router(config-if)# ip address 10.10.0.1 255.255.255.255
Router(config-if)# exit

Router(config)# interface Virtual-Template1
Router(config-if)# ip unnumbered Loopback0
Router(config-if)# exit

Router(config)# ip local pool SSLVPN_POOL 192.168.0.224 192.168.0.239
Router(config)# access-list 10 permit 192.168.10.0 0.0.0.255
Router(config)# access-list 10 permit 192.168.20.0 0.0.0.255

Router(config)# webvpn gateway SSLVPN_GW
Router(config-webvpn-gateway)# ip address 10.0.0.254 port 443
Router(config-webvpn-gateway)# ssl trustpoint private_ca
Router(config-webvpn-gateway)# inservice
Router(config-webvpn-gateway)# exit

Router(config)# webvpn context SSLVPN_CONTEXT
Router(config-webvpn-context)# virtual-template 1
Router(config-webvpn-context)# gateway SSLVPN_GW
Router(config-webvpn-context)# authentication certificate
Router(config-webvpn-context)# ca trustpoint private_ca
Router(config-webvpn-context)# ssl authenticate verify all
Router(config-webvpn-context)# inservice
Router(config-webvpn-context)#
Router(config-webvpn-context)# policy group SSLVPN_POLICY
Router(config-webvpn-group)# functions svc-enabled
Router(config-webvpn-group)# timeout idle 7200
Router(config-webvpn-group)# svc address-pool "SSLVPN_POOL" netmask 255.255.255.0
Router(config-webvpn-group)# svc split include acl 10
Router(config-webvpn-group)# default-group-policy SSLVPN_POLICY
Router(config-webvpn-context)# exit

以下、全体の設定表示(抜粋)

crypto pki trustpoint private_ca
 enrollment terminal
 revocation-check crl
 rsakeypair RSA_CISCO
 authorization username subjectname commonname
!
crypto pki certificate chain private_ca
 certificate 0425BD3151C7C85B860DD2E192648B1FA5DCB007
  3082042C 30820214 A0030201 ... (略)
        quit
 certificate ca 4A9709C0264BAFADDC36F6AB4E6CBB663C8D1A20
  30820557 3082033F A0030201 ... (略)
        quit
!
no ip domain lookup
ip host crl.vm.lab 10.0.0.100
!
vlan 10,20,30,100
!
interface Loopback0
 ip address 10.10.0.1 255.255.255.255
!
interface FastEthernet0
 description WAN
 switchport access vlan 100
 no ip address
!
interface FastEthernet1
 description LAN
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 10,20,30
 switchport mode trunk
 no ip address
!
interface Virtual-Template1
 ip unnumbered Loopback0
!
interface Vlan10
 ip address 192.168.0.254 255.255.255.0
 ip nat inside
 ip virtual-reassembly in
!
interface Vlan20
 ip address 192.168.10.254 255.255.255.0
 ip nat inside
 ip virtual-reassembly in
!
interface Vlan30
 ip address 192.168.20.254 255.255.255.0
 ip nat inside
 ip virtual-reassembly in
!
interface Vlan100
 ip address 10.0.0.254 255.255.255.0
 ip nat outside
 ip virtual-reassembly in
 ip ospf priority 10
 ip ospf 1 area 0.0.0.0
!
router ospf 1
!
ip local pool SSLVPN_POOL 192.168.0.224 192.168.0.239
no ip http secure-server
!
ip nat inside source list 1 interface Vlan100 overload
access-list 1 permit 192.168.0.0 0.0.31.255
access-list 10 permit 192.168.10.0 0.0.0.255
access-list 10 permit 192.168.20.0 0.0.0.255

webvpn gateway SSLVPN_GW
 ip address 10.0.0.254 port 443
 ssl trustpoint private_ca
 inservice
!
webvpn context SSLVPN_CONTEXT
 virtual-template 1
 gateway SSLVPN_GW
 authentication certificate
 ca trustpoint private_ca
 !
 ssl authenticate verify all
 inservice
 !
 policy group SSLVPN_POLICY
   functions svc-enabled
   timeout idle 7200
   svc address-pool "SSLVPN_POOL" netmask 255.255.255.0
   svc split include acl 10
 default-group-policy SSLVPN_POLICY
!
end

Windows 端末からの SSL/TLS VPN 接続 (クライアント証明書認証)

VPN 接続先の名前解決ができること。できない場合は、 hosts ファイルを編集する。

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

サーバ証明書がプライベート認証局 (CA) で発行された証明書であるため、VPN 接続する際に表示されるサーバ証明書が信頼されず、警告が表示される。そのため、 CA の証明書を信頼されたルート証明書としてインポートする。
設定方法は【Windows 端末にプライベート認証局 (CA) をインポート】を参照

OpenConnect-GUI VPN Client の接続

OpenConnect-GUI VPN Client を起動し、【New profile (advanced)】を選択する。以下のように適切に入力し【Save】する。 User Certificate のインポートの際にパスワードの入力が必要。

Gatewayhttps://cisco.vm.lab/
VPN protocolCisco AnyConnect
User Certificateclient01.p12
OpenConnect-GUI VPN Client の設定

接続を実施し、正常に繋がることを確認する。デバッグにて CRL の確認をしていることが確認できる。

Router#show webvpn session context all
WebVPN context name: SSLVPN_CONTEXT
Client_Login_Name  Client_IP_Address  No_of_Connections  Created  Last_Used
client01           10.0.0.1                   1         00:00:38  00:00:06


Router#show webvpn session user client01 context all
Session Type      : Full Tunnel
Client User-Agent : OpenConnect-GUI 1.5.3 v7.08

Username          : client01             Num Connection : 1
Public IP         : 10.0.0.1             VRF Name       : None                 CA Trustpoint  : private_ca
Context           : SSLVPN_CONTEXT       Policy Group   :
Last-Used         : 00:00:07             Created        : 02:41:14.744 JST Sun May 21 2023
Session Timeout   : Disabled             Idle Timeout   : 7200
DPD GW Timeout    : 300                  DPD CL Timeout : 300
Address Pool      : SSLVPN_POOL          MTU Size       : 1312
Rekey Time        : 3600                 Rekey Method   :
Lease Duration    : 43200
Tunnel IP         : 192.168.0.232        Netmask        : 255.255.255.0
Rx IP Packets     : 0                    Tx IP Packets  : 40
CSTP Started      : 00:01:11             Last-Received  : 00:00:07
CSTP DPD-Req sent : 0                    Virtual Access : 2
Msie-ProxyServer  : None                 Msie-PxyPolicy : Disabled
Msie-Exception    :
Split Include     : ACL 10
Client Ports      : 65201


Router# debug crypto pki transactions
Crypto PKI Trans debugging is on

May 21 2023 02:54:02 JST: CRYPTO_PKI: (A002C) Session started - identity not specified
May 21 2023 02:54:02 JST: CRYPTO_PKI: Added x509 peer certificate - (1084) bytes
May 21 2023 02:54:02 JST: CRYPTO_PKI: create new ca_req_context type PKI_VERIFY_CHAIN_CONTEXT,ident 42
May 21 2023 02:54:02 JST: CRYPTO_PKI: (A002C)validation path has 1 certs

May 21 2023 02:54:02 JST: CRYPTO_PKI: Found a issuer match
May 21 2023 02:54:02 JST: CRYPTO_PKI: (A002C) Using private_ca to validate certificate
May 21 2023 02:54:02 JST: CRYPTO_PKI: Added 1 certs to trusted chain.
May 21 2023 02:54:02 JST: CRYPTO_PKI: Prepare session revocation service providers
May 21 2023 02:54:02 JST: ../VIEW_ROOT/cisco.comp/pki_ssl/src/ca/provider/path/pkix/pkixpath.c(5781) : E_PATH_PROVIDER : path provider specific warning (BasicConstraints extension found in end entity cert)
May 21 2023 02:54:02 JST:  CRYPTO_PKI: Deleting cached key having key id 52
May 21 2023 02:54:02 JST:  CRYPTO_PKI: Attempting to insert the peer's public key into cache
May 21 2023 02:54:02 JST:  CRYPTO_PKI:Peer's public inserted successfully with key id 53
May 21 2023 02:54:02 JST:  CRYPTO_PKI: Expiring peer's cached key with key id 53
May 21 2023 02:54:02 JST: CRYPTO_PKI: (A002C) Starting CRL revocation check
May 21 2023 02:54:02 JST:  CRYPTO_PKI: Deleting cached key having key id 53
May 21 2023 02:54:02 JST:  CRYPTO_PKI: Attempting to insert the peer's public key into cache
May 21 2023 02:54:02 JST:  CRYPTO_PKI:Peer's public inserted successfully with key id 54
May 21 2023 02:54:02 JST:  CRYPTO_PKI: Expiring peer's cached key with key id 54
May 21 2023 02:54:02 JST: CRYPTO_PKI: Revocation check is complete, 0
May 21 2023 02:54:02 JST: CRYPTO_PKI: Revocation status = 0
May 21 2023 02:54:02 JST: CRYPTO_PKI: Remove session revocation service providers
May 21 2023 02:54:02 JST: CRYPTO_PKI: Remove session revocation service providers
May 21 2023 02:54:02 JST: CRYPTO_PKI: (A002C) Certificate validated
May 21 2023 02:54:02 JST: CRYPTO_PKI: Populate AAA auth data
May 21 2023 02:54:02 JST: CRYPTO_PKI: Selected AAA username: 'client01'
May 21 2023 02:54:02 JST: CRYPTO_PKI: (A002C)chain cert was anchored to trustpoint private_ca, and chain validation result was: CRYPTO_VALID_CERT
May 21 2023 02:54:02 JST: CRYPTO_PKI: locked trustpoint private_ca, refcount is 1
May 21 2023 02:54:02 JST: CRYPTO_PKI: (A002C) Validation TP is private_ca
May 21 2023 02:54:02 JST: CRYPTO_PKI: Rcvd request to end PKI session A002C.
May 21 2023 02:54:02 JST: CRYPTO_PKI: PKI session A002C has ended. Freeing all resources.
May 21 2023 02:54:02 JST: CRYPTO_PKI: unlocked trustpoint private_ca, refcount is 0

クライアント証明書の失効

ユーザからの接続を拒否するため、クライアント証明書を失効させる。

証明書失効リスト (CRL) ファイルの作成 (失効時)

発行したクライアント証明書を失効させる。この時、対象の証明書ファイルを指定する。失効後に CRL ファイルを生成する。

# cd /etc/pki/CA
# echo '00' > ./crlnumber    ※未作成の場合

# openssl ca -revoke ./newcerts/0425BD3151C7C85B860DD2E192648B1FA5DCB00E.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem: [CA 秘密鍵のパスフレーズ]
Revoking Certificate 0425BD3151C7C85B860DD2E192648B1FA5DCB00E.
Data Base Updated

# grep 0425BD3151C7C85B860DD2E192648B1FA5DCB00E index.txt
R	240519112849Z	230520180605Z	0425BD3151C7C85B860DD2E192648B1FA5DCB00E	unknown	/CN=client01

対象のクライアント証明書を失効させたため、証明書失効リスト (CRL) を生成する。

# openssl ca -gencrl -out ./revoke_pem.crl
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem: [CA 秘密鍵のパスフレーズ]

# openssl crl -in revoke_pem.crl -out revoke_der.crl -outform der
# cp revoke_der.crl /var/www/html/revoke.crl
cp: overwrite '/var/www/html/revoke.crl'? y

# openssl crl -text -in revoke_der.crl -inform der | grep -A3 0425BD3151C7C85B860DD2E192648B1FA5DCB00E
    Serial Number: 0425BD3151C7C85B860DD2E192648B1FA5DCB00E
        Revocation Date: May 20 18:06:05 2023 GMT
    Signature Algorithm: sha256WithRSAEncryption
         0b:9a:3a:e4:84:f9:f7:2b:24:48:19:c7:6a:e9:dd:61:55:bf:


※失効前
# openssl verify -crl_check -CAfile ./cacert.pem -CRLfile ./revoke_pem.crl  ./newcerts/0425BD3151C7C85B860DD2E192648B1FA5DCB00E.pem
./newcerts/0425BD3151C7C85B860DD2E192648B1FA5DCB00E.pem: OK

※失効後
# openssl verify -crl_check -CAfile ./cacert.pem -CRLfile ./revoke_pem.crl  ./newcerts/0425BD3151C7C85B860DD2E192648B1FA5DCB00E.pem
CN = client01
error 23 at 0 depth lookup: certificate revoked
error ./newcerts/0425BD3151C7C85B860DD2E192648B1FA5DCB00E.pem: verification failed

クライアント証明書失効後の接続

CRL ファイルを Web サーバにアップした後に接続しても、Cisco IOS Router がキャッシュしているため、接続できてしまう。そのため、キャッシュをクリアすることで再度 CRL ファイルがダウンロードされて反映される。デバッグログよりクライアント証明書が失効していることを確認できる。
【%PKI-3-CERTIFICATE_REVOKED: Certificate chain validation has failed. The certificate (SN: 0425BD3151C7C85B860DD2E192648B1FA5DCB00E) is revoked】

Router#show crypto pki crls
CRL Issuer Name:
    cn=Private Root CA 01,o=Private Lab
    LastUpdate: 20:49:10 JST May 20 2023
    NextUpdate: 20:49:10 JST Jun 19 2023
    Retrieved from CRL Distribution Point:
 CRL DER is 1246 bytes
 CRL is stored in parsed CRL cache


Parsed CRL cache current size is 1246 bytes
Parsed CRL cache maximum size is 65536 bytes

Router#clear crypto pki crl
May 21 2023 03:29:22 JST: CRYPTO_PKI: Clearing CRLs and cached pubkeys


Router#
May 21 2023 03:29:28 JST: CRYPTO_PKI: (A0035) Session started - identity not specified
May 21 2023 03:29:28 JST: CRYPTO_PKI: Added x509 peer certificate - (1084) bytes
May 21 2023 03:29:28 JST: CRYPTO_PKI: create new ca_req_context type PKI_VERIFY_CHAIN_CONTEXT,ident 48
May 21 2023 03:29:28 JST: CRYPTO_PKI: (A0035)validation path has 1 certs

May 21 2023 03:29:28 JST: CRYPTO_PKI: Found a issuer match
May 21 2023 03:29:28 JST: CRYPTO_PKI: (A0035) Using private_ca to validate certificate
May 21 2023 03:29:28 JST: CRYPTO_PKI: Added 1 certs to trusted chain.
May 21 2023 03:29:28 JST: CRYPTO_PKI: Prepare session revocation service providers
May 21 2023 03:29:28 JST: ../VIEW_ROOT/cisco.comp/pki_ssl/src/ca/provider/path/pkix/pkixpath.c(5781) : E_PATH_PROVIDER : path provider specific warning (BasicConstraints extension found in end entity cert)
May 21 2023 03:29:28 JST:  CRYPTO_PKI: Deleting cached key having key id 64
May 21 2023 03:29:28 JST:  CRYPTO_PKI: Attempting to insert the peer's public key into cache
May 21 2023 03:29:28 JST:  CRYPTO_PKI:Peer's public inserted successfully with key id 65
May 21 2023 03:29:28 JST:  CRYPTO_PKI: Expiring peer's cached key with key id 65
May 21 2023 03:29:28 JST: CRYPTO_PKI: (A0035) Starting CRL revocation check
May 21 2023 03:29:28 JST: CRYPTO_PKI: create new ca_req_context type PKI_POLL_CRL_CONTEXT,ident 49
May 21 2023 03:29:28 JST: CRYPTO_PKI: (A0035)Retreive CRL using HTTP URI
May 21 2023 03:29:28 JST: CRYPTO_PKI: Revocation check is complete, 0
May 21 2023 03:29:28 JST: CRYPTO_PKI: Revocation status = 3
May 21 2023 03:29:28 JST: CRYPTO_PKI: status = 0: poll CRL
May 21 2023 03:29:28 JST: CRYPTO_PKI: Remove session revocation service providers
May 21 2023 03:29:28 JST: CRYPTO_PKI: Bypassing SCEP capabilities request 0
May 21 2023 03:29:28 JST: CRYPTO_PKI: (A0035) Requesting CRL at http://crl.vm.lab/revoke.crl:

May 21 2023 03:29:28 JST: CRYPTO_PKI: (A0035) Fetch 0

May 21 2023 03:29:28 JST: CRYPTO_PKI: locked trustpoint private_ca, refcount is 1
May 21 2023 03:29:28 JST: CRYPTO_PKI: http connection opened
May 21 2023 03:29:28 JST: CRYPTO_PKI: Sending HTTP message

May 21 2023 03:29:28 JST: CRYPTO_PKI: Reply HTTP header:
HTTP/1.0
Host: crl.vm.lab


May 21 2023 03:29:28 JST: CRYPTO_PKI: unlocked trustpoint private_ca, refcount is 0
May 21 2023 03:29:28 JST: CRYPTO_PKI: Send HTTP header:
GET /revoke.crl HTTP/1.0
Host: crl.vm.lab


May 21 2023 03:29:28 JST: CRYPTO_PKI: locked trustpoint private_ca, refcount is 1
May 21 2023 03:29:28 JST: CRYPTO_PKI: unlocked trustpoint private_ca, refcount is 0
May 21 2023 03:29:28 JST: CRYPTO_PKI: Reply HTTP header:
HTTP/1.1 200 OK
Date: Sat, 20 May 2023 18:29:28 GMT
Server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k
Last-Modified: Sat, 20 May 2023 18:28:21 GMT
ETag: "505-5fc2433d1cc94"
Accept-Ranges: bytes
Content-Length: 1285
Connection: close
Content-Type: application/pkix-crl


May 21 2023 03:29:28 JST: CRYPTO_PKI: HTTP header content length is 1285 bytes
May 21 2023 03:29:28 JST:  CRYPTO_PKI: Deleting cached key having key id 65
May 21 2023 03:29:28 JST:  CRYPTO_PKI: Attempting to insert the peer's public key into cache
May 21 2023 03:29:28 JST:  CRYPTO_PKI:Peer's public inserted successfully with key id 66
May 21 2023 03:29:28 JST:  CRYPTO_PKI: Expiring peer's cached key with key id 66
May 21 2023 03:29:28 JST: CRYPTO_PKI: set CRL update timer with delay: 2590803
May 21 2023 03:29:28 JST: CRYPTO_PKI: the current router time: 03:29:28 JST May 21 2023

May 21 2023 03:29:28 JST: CRYPTO_PKI: the last CRL update time: 03:09:31 JST May 21 2023
May 21 2023 03:29:28 JST: CRYPTO_PKI: the next CRL update time: 03:09:31 JST Jun 20 2023
May 21 2023 03:29:28 JST: CRYPTO_PKI: transaction Unknown completed
May 21 2023 03:29:28 JST: CRYPTO_PKI: status = 105: Blocking chain verification callback received status
May 21 2023 03:29:28 JST: CRYPTO_PKI: (A0035) Using private_ca to validate certificate
May 21 2023 03:29:28 JST: CRYPTO_PKI: Prepare session revocation service providers
May 21 2023 03:29:28 JST: CRYPTO_PKI: (A0035) Starting CRL revocation check
May 21 2023 03:29:28 JST:  CRYPTO_PKI: Deleting cached key having key id 66
May 21 2023 03:29:28 JST:  CRYPTO_PKI: Attempting to insert the peer's public key into cache
May 21 2023 03:29:28 JST:  CRYPTO_PKI:Peer's public inserted successfully with key id 67
May 21 2023 03:29:28 JST:  CRYPTO_PKI: Expiring peer's cached key with key id 67
May 21 2023 03:29:28 JST: ../VIEW_ROOT/cisco.comp/pki_ssl/src/ca/provider/revoke/crl/crlstat.c(206) : E_NOT_VALIDATED : validation process failed (reason: 1)
May 21 2023 03:29:28 JST: CRYPTO_PKI: Revocation check is complete, 0
May 21 2023 03:29:28 JST: CRYPTO_PKI: Revocation status = 1
May 21 2023 03:29:28 JST: CRYPTO_PKI: Remove session revocation service providers
May 21 2023 03:29:28 JST: CRYPTO_PKI: Remove session revocation service providers
May 21 2023 03:29:28 JST: CRYPTO_PKI: (A0035) Certificate revoked
May 21 2023 03:29:28 JST: %PKI-3-CERTIFICATE_REVOKED: Certificate chain validation has failed. The certificate (SN: 0425BD3151C7C85B860DD2E192648B1FA5DCB00E) is revoked
May 21 2023 03:29:28 JST: CRYPTO_PKI: (A0035)chain cert was anchored to trustpoint private_ca, and chain validation result was: CRYPTO_CERT_REVOKED
May 21 2023 03:29:28 JST: CRYPTO_PKI: locked trustpoint private_ca, refcount is 1
May 21 2023 03:29:28 JST: CRYPTO_PKI: Rcvd request to end PKI session A0035.
May 21 2023 03:29:28 JST: CRYPTO_PKI: PKI session A0035 has ended. Freeing all resources.
May 21 2023 03:29:28 JST: CRYPTO_PKI: unlocked trustpoint private_ca, refcount is 0

2段階認証 (クライアント証明書・User/Password)

クライアント証明書の認証に加えて、 User/Password 認証を行うこともできる。この時、 User 名は一致する必要はない。以下の Config を Cisco IOS Router に追記することで、段階認証が有効となる。

aaa authentication login SSLVPN_AAA local
username user01 secret password01
!
webvpn context SSLVPN_CONTEXT
 aaa authentication list SSLVPN_AAA
 authentication certificate aaa

【参考 URL】
Public Key Infrastructure Configuration Guide, Cisco IOS Release 15MT
AnyConnect により、CLIを使用したCisco IOSルータヘッドエンドの基本的なSSL VPNの設定