clock-up-blog

go-mi-tech

SSL に関わるファイルの中身

なんでもセキュリティ Advent Calendar 2016 4日目の記事です。(まとめが追い付かず日付またいでしまいました。すみません)

SSL の設定、だいたい適当に見つけたブログ記事でも見ながら仕組みも理解せずにポチポチコピペで済ませてしまうことが多いので、今回は改めて仕組みをおさらいしてみます。

注意事項

ちょっと長くなってしまいました。お暇なとき(たとえば通勤時間など)に暇つぶしにでも読んでもらえれば。

秘密鍵の作成

まず秘密鍵を作ります。今回は 2048 ビット長の秘密鍵

$ openssl genrsa -des3 -out test.pem 2048
Generating RSA private key, 2048 bit long modulus
................+++
.......+++
e is 65537 (0x10001)
Enter pass phrase for test.pem: ← 適当なパスフレーズを決めて入力
Verifying - Enter pass phrase for test.pem: ← 同じものを入力

これで test.pem という秘密鍵が作られます。
2048 ビット長というと 256 バイト長にあたるわけですが、ファイルフォーマット (PEM 形式) の都合上、生成されるファイルサイズは 1700 バイトちょっとになります。

$ ls -l test.pem
-rw-rw-r-- 1 kobake kobake 1743 Dec  4 21:33 test.pem

中身はこんな感じ。本来は人に見せるものではありませんが今回は実験なので少し見せます。

$ cat test.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,3579FDC9970E932F

CAX+qsmvguWbMifCgtY/uxRncPsrFm+MbfnhY+NWR4faQFI0bOCTT+y3Fmu9bMXS
k1v+2OnPLQBsg6yTW8Tet7/X8v4MIGuRhwXbtGYhGct1Vn+xjZPc3h9kY7pEkZyg
UUUA9amsnPFiqfp7LHFx66zVyHcLUNFbY0vxSL8KfTj+vZYRYAEiIrTXJnLiMTds
.....
jXWb3Pn7ndHboz3yCXThE3ZuA/+wSDdgIZSljz4wF8HM33evsXwFadQzGjtDF3pu
X4Q7NY00DwdkDDmndAxF4VUsA7qBgg2dYpSP4xPO4OWfAqCRD4cu2A==
-----END RSA PRIVATE KEY-----

BASE64 エンコードされている部分に実際の秘密鍵バイナリが含まれています。(さらにパスフレーズにより暗号化がかかっている)

作成された秘密鍵 *.key はとても大事なものなので大切に保管しましょう。

秘密鍵の内容確認

秘密鍵の」と書きましたが、以下コマンドにより秘密鍵と公開鍵の両方の情報が表示されます。
秘密鍵が決まれば自動的に公開鍵も決まるのです)

$ openssl rsa -text -noout -in test.pem
Enter pass phrase for test.pem: ← パスフレーズを入力
Private-Key: (2048 bit)
modulus: ← このセクションがいわゆる公開鍵
    00:ae:b5:bb:ab:f8:13:7b:43:18:2a:84:98:99:89:
    6f:bf:cf:e9:e0:4c:07:cd:b0:c9:6c:ca:b3:a6:52:
    83:6c:08:3a:3f:3f:11:8e:2c:36:58:17:d2:2f:f3:
    16:52:fa:9a:3f:52:4e:16:a2:e4:64:6b:57:47:e9:
    54:e3:b3:87:69:0a:08:0c:93:3f:58:34:a6:99:6f:
    84:0c:29:a3:10:44:76:80:86:f9:d7:f2:21:d9:d4:
    77:55:8b:95:72:1c:99:e3:de:31:7d:a7:91:dc:6c:
    7e:d5:a8:5b:c5:90:4d:a9:ee:1f:3a:c8:47:45:a5:
    72:dc:63:0e:b9:49:e5:b1:c7:c6:3d:8f:d8:87:bb:
    10:9d:08:4d:31:c2:cb:1b:fa:9f:87:ad:a9:65:f4:
    b7:38:e5:f6:f8:0d:a9:3d:4c:74:6f:b0:ce:ac:89:
    cb:ad:72:21:65:3f:2d:72:7e:e2:63:d9:46:03:40:
    d3:ce:b2:1c:0c:17:bc:17:03:93:a3:a8:91:4e:ac:
    71:8b:ba:eb:62:6c:3f:ee:d6:91:25:76:02:8c:c6:
    3e:d3:c4:80:6b:56:82:a0:3b:ea:71:2c:df:f3:6e:
    ba:76:e6:3d:64:fb:af:f8:35:4d:96:52:eb:66:8a:
    16:e6:19:a1:bf:d0:73:ee:24:69:ed:51:98:f7:0a:
    b3:4f
