Smile Engineering Blog

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

Easy-RSA による公開鍵基盤(PKI) その 2

はじめに

前回Easy-RSA を用いてプライベートな認証局(CA)を構築するところまで実施しました。今回は引き続き Web サーバ用の証明書を作成するまでを試してみたいと思います。

手順:

前提(環境):

秘密鍵、および 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/ での作業です)。

コピーした CSR認証局(CA)にインポートします。

$ ./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 サーバの秘密鍵も必要です。

  • my-server.key: 秘密鍵。今回の最初の手順で作ったやつ
  • my-server.crt: 証明書。上の手順で認証局(CA)に署名されたやつ
$ openssl s_server -accept 8443 -cert my-server.crt -key my-server.key -www
Using default temp DH parameters
ACCEPT

起動したら、クライアントから Web サーバにアクセスしてみます。クライアント側には、認証局(CA)の証明書をインストールしておく必要があります。システムへのインストール方法は 前回 の記事 を参照してください。

以下のように TLS 通信の情報が表示され、証明書が「有効」となっていれば成功です。

f:id:jspnet:20210314115451p:plain

curl コマンドでは特定の認証局(CA)の照明を使用することもできます。--cacert オプション、または --capath オプションを使用します。

$ curl --cacert ca.crt https://192.168.10.122:8443/

プライベートな認証局(CA)をシステムにインストールしたくない場合はこのオプションを使うと良いです。