接続構成
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 Client | OpenConnect-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 |
OS | Red Hat Enterprise Linux 8.7 |
証明書の発行
CA 証明書
秘密鍵のフォーマット | PKCS#1 (OpenSSL 1 系の標準) |
サブジェクト DN | O=Private Lab, CN=Private Root CA 01 |
X.509 エンコーディング形式 | PEM (Base64) |
プライベート認証局 (CA) の証明書発行は【プライベート認証局 (CA) の構築 (OpenSSL)】 を参照。
サーバ 証明書
有効期限 | 約2年 (730日) |
RSA 暗号の鍵長 | 2,048bit (約617桁 log2 x 2048) |
秘密鍵のフォーマット | PKCS#1 (OpenSSL 1 系の標準) |
秘密鍵の暗号化 | 3DES |
サブジェクト DN | CN=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 による暗号化) |
サブジェクト DN | CN=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 のインポートの際にパスワードの入力が必要。
Gateway | https://cisco.vm.lab/ |
VPN protocol | Cisco AnyConnect |
User Certificate | client01.p12 |
接続を実施し、正常に繋がることを確認する。デバッグにて 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の設定