publicExponent: 65537 (0x10001)
privateExponent: ← このセクションが実際の秘密鍵バイナリ (2048ビット = 256バイト)
    41:7e:6f:34:30:73:5d:29:f1:cd:3e:97:d6:36:e7:
    65:88:93:ac:39:d4:53:0f:8a:f2:f5:aa:13:17:ab:
    9c:bc:18:d9:cc:d2:cf:f1:53:0e:03:20:10:49:98:
    7c:d2:e5:30:07:b2:ae:59:b2:34:d2:e8:8d:54:b3:
    36:08:ff:22:29:58:8b:1e:48:08:d0:f4:03:61:02:
    a7:6c:94:6c:6c:bd:df:c0:b9:b8:72:54:ae:4c:2f:
    d0:29:db:84:43:a4:8c:ff:a6:9d:ec:4b:89:ce:42:
    5d:e6:17:41:20:af:7c:9c:7f:a8:91:9b:e6:47:f7:
    9f:16:a3:56:62:95:70:e7:4c:61:97:ee:95:36:60:
    1c:18:4b:ec:0d:9a:bb:20:cf:a2:dd:c9:eb:fe:5b:
    a2:37:02:e2:06:ad:72:be:a4:bd:20:c5:7f:b2:93:
    8e:cd:44:46:f1:54:59:58:cc:06:81:e3:5b:d0:1a:
    43:c0:50:7b:fc:ae:09:9a:f1:76:12:7c:55:08:7b:
    78:42:da:2c:ca:51:62:5e:f3:76:e8:ce:44:a1:a9:
    5e:c2:e5:56:16:7a:b7:36:a1:11:15:70:93:da:98:
    41:df:36:16:97:4d:4c:6f:40:50:77:34:9d:75:53:
    d7:12:2b:02:63:26:79:e1:af:c7:5f:0e:87:d6:36:
    c1
prime1: ← 素数1
    00:df:b7:37:93:58:fe:29:3e:18:eb:b5:63:d7:cd:
    4b:08:c9:a9:e4:14:3d:fe:9d:e1:21:09:a0:1d:c6:
    e7:8f:37:7d:b8:67:88:46:28:30:6f:c2:d3:cb:24:
    15:f8:5e:a6:b5:9a:42:cb:30:34:00:22:9c:a8:49:
    53:64:80:19:ac:34:42:18:62:3f:d1:38:65:14:13:
    a2:5e:e2:74:3a:da:80:b8:77:7c:80:dc:6e:38:9e:
    05:9d:5c:d6:23:2c:57:ed:5d:fb:6d:61:d9:84:d6:
    d0:d2:a2:9f:bf:6d:05:b3:4c:ea:21:40:95:be:30:
    9a:ac:45:47:5b:df:1d:13:f3
prime2: ← 素数2
    00:c7:ec:15:3f:20:83:d4:6c:1a:0f:a9:f4:02:f8:
    b4:4f:c3:a0:70:45:df:a7:ad:69:fb:6e:c9:69:da:
    77:a8:29:0d:cc:28:3e:ec:9f:81:ae:c1:9f:08:7f:
    c9:f9:1d:a4:d4:f4:d5:ca:64:5d:0d:dc:d6:eb:64:
    3a:1d:1f:59:5a:3a:ca:df:dd:63:e7:11:63:cd:c6:
    dc:46:0a:5c:56:c5:07:46:80:7f:a3:ef:50:d0:93:
    94:29:7c:ce:17:a0:8b:21:29:58:43:e7:fc:32:ed:
    69:59:5c:52:81:09:80:8a:7b:5c:fe:bd:9a:26:0e:
    d0:14:6c:73:0b:6c:12:a6:35
