読者です 読者をやめる 読者になる 読者になる

らくがきちょう

なんとなく

ASA の AnyConnect で使う証明書を入れ替える

Cisco ASA で AnyConnect を利用する場合に SSL-VPN 接続先の SSL/TLS サーバ証明書を入れ替える手順についてメモします。証明局は公的なものでは無く、Linux 上に Easy-RSA を使って構築します。

作業の流れ

作業の流れは以下の通りです。

  1. ASA で CSR を発行する
  2. Linux 上の Easy-RSA で証明書を発行する
  3. ASA に証明書をインストールする

ASA で CSR を発行する

まず、ASA で CSR を発行します。最初に RSA 鍵ペアを生成します。鍵の名前(ラベル)は「asa.example.local.key」としました。発行された RSA 鍵は show crypto key mypubkey rsa で確認出来ます。

crypto key generate rsa label asa.example.local.key modulus 2048

鍵が発行出来たら Trustpoint を作成します。CN/FQDN は実際に AnyConnect(SSL-VPN)の接続先となる FQDN と同じものを指定します。今回は「asa.example.local」としました。

crypto ca trustpoint asa.example.local.trustpoint
 subject-name CN=asa.example.local,OU=Sample Dept.,O=Sample K.K.,C=JP,St=Tokyo,L=Chiyoda-Ku
 keypair asa.example.local.key
 fqdn asa.example.local
 enrollment terminal
exit

CSR を発行します。

crypto ca enroll asa.example.local.trustpoint

実行例は以下の通りです。「-----BEGIN CERTIFICATE REQUEST----- 〜 -----END CERTIFICATE REQUEST-----」部分が CSR です。

asa(config)# crypto ca enroll asa.example.local.trustpoint
% Start certificate enrollment ..
% The subject name in the certificate will be: CN=asa.example.local,OU=Sample Dept.,O=Sample K.K.,C=JP,St=Tokyo,L=Chiyoda-Ku

% The fully-qualified domain name in the certificate will be: asa.example.local

% Include the device serial number in the subject name? [yes/no]: no

Display Certificate Request to terminal? [yes/no]: yes
Certificate Request follows:
-----BEGIN CERTIFICATE REQUEST-----
MIIDIjCCAgoCAQAwgZ0xEzARBgNVBAcTCkNoaXlvZGEtS3UxDjAMBgNVBAgTBVRv
    ・
    ・
    ・
MZjAJ1HdibPn0fERgIlZZdo4v6Eu8Hwg2kkvRhc3flZoayYKhC4=
-----END CERTIFICATE REQUEST-----

Redisplay enrollment request? [yes/no]: no

証明局でサーバ証明書を発行する

Linux 上に Easy-RSA で CA 局を構築します。今回は CentOS7 上に構築しましたが、どのディストリビューションでも手順はほぼ変わらないと思います。

curl -L -O https://github.com/OpenVPN/easy-rsa/releases/download/3.0.1/EasyRSA-3.0.1.tgz
tar zxvf EasyRSA-3.0.1.tgz -C /opt/
mv /opt/EasyRSA-3.0.1/ /opt/easy-rsa/
cd /opt/easy-rsa/
./easyrsa init-pki
./easyrsa build-ca

easyrsa build-ca を実行すると秘密鍵用のパスフレーズを求められます。このパスフレーズは無くさないよう、大切に保管します。実行例は以下の通りです。途中で CA 局の名前(Common Name)を求められますが、今回は MyCA としました。

# ./easyrsa init-pki

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /opt/easy-rsa/pki

# ./easyrsa build-ca
Generating a 2048 bit RSA private key
...........+++
...............................................................................................................+++
writing new private key to '/opt/easy-rsa/pki/private/ca.key.ZJCh6LqOZu'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:MyCA

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/opt/easy-rsa/pki/ca.crt

ASA で発行した CSRLinux 上に保存します。CSR は Easy-RSA をインストールしたディレクトリの pki/reqs/ 配下に「.req」という拡張子で保存します。今回は /opt/easy-rsa/pki/reqs/asa.example.local.req という名前で保存しました。ASA で CSR を発行した際、「-----BEGIN CERTIFICATE REQUEST----- 〜 -----END CERTIFICATE REQUEST-----」に表示された部分をそのまま丸ごと、保存します。

vi pki/reqs/asa.example.local.req

CSR を元に SSL/TLS サーバ証明書を発行します。

./easyrsa sign-req server asa.example.local

実行例は以下の通りです。発行した証明書は /opt/easy-rsa/pki/issued/asa.example.local.crt に保存されました。

# ./easyrsa sign-req server asa.example.local


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 3650 days:

subject=
    localityName              = Chiyoda-Ku
    stateOrProvinceName       = Tokyo
    countryName               = JP
    organizationName          = Sample K.K.
    organizationalUnitName    = Sample Dept.
    commonName                = asa.example.local
    unstructuredName          = asa.example.local


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /opt/easy-rsa/openssl-1.0.cnf
Enter pass phrase for /opt/easy-rsa/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
localityName          :PRINTABLE:'Chiyoda-Ku'
stateOrProvinceName   :PRINTABLE:'Tokyo'
countryName           :PRINTABLE:'JP'
organizationName      :PRINTABLE:'Sample K.K.'
organizationalUnitName:PRINTABLE:'Sample Dept.'
commonName            :PRINTABLE:'asa.example.local'
unstructuredName      :IA5STRING:'asa.example.local'
Certificate is to be certified until Jan  6 12:04:15 2027 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /opt/easy-rsa/pki/issued/asa.example.local.crt

Easy-RSA で発行した証明書を ASA にインポートする

最後に Easy-RSA で発行した証明書を ASA にインポートします。crypto ca import で証明書をインポートします。

crypto ca import asa.example.local.trustpoint certificate nointeractive

実行例は以下の通りです。証明書の「-----BEGIN CERTIFICATE----- 〜 -----END CERTIFICATE-----」までをそのまま丸ごと貼り付け、最後に quit と入力します。

asa(config)# crypto ca import asa.example.local.trustpoint certificate nointer$
Enter the certificate in base64 representation....
asa(config-pubkey)# -----BEGIN CERTIFICATE-----
asa(config-pubkey)# MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDEw$
    ・
    ・
    ・
asa(config-pubkey)# mF9BtLM078S/+A==
asa(config-pubkey)# -----END CERTIFICATE-----
asa(config-pubkey)# quit
INFO: Certificate successfully imported

AnyConnect で利用する Trustpoint を変更すれば設定完了です。

ssl trust-point asa.example.local.trustpoint outside

macOS の AnyConnect から接続する

Easy-RSAルート証明書をインポートする

macOS でキーチェーンアクセスを開き、システムキーチェーンを選択した状態で「ファイル → 読み込む」を選択し、Easy-RSAルート証明書をインポートします(Linux 上の /opt/easy-rsa/pki/ca.crt にあるはずです)。インポート直後の証明書は 信頼されていない状態 になっていました。

f:id:sig9:20170108224206p:plain

ルート証明書をダブルクリックし、「この証明書を使用するとき」を 常に信頼 へ変更します。

f:id:sig9:20170108224218p:plain

Easy-RSA で発行したルート証明書信頼された状態 になりました。

f:id:sig9:20170108224225p:plain

AnyConenct から接続する

macOS から AnyConnect クライアントを起動し、ASA へ接続してみます。接続先の FQDNDNS にレコードを追加するなり、/etc/hosts なりで名前解決出来るようにしておきます。

f:id:sig9:20170108224235p:plain

警告が出ずにユーザ名の入力画面へ遷移すれば OK です!

f:id:sig9:20170108224242p:plain

補足

「CentOS7 + epel」や「Ubuntu16」環境ではリポジトリ上に Easy-RSA があるものの、バージョンが古いようです。ですので、今回の手順では GitHub から直接、リリースパッケージをダウンロードして使いました。

CentOS7

現時点では epel に Easy-RSA 2.2.2 がありました。

root@centos7:~# yum info easy-rsa
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
Available Packages
Name        : easy-rsa
Arch        : noarch
Version     : 2.2.2
Release     : 1.el7
Size        : 26 k
Repo        : epel/x86_64
Summary     : Simple shell based CA utility
URL         : https://github.com/OpenVPN/easy-rsa
License     : GPLv2
Description : This is a small RSA key management package, based on the openssl
            : command line tool, that can be found in the easy-rsa subdirectory
            : of the OpenVPN distribution. While this tool is primary concerned
            : with key management for the SSL VPN application space, it can also
            : be used for building web certificates.

Ubuntu16

標準リポジトリ上に Easy-RSA 2.2.2-2 がありました。

root@ubuntu16:~# apt-cache show easy-rsa
Package: easy-rsa
Priority: extra
Section: universe/utils
Installed-Size: 93
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Alberto Gonzalez Iniesta <agi@inittab.org>
Architecture: all
Version: 2.2.2-2
Depends: openssl
Recommends: opensc
Filename: pool/universe/e/easy-rsa/easy-rsa_2.2.2-2_all.deb
Size: 17364
MD5sum: aef94e285612f25ac2bbaa4089bb9e84
SHA1: c26bf6d23a5673581eed5092c4cf34bb9753848a
SHA256: e4a562fceebad38918eaa30c70a8eff5d7f4a01e72252db8168b9ca65e475465
Description-en: Simple shell based CA utility
 This package eases the creation of certificates, for example for
 openvpn clients.
 .
 This was formerly part of the openvpn package.
Description-md5: 30ef8db774064b75fc32b3b7baedeb03
Homepage: https://community.openvpn.net/openvpn
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Origin: Ubuntu