Easy-RSA による公開鍵基盤(PKI) その 2
はじめに
前回 は Easy-RSA を用いてプライベートな認証局(CA)を構築するところまで実施しました。今回は引き続き Web サーバ用の証明書を作成するまでを試してみたいと思います。
手順:
前提(環境):
- Easy-RSA 3.0.8
- Ubuntu 20.04.2 LTS
- 認証局(CA)アドレス: 192.168.10.120
- Web サーバアドレス: 192.168.10.122
秘密鍵、および CSR の作成
この操作は利用者(Web サーバ側)の作業です。
まず、openssl
コマンドを使用して Web サーバ用の秘密鍵を作成します。今回の例では RSA を用います。
$ openssl genrsa -out my-server.key Generating RSA private key, 2048 bit long modulus (2 primes) ........................................+++++ .........+++++ e is 65537 (0x010001)
秘密鍵ができたので対応する CSR をを作成します。今回はお試しなので Common Name 以外は全てデフォルト値で作成します。また、IP アドレス指定で接続させたいので Subject Alternative Name(SAN)拡張属性に IP アドレスをセットします。拡張属性は -addext
オプションを用いて指示します。
$ openssl req -new -key my-server.key -out my-server.req \ -addext "subjectAltName = IP:192.168.10.122" 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. ----- Country Name (2 letter code) [AU]: // ★Enter のみ入力(デフォルト値) State or Province Name (full name) [Some-State]: // ★Enter のみ入力(デフォルト値) Locality Name (eg, city) []: // ★Enter のみ入力(デフォルト値) Organization Name (eg, company) [Internet Widgits Pty Ltd]: // ★Enter のみ入力(デフォルト値) Organizational Unit Name (eg, section) []: // ★Enter のみ入力(デフォルト値) Common Name (e.g. server FQDN or YOUR name) []:my-server // Common Name 入力 Email Address []: // ★Enter のみ入力(デフォルト値) Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: // ★Enter のみ入力(デフォルト値) An optional company name []: // ★Enter のみ入力(デフォルト値)
CSR が出来上がりました。SAN 属性に IP アドレスがセットされているのが確認できます。
my-server.req
: CSR
$ openssl req -in my-server.req -noout -text Certificate Request: Data: Version: 1 (0x0) Subject: C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = my-server Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) Modulus: 00:b6:64:6a:a6:c1:6a:2d:fd:f8:90:b7:fb:c1:17: ff:df:db:8b:25:07:86:3a:78:5e:ae:aa:92:d1:de: 25:51:fe:95:cb:b7:84:50:9d:34:e0:44:4c:cd:bc: a5:00:08:a3:57:0c:25:62:ac:ec:ed:93:67:4c:cd: cd:06:db:4e:ac:c0:f7:67:51:56:d6:52:f4:00:90: 24:38:13:1f:64:fe:38:0a:80:e4:dc:64:01:8e:23: 58:41:fe:06:ab:f8:b9:fa:53:71:f3:36:17:46:a6: fb:28:38:c6:d8:d1:ce:95:43:87:30:d3:8a:a1:d1: dd:79:5c:9b:44:a9:45:f2:da:5f:67:c1:da:ce:47: 00:a9:a1:69:2b:91:16:76:22:8b:78:ac:69:90:77: 85:41:f8:f7:bc:d1:27:e5:36:e7:06:ef:c0:8f:a6: bf:c1:63:56:ed:73:21:03:de:f6:f3:51:ec:1c:c3: d2:a5:23:49:83:b4:07:75:0d:cf:65:93:0c:ca:d1: 7e:ac:3d:c9:fc:7b:0d:23:d0:51:3a:5d:67:49:76: d0:5b:13:e9:c8:91:56:80:d7:6d:b1:55:5b:34:4b: c8:88:9b:90:73:51:29:e2:98:bd:5a:66:36:a9:24: 0a:3c:7d:b8:30:a4:f7:d0:dc:a4:f6:d8:fa:9e:7b: d8:ad Exponent: 65537 (0x10001) Attributes: Requested Extensions: X509v3 Subject Alternative Name: IP Address:192.168.10.122 Signature Algorithm: sha256WithRSAEncryption 54:0b:1f:45:a2:a1:37:a9:b1:db:d2:14:94:cd:91:8e:89:00: d0:8c:ed:27:28:0d:62:e8:de:03:ec:51:fd:5d:a8:e2:d2:16: 0b:11:c0:ea:a3:93:7b:33:83:09:2a:b5:95:07:c2:98:95:dd: 34:00:40:6c:b3:92:6f:48:0b:b1:bd:50:f3:65:29:24:cc:78: 3f:14:cb:96:91:c0:d6:2c:0f:61:63:ce:58:84:a6:ed:7f:ca: 77:49:d0:e8:26:99:55:59:14:93:ea:d7:ad:3d:2b:4f:f7:0f: 68:6a:45:21:c8:9f:42:9b:9b:f6:88:0a:bb:0c:ad:49:a4:0d: db:73:d8:4a:de:27:24:27:86:90:31:bd:b3:a3:11:dc:28:1c: 71:1d:24:ff:8c:92:48:e0:fa:99:f8:a3:07:f0:b4:0b:34:11: 9e:64:ef:92:44:45:ca:c6:b0:35:31:db:52:ef:d8:41:d2:b3: 78:a4:ca:12:3c:fd:88:eb:a6:2a:97:8d:24:ba:79:29:bf:24: e2:b6:56:39:d7:22:49:d2:cf:7b:18:0d:c9:31:1d:99:85:52: c8:d6:44:66:6d:6a:5d:a6:7b:9e:25:ec:43:90:bb:63:df:0d: 62:aa:9b:b9:17:36:25:6f:5a:36:4e:27:2a:98:f6:d0:d8:f2: 8a:00:ba:42
作成した CSR を scp 等で認証局(CA)にコピーします。
認証局(CA)での署名
この操作は認証局(CA)側の作業です(前回同様、easy-rsa/easyrsa3/
での作業です)。
$ ./easyrsa import-req /tmp/my-server.req my-server Using SSL: openssl OpenSSL 1.1.1f 31 Mar 2020 The request has been successfully imported with a short name of: my-server You may now use this name to perform signing operations on this request.
CSR に署名し、サーバの証明書を作成します。今回作成する証明書はWeb サーバ用の証明書ですので、タイプには server を指定します。
$ ./easyrsa sign-req server my-server Using SSL: openssl OpenSSL 1.1.1f 31 Mar 2020 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 825 days: subject= countryName = AU stateOrProvinceName = Some-State organizationName = Internet Widgits Pty Ltd commonName = my-server X509v3 Subject Alternative Name: IP:192.168.10.122 Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes // ★'yes' と入力 Using configuration from /home/jsp/easy-rsa/easyrsa3/pki/easy-rsa-45885.GxrDt0/tmp.SAmPjN Enter pass phrase for /home/jsp/easy-rsa/easyrsa3/pki/private/ca.key: // ★認証局(CA)のパスフレーズを入力 Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'AU' stateOrProvinceName :ASN.1 12:'Some-State' organizationName :ASN.1 12:'Internet Widgits Pty Ltd' commonName :ASN.1 12:'my-server' Certificate is to be certified until Jun 17 01:12:48 2023 GMT (825 days) Write out database with 1 new entries Data Base Updated Certificate created at: /home/jsp/easy-rsa/easyrsa3/pki/issued/my-server.crt
CSR に対して認証局(CA)の署名が行われ、証明書ができました。
my-server.crt
: 証明書
証明書の内容を確認してみます。
$ openssl x509 -in /home/jsp/easy-rsa/easyrsa3/pki/issued/my-server.crt -noout -text Certificate: Data: Version: 3 (0x2) Serial Number: bf:a8:ea:18:e3:da:88:0f:a4:67:8d:29:46:58:e4:32 Signature Algorithm: sha256WithRSAEncryption Issuer: CN = Easy-RSA CA Validity Not Before: Mar 14 01:12:48 2021 GMT Not After : Jun 17 01:12:48 2023 GMT Subject: C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = my-server Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) Modulus: 00:b6:64:6a:a6:c1:6a:2d:fd:f8:90:b7:fb:c1:17: ff:df:db:8b:25:07:86:3a:78:5e:ae:aa:92:d1:de: 25:51:fe:95:cb:b7:84:50:9d:34:e0:44:4c:cd:bc: a5:00:08:a3:57:0c:25:62:ac:ec:ed:93:67:4c:cd: cd:06:db:4e:ac:c0:f7:67:51:56:d6:52:f4:00:90: 24:38:13:1f:64:fe:38:0a:80:e4:dc:64:01:8e:23: 58:41:fe:06:ab:f8:b9:fa:53:71:f3:36:17:46:a6: fb:28:38:c6:d8:d1:ce:95:43:87:30:d3:8a:a1:d1: dd:79:5c:9b:44:a9:45:f2:da:5f:67:c1:da:ce:47: 00:a9:a1:69:2b:91:16:76:22:8b:78:ac:69:90:77: 85:41:f8:f7:bc:d1:27:e5:36:e7:06:ef:c0:8f:a6: bf:c1:63:56:ed:73:21:03:de:f6:f3:51:ec:1c:c3: d2:a5:23:49:83:b4:07:75:0d:cf:65:93:0c:ca:d1: 7e:ac:3d:c9:fc:7b:0d:23:d0:51:3a:5d:67:49:76: d0:5b:13:e9:c8:91:56:80:d7:6d:b1:55:5b:34:4b: c8:88:9b:90:73:51:29:e2:98:bd:5a:66:36:a9:24: 0a:3c:7d:b8:30:a4:f7:d0:dc:a4:f6:d8:fa:9e:7b: d8:ad Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE X509v3 Subject Key Identifier: DA:FA:CA:53:C4:74:DC:AB:91:7F:65:E2:66:9C:6D:E8:AF:31:57:E8 X509v3 Authority Key Identifier: keyid:54:08:FD:F1:31:AE:DF:3D:DF:23:3E:18:9C:3B:EC:32:DB:27:64:52 DirName:/CN=Easy-RSA CA serial:42:D8:FD:8F:3F:3B:04:98:27:C5:60:4B:AF:41:96:7F:58:E4:DD:D8 X509v3 Extended Key Usage: TLS Web Server Authentication X509v3 Key Usage: Digital Signature, Key Encipherment X509v3 Subject Alternative Name: IP Address:192.168.10.122 Signature Algorithm: sha256WithRSAEncryption 55:fa:27:e5:27:0b:a2:1b:14:04:82:5b:a3:d5:b6:2b:ab:46: f1:87:09:65:ec:05:c8:5e:81:58:81:96:c8:57:74:b8:8d:0f: e2:ec:e7:a9:36:9a:36:c1:f2:0f:48:06:23:ec:47:01:6e:b5: fd:d3:b2:37:6a:df:69:70:6c:76:b9:27:48:3e:6e:89:c9:40: f4:53:fd:7e:e5:78:fd:96:b1:87:0a:54:3a:72:02:6a:c0:6d: a4:e3:00:0d:09:e2:b7:62:31:85:ec:33:cf:40:55:a8:e7:06: a7:d6:ef:cb:29:ec:23:73:c2:a3:ca:12:d5:87:42:26:7b:d7: 4d:d6:9c:ec:2f:5d:28:53:e1:0f:fb:33:63:76:8a:87:b0:69: 90:22:1d:98:9a:51:f8:2f:f3:3c:b7:8f:63:23:a7:46:a6:f5: 07:26:22:4f:b5:26:1c:4a:8d:69:48:16:ce:4d:fa:0b:fd:a8: 6f:ca:11:80:27:a4:a8:ee:46:a1:19:70:a9:08:bd:3a:83:e6: 3d:90:19:46:4d:2e:d8:01:db:a6:9f:14:22:27:25:9d:73:7e: cf:17:03:a4:38:8c:d5:5f:98:75:5d:43:bc:cb:ec:6a:91:40: 1c:58:bc:6e:ef:81:c5:1f:4a:57:16:cf:74:5f:36:99:dc:b6: 0d:60:bd:77
SAN 拡張属性に IP アドレスがセットされているのも確認できます。証明書を Web サーバにコピーします。
動作確認
Web サーバ側で、作った証明書を用いて TLS サーバを起動します。TLS サーバは openssl
コマンドで起動します。証明書の他、Web サーバの秘密鍵も必要です。
$ openssl s_server -accept 8443 -cert my-server.crt -key my-server.key -www Using default temp DH parameters ACCEPT
起動したら、クライアントから Web サーバにアクセスしてみます。クライアント側には、認証局(CA)の証明書をインストールしておく必要があります。システムへのインストール方法は 前回 の記事 を参照してください。
以下のように TLS 通信の情報が表示され、証明書が「有効」となっていれば成功です。
curl コマンドでは特定の認証局(CA)の照明を使用することもできます。--cacert
オプション、または --capath
オプションを使用します。
$ curl --cacert ca.crt https://192.168.10.122:8443/
プライベートな認証局(CA)をシステムにインストールしたくない場合はこのオプションを使うと良いです。