exponent1:
    1d:28:a6:47:c0:4b:b0:58:75:ab:13:43:66:37:4d:
    ......

「公開鍵は2つの素数の積である」ということを聞いたことがある方もいらっしゃるかと思います。
実際のところ上記で示した鍵表示をもとに、それが事実であることを確認してみましょう。

prime1, prime2 というのが該当の素数です。
数値計算が得意な Python の対話モードで確認してみましょう。

$ python
>>> prime1 = 0x00dfb7379358fe293e18ebb563d7cd4b08c9a9e4143dfe9de12109a01dc6e78f377db867884628306fc2d3cb2415f85ea6b59a42cb303400229ca84953648019ac344218623fd138651413a25ee2743ada80b8777c80dc6e389e059d5cd6232c57ed5dfb6d61d984d6d0d2a29fbf6d05b34cea214095be309aac45475bdf1d13f3
>>> prime2 = 0x00c7ec153f2083d46c1a0fa9f402f8b44fc3a07045dfa7ad69fb6ec969da77a8290dcc283eec9f81aec19f087fc9f91da4d4f4d5ca645d0ddcd6eb643a1d1f595a3acadfdd63e71163cdc6dc460a5c56c50746807fa3ef50d09394297cce17a08b21295843e7fc32ed69595c528109808a7b5cfebd9a260ed0146c730b6c12a635
>>> modulus= prime1 * prime2
>>> hex(modulus)
'0xaeb5bbabf8137b43182a849899896fbfcfe9e04c07cdb0c96ccab3a652836c083a3f3f118e2c365817d22ff31652fa9a3f524e16a2e4646b5747e954e3b387690a080c933f5834a6996f840c29a31044768086f9d7f221d9d477558b95721c99e3de317da791dc6c7ed5a85bc5904da9ee1f3ac84745a572dc630eb949e5b1c7c63d8fd887bb109d084d31c2cb1bfa9f87ada965f4b738e5f6f80da93d4c746fb0ceac89cbad7221653f2d727ee263d9460340d3ceb21c0c17bc170393a3a8914eac718bbaeb626c3feed6912576028cc63ed3c4806b5682a03bea712cdff36eba76e63d64fbaff8354d9652eb668a16e619a1bfd073ee2469ed5198f70ab34fL'

この計算結果が

modulus:
    00:ae:b5:bb:ab:f8:13:7b:43:18:2a:84:98:99:89:
    6f:bf:cf:e9:e0:4c:07:cd:b0:c9:6c:ca:b3:a6:52:
    83:6c:08:3a:3f:3f:11:8e:2c:36:58:17:d2:2f:f3:
    .....

に一致していることが確認できました。(先頭の 00 は無視するとして、しっかりと aeb5bbabf8… の並びになっている)

ゆらぎ

ちなみに秘密鍵は乱数を絡めて生成されるので、同じファイル名同じパスフレーズで openssl genrsa を実行しても中身は異なる秘密鍵ができます。

f:id:kobake:20161204234929p:plain

CSR (Certificate Signing Request) 作成

SSL ネットワークを構築する際にはまず認証機関 (ジオトラストとか) に対して CSR (Certificate Signing Request = 証明書署名要求) というものを渡す必要がある。

CSR は認証を受ける組織の名前や所在地情報、連絡先等を含み、また、その CSR 作成者を証するために作成者の公開鍵情報を含む。(そこでさきほど作った鍵が登場する)

$ openssl req -new -key test.pem -out test.csr
Enter pass phrase for test.pem: ← 秘密鍵のパスフレーズを入力
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) [XX]:JP ← 国
State or Province Name (full name) []:Tokyo ← 都道府県
Locality Name (eg, city) [Default City]:Taito-ku ← 市区町村名等
Organization Name (eg, company) [Default Company Ltd]:ClockUp, Inc. ← 組織名
Organizational Unit Name (eg, section) []: ← 部署名。これは空っぽでも良い。
Common Name (eg, your name or your server's hostname) []:inc.clock-up.jp ← ドメイン名。ここは間違えないように。
Email Address []:kobake@users.sourceforge.net ← 連絡先。

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ← 空で良い
An optional company name []: ← 空で良い

できあがった CSR

$ ls -l test.csr
-rw-rw-r-- 1 kobake kobake 1058 Dec  5 00:05 test.csr

$ cat test.csr 
-----BEGIN CERTIFICATE REQUEST-----
MIIC1TCCAb0CAQAwgY8xCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzERMA8G
A1UEBwwIVGFpdG8ta3UxFjAUBgNVBAoMDUNsb2NrVXAsIEluYy4xGDAWBgNVBAMM
D2luYy5jbG9jay11cC5qcDErMCkGCSqGSIb3DQEJARYca29iYWtlQHVzZXJzLnNv
dXJjZWZvcmdlLm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK61
u6v4E3tDGCqEmJmJb7/P6eBMB82wyWzKs6ZSg2wIOj8/EY4sNlgX0i/zFlL6mj9S
Thai5GRrV0fpVOOzh2kKCAyTP1g0pplvhAwpoxBEdoCG+dfyIdnUd1WLlXIcmePe
MX2nkdxsftWoW8WQTanuHzrIR0WlctxjDrlJ5bHHxj2P2Ie7EJ0ITTHCyxv6n4et
qWX0tzjl9vgNqT1MdG+wzqyJy61yIWU/LXJ+4mPZRgNA086yHAwXvBcDk6OokU6s
cYu662JsP+7WkSV2AozGPtPEgGtWgqA76nEs3/NuunbmPWT7r/g1TZZS62aKFuYZ
ob/Qc+4kae1RmPcKs08CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQAPsKFmGC1M
tLsVy7NpKxHsxeII5dm7Ztlsw+RBrsQSolbEge4s8R7N+Sm/Sht1ou5zgN31MzGW
5JTLJ2x3KJpwTCH9uu1ybNbPSu5vdMIVtjMZcX8tWikaNPfUpfUgpHIUTeXmh/89
ZLDwXJv2lLv+yPekJM/zRq44KyVzfU2mnCmDe8klydUvtNBimfjA3t6LvigZ4SCE
8IdP88yEM36QicEU2T1DXTjeJgYn18Fm6rce5cV0jmULHro5swo62qnpar1aCFMQ
RRDAte+eU3bQZ6pp5NkxegGpvyzYqSllOjInY13iFnwuLu3XtZwM10bLaXlAWuXr
MzAZtat8Guo3
-----END CERTIFICATE REQUEST-----

これもはやり BASE64 形式でエンコードされている。

この部分を BASE64 部分をデコードしたところでそれほど有用な情報は得られないので、

$ cat test.csr | sed -e '$d' | sed -e '1,1d' | base64 -d && echo ""
0001
    0   UJP10Tokyo10Taito-ku10U
ClockUp,*obake@users.sourceforge.net00  *
*oͰ:??6XRNdkWGi
Lto˭r!e?-r~F@N?%v>V;n5M桿
        *
-L˳ifAā)s'lw(L!rlJ¶3q-Z)4 M\F+%s}M)/bދ 3~=C]8'f
                                                
کSEvz,ة)e:2'c].Fy@Z0|

ちゃんとしたコマンドでこのファイル内容を確認してみることにする

