Let’s Encrypt のサーバ証明書や秘密鍵をちょっとだけ深追い x509 サーバ証明書

サーバ証明書のフォーマットは「x509」と呼ばれる書式ですね。秘密鍵の「PKCS#1」と比べると数学的には簡単で理解はしやすいですね。

X.509 – ウィキペディア

Let’s Encryptのサーバ証明書(中間証明書を除いた部分,cert.pem)を見てみる

コマンドはこちらです。

$ sudo openssl x509 -in /etc/letsencrypt/live/ドメイン名/cert.pem -text -noout

以下出力です。

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            04:08:34:64:36:01:ce:4b:a8:97:07:1b:1d:80:61:1b:41:4c
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
        Validity
            Not Before: Jun 25 15:50:06 2019 GMT
            Not After : Sep 23 15:50:06 2019 GMT
        Subject: CN = kitakantech.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:d0:34:e0:86:5c:30:16:57:a3:30:c7:d8:4a:78:
                    --16進数が続く-----
                    18:f3
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier: 
                2C:AF:51:CD:D3:F2:5E:4C:C7:D2:57:64:F8:5E:70:2A:A1:64:24:B5
            X509v3 Authority Key Identifier: 
                keyid:A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1

            Authority Information Access: 
                OCSP - URI:http://ocsp.int-x3.letsencrypt.org
                CA Issuers - URI:http://cert.int-x3.letsencrypt.org/

            X509v3 Subject Alternative Name: 
                DNS:kitakantech.com
            X509v3 Certificate Policies: 
                Policy: 2.23.140.1.2.1
                Policy: 1.3.6.1.4.1.44947.1.1.1
                  CPS: http://cps.letsencrypt.org

            CT Precertificate SCTs: 
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : E2:69:4B:AE:26:E8:E9:40:09:E8:86:1B:B6:3B:83:D4:
                                3E:E7:FE:74:88:FB:A4:8F:28:93:01:9D:DD:F1:DB:FE
                    Timestamp : Jun 25 16:50:06.418 2019 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:46:02:21:00:83:28:EC:81:DA:EC:E6:A5:52:3D:3E:
                                22:86:D4:C2:F8:58:9E:74:84:52:A8:AB:86:4D:53:82:
                                2E:28:11:AE:73:02:21:00:FA:57:83:0A:DE:46:B4:E0:
                                73:20:A1:3F:22:7B:F3:AD:8A:63:B8:94:B5:5B:BE:99:
                                A2:D1:F2:14:60:77:0E:F3
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : 63:F2:DB:CD:E8:3B:CC:2C:CF:0B:72:84:27:57:6B:33:
                                A4:8D:61:77:8F:BD:75:A6:38:B1:C7:68:54:4B:D8:8D
                    Timestamp : Jun 25 16:50:06.423 2019 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:44:02:20:2F:2B:82:49:87:C6:7C:03:BB:8F:FA:CE:
                                19:EB:7D:0E:5F:A3:30:F1:2D:80:1A:AB:48:6A:E9:E1:
                                73:CE:98:E5:02:20:10:B8:0B:0A:0D:4A:92:0D:1E:7C:
                                3D:64:F7:73:82:A5:86:50:43:13:57:4A:D4:CA:6D:E0:
                                01:F1:F2:BE:47:C9
    Signature Algorithm: sha256WithRSAEncryption
         95:fc:c2:4c:0d:bf:1f:da:87:d6:a4:49:d4:e4:32:f2:09:30:
         --16進数が続く-----
         c3:bb:c6:28

公開鍵ペア

Subject Public Key Info:のところに秘密鍵のファイルと同じ(Modulus,PublicExponent)の値が記載されています。

 Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:d0:34:e0:86:5c:30:16:57:a3:30:c7:d8:4a:78:
                    --16進数が続く-----
                    18:f3
                Exponent: 65537 (0x10001)

Certificate Transparencyについての部分

CT(Certificate Transparency)って何?ってことですが、権威あるサイトを確認です。

Certificate Transparencyについて | JPRS

この証明書ですとこの部分ですね。

 CT Precertificate SCTs: 
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : E2:69:4B:AE:26:E8:E9:40:09:E8:86:1B:B6:3B:83:D4:
                                3E:E7:FE:74:88:FB:A4:8F:28:93:01:9D:DD:F1:DB:FE
                    Timestamp : Jun 25 16:50:06.418 2019 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:46:02:21:00:83:28:EC:81:DA:EC:E6:A5:52:3D:3E:
                                22:86:D4:C2:F8:58:9E:74:84:52:A8:AB:86:4D:53:82:
          ーー続くーー

Let’s encryptの公式サイトにいろいろ書いてありますね。

https://letsencrypt.org/2018/04/04/sct-encoding.html

ニセモノの証明書が発行されちゃってもログで発見できるような仕組み(Googleが提案)ですね。Signed Certificate Timestamp:の部分はCTログサーバに登録しました、ってことの証明ですね。2つあるのはどうしてでしょうか。

ecdsa-with-SHA256を使った署名がついています。RSAではなく楕円曲線暗号で署名してるよってことですね。この場合はどのデータ部分をハッシュしてるんでしょうね。あと「Precertificate」と「Pre」がついているのがちょっと気になりますね。

証明書の署名

最後の部分は証明書の署名ですね。こちらの部分です。認証局(この場合はletsencrypt.orgのサーバ)が証明書(依頼)のハッシュを取って、認証局の秘密鍵で暗号化したものになるかと思います。証明書(依頼)のハッシュは具体的にどのデータを取るのかちょっとCT時同様気になりました。「Data:」 以降の「Version:」からでしょうか。

Signature Algorithm: sha256WithRSAEncryption
         95:fc:c2:4c:0d:bf:1f:da:87:d6:a4:49:d4:e4:32:f2:09:30:
         --16進数が続く-----
         c3:bb:c6:28

まとめ

ちょっと細かいところまでは詰めきれませんが大体こんな流れかと思います。