$ openssl req -text -noout -in test.csr
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JP, ST=Tokyo, L=Taito-ku, O=ClockUp, Inc., CN=inc.clock-up.jp/emailAddress=kobake@users.sourceforge.net ← 組織情報
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus: ← 公開鍵
                    00:ae:b5:bb:ab:f8:13:7b:43:18:2a:84:98:99:89:
                    6f:bf:cf:e9:e0:4c:07:cd:b0:c9:6c:ca:b3:a6:52:
                    .....
                    ba:76:e6:3d:64:fb:af:f8:35:4d:96:52:eb:66:8a:
                    16:e6:19:a1:bf:d0:73:ee:24:69:ed:51:98:f7:0a:
                    b3:4f
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         0f:b0:a1:66:18:2d:4c:b4:bb:15:cb:b3:69:2b:11:ec:c5:e2:
         08:e5:d9:bb:66:d9:6c:c3:e4:41:ae:c4:12:a2:56:c4:81:ee:
         .....
         a9:bf:2c:d8:a9:29:65:3a:32:27:63:5d:e2:16:7c:2e:2e:ed:
         d7:b5:9c:0c:d7:46:cb:69:79:40:5a:e5:eb:33:30:19:b5:ab:
         7c:1a:ea:37

こんな感じの内容。組織情報および公開鍵情報が含まれているので、認証機関は安心してこの CSR を受け取ることができる。

CSR を認証機関に送る

大抵の認証機関が Web 上から CSR を送ることができる機能を有している。

認証機関側での CSR の内容確認

CSR が送られたら認証機関では即サーバ証明書 (CRT) を発行してくれるわけではなく、まずは CSR に含まれているドメイン名が本当に送信元ユーザの所有ドメインであるかの確認を行う。

よくある手法として (RapidSSL 等)、認証機関側からランダムなトークンが記載された htm ファイルが送られてくる。
この htm ファイルを対象ドメインのサーバ内に設置する。
認証機関側はそのファイルの設置確認をもって、所有者の確認を行う。

この確認に問題がなければ、認証機関は送られてきた CSR に対して認証機関側の署名を行い、それをサーバ証明書 (CRT) としてユーザに送り返す。

サーバ証明書 (CRT)

$ cat server.crt
-----BEGIN CERTIFICATE-----
MIIFYjCCBEqgAwIBAgIQcx46KTU4TV2WV8WyTOUmcjANBgkqhkiG9w0BAQsFADBC
MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMS
....
TkGKKgzUXBSB2iqRg9VMYHmFKxWXwCYo0dhKhAMdyalbzZ6O8VeKegHEZgZdydUr
qFHDxzdqc1dTMoI0v54qV+tbGblFMQrfdoY8MxEL8XNfr96UMdE=
-----END CERTIFICATE-----

これもまた BASE64 エンコードされたファイルである。

以下コマンドにより内容を確認できる。(これは実験用でない実物なので上に挙げたサンプルの CSR 情報とは食い違う情報が含まれています。ご容赦。あくまでもひとつの例として中身を見せます。)

$ openssl x509 -in server.crt -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            73:1e:3a:29:35:38:4d:5d:96:57:c5:b2:4c:e5:26:72
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=GeoTrust Inc., CN=RapidSSL SHA256 CA
        Validity
            Not Before: Aug  8 00:00:00 2016 GMT
            Not After : Aug  8 23:59:59 2017 GMT
        Subject: CN=acc.clock-up.jp
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus: ← 公開鍵
                    00:c4:15:1d:35:ea:30:9d:99:dd:d5:a6:74:cc:d0:
                    22:82:f0:0f:cb:86:89:3c:6e:30:9a:a8:3e:c5:9a:
                    .....
                    eb:da:36:d9:f3:27:7c:06:bd:c7:b9:56:d8:1d:69:
                    4b:9e:59:0f:63:17:61:18:e9:a9:f0:f0:d7:26:64:
                    1b:af
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name: 
                DNS:acc.clock-up.jp
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 CRL Distribution Points: 

                Full Name:
                  URI:http://gp.symcb.com/gp.crl

            X509v3 Certificate Policies: 
                Policy: 2.23.140.1.2.1
                  CPS: https://www.rapidssl.com/legal
                  User Notice:
                    Explicit Text: https://www.rapidssl.com/legal

            X509v3 Authority Key Identifier: 
                keyid:97:C2:27:50:9E:C2:C9:EC:0C:88:32:C8:7C:AD:E2:A6:01:4F:DA:6F

            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication, TLS Web Client Authentication
            Authority Information Access: 
                OCSP - URI:http://gp.symcd.com
                CA Issuers - URI:http://gp.symcb.com/gp.crt

            1.3.6.1.4.1.11129.2.4.2: 
O. ....hp~.....\..=..........Vl&.v.....H0F.!....a].....qb......_R.5..`......>.!.....+q.....vu.#....=8..i.w..'R(9.u.......X......gp
.....Vl&.......F0D. .L]....tB...po...t._.?*
x%.t..... .d..y,K..{..[.,t^.nh.Ql.bo....i.
    Signature Algorithm: sha256WithRSAEncryption
         57:2e:2f:4d:cc:63:d7:9b:97:17:80:de:d2:d0:52:21:a5:c6:
         29:93:1a:d0:bd:93:ef:63:c9:f3:7b:a6:09:10:10:c4:e4:77:
         .....
         d5:2b:a8:51:c3:c7:37:6a:73:57:53:32:82:34:bf:9e:2a:57:
         eb:5b:19:b9:45:31:0a:df:76:86:3c:33:11:0b:f1:73:5f:af:
         de:94:31:d1

上記は acc.clock-up.jp の SSL 証明書情報なのだが、SSL 設定済みであればサーバ証明書ファイルがなくてもドメイン指定である程度の SSL 関連情報は以下のように取得できる。

$ openssl s_client -connect acc.clock-up.jp:443 -servername acc.clock-up.jp | openssl x509 -text -noout
depth=0 CN = acc.clock-up.jp
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = acc.clock-up.jp
verify error:num=27:certificate not trusted
verify return:1
depth=0 CN = acc.clock-up.jp
verify error:num=21:unable to verify the first certificate
verify return:1
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            73:1e:3a:29:35:38:4d:5d:96:57:c5:b2:4c:e5:26:72
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=GeoTrust Inc., CN=RapidSSL SHA256 CA
        Validity
            Not Before: Aug  8 00:00:00 2016 GMT
            Not After : Aug  8 23:59:59 2017 GMT
        Subject: CN=acc.clock-up.jp
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus: ←公開鍵
                    00:c4:15:1d:35:ea:30:9d:99:dd:d5:a6:74:cc:d0:
                    22:82:f0:0f:cb:86:89:3c:6e:30:9a:a8:3e:c5:9a:
                    .....
                    eb:da:36:d9:f3:27:7c:06:bd:c7:b9:56:d8:1d:69:
                    4b:9e:59:0f:63:17:61:18:e9:a9:f0:f0:d7:26:64:
                    1b:af
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name: 
                DNS:acc.clock-up.jp
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 CRL Distribution Points: 

                Full Name:
                  URI:http://gp.symcb.com/gp.crl

            X509v3 Certificate Policies: 
                Policy: 2.23.140.1.2.1
                  CPS: https://www.rapidssl.com/legal
                  User Notice:
                    Explicit Text: https://www.rapidssl.com/legal

            X509v3 Authority Key Identifier: 
                keyid:97:C2:27:50:9E:C2:C9:EC:0C:88:32:C8:7C:AD:E2:A6:01:4F:DA:6F

            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication, TLS Web Client Authentication
            Authority Information Access: 
                OCSP - URI:http://gp.symcd.com
                CA Issuers - URI:http://gp.symcb.com/gp.crt

            1.3.6.1.4.1.11129.2.4.2: 
O. ....hp~.....\..=..........Vl&.v.....H0F.!....a].....qb......_R.5..`......>.!.....+q.....vu.#....=8..i.w..'R(9.u.......X......gp
.....Vl&.......F0D. .L]....tB...po...t._.?*
x%.t..... .d..y,K..{..[.,t^.nh.Ql.bo....i.
    Signature Algorithm: sha256WithRSAEncryption
         57:2e:2f:4d:cc:63:d7:9b:97:17:80:de:d2:d0:52:21:a5:c6:
         29:93:1a:d0:bd:93:ef:63:c9:f3:7b:a6:09:10:10:c4:e4:77:
         .....
         d5:2b:a8:51:c3:c7:37:6a:73:57:53:32:82:34:bf:9e:2a:57:
         eb:5b:19:b9:45:31:0a:df:76:86:3c:33:11:0b:f1:73:5f:af:
         de:94:31:d1

中間CA(ICA=Intermediate Certificate Authority=中間認証局)証明書を取得する

これは大抵の場合、認証局が Web サイト上に公開している。
たとえば RapidSSL ではれば以下から中間CA証明書を取得できる。

このようなテキストを、わかりやすい名前、たとえば inca_rapidssl.crt としてサーバに保存しておこう。

-----BEGIN CERTIFICATE-----
MIIETTCCAzWgAwIBAgIDAjpxMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
.....
4FB84XavXu0R0y8TubglpK9YCa81tGJUheNI3rzSkHp6pIQNo0LyUcDUrVNlXWz4
Px8G8k/Ll6BKWcZ40egDuYVtLLrhX7atKz4lecWLVtXjCYDqwSfC2Q7sRwrp0Mr8
2A==
-----END CERTIFICATE-----

他の CRT と同様に以下コマンドで中身を確認できる。

$ openssl x509 -in inca_rapidssl.crt -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 146033 (0x23a71)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
        Validity
            Not Before: Dec 11 23:45:51 2013 GMT
            Not After : May 20 23:45:51 2022 GMT
        Subject: C=US, O=GeoTrust Inc., CN=RapidSSL SHA256 CA ← GeoTrust側の組織情報
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus: ← 公開鍵
                    00:bb:58:c1:12:01:2e:97:d8:7d:18:aa:c8:c2:e5:
                    85:e2:17:6c:60:2e:c9:8d:31:05:39:1a:06:98:56:
                    .....
                    5d:72:d5:28:39:e1:53:3e:25:2c:da:2b:4f:dd:8a:
                    9e:50:50:e0:6f:9a:c4:d5:19:26:89:01:75:73:09:
                    9b:3b
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Authority Key Identifier: 
                keyid:C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E

            X509v3 Subject Key Identifier: 
                97:C2:27:50:9E:C2:C9:EC:0C:88:32:C8:7C:AD:E2:A6:01:4F:DA:6F
            X509v3 Basic Constraints: critical
                CA:TRUE, pathlen:0
            X509v3 Key Usage: critical
                Certificate Sign, CRL Sign
            X509v3 CRL Distribution Points: 

                Full Name:
                  URI:http://g1.symcb.com/crls/gtglobal.crl

            Authority Information Access: 
                OCSP - URI:http://g2.symcb.com

            X509v3 Certificate Policies: 
                Policy: 2.16.840.1.113733.1.7.54
                  CPS: http://www.geotrust.com/resources/cps

            X509v3 Subject Alternative Name: 
                DirName:/CN=SymantecPKI-1-569
    Signature Algorithm: sha256WithRSAEncryption
         35:eb:e1:8b:20:56:94:ba:7a:bd:79:a9:f6:e3:fe:6e:38:b4:
         32:c1:a3:db:58:56:20:3e:7d:c7:3a:b1:67:69:d5:79:14:1b:
         .....
         59:c6:78:d1:e8:03:b9:85:6d:2c:ba:e1:5f:b6:ad:2b:3e:25:
         79:c5:8b:56:d5:e3:09:80:ea:c1:27:c2:d9:0e:ec:47:0a:e9:
         d0:ca:fc:d8

ファイルが揃った

これらを Apache なり何なりに組み込めば HTTPS サーバが完成する。

今回は各種ファイルの詳細に触れたが、手順だけであれば以前 Qiita にまとめた記事があるのでそちらを参照願いたい。

おしまい

まだ細かい説明の半分もできていない気がするが、どのファイルにどんな情報が格納されているのか、とっかかりがつかめるようになれば幸いである。
近いうちにもうちょっとよりわかりやすい SSL 解説サイトを立ち上げる予定です。

});