Let’s Encrypt のサーバ証明書や秘密鍵をちょっとだけ深追い x509 サーバ証明書
サーバ証明書のフォーマットは「x509」と呼ばれる書式ですね。秘密鍵の「PKCS#1」と比べると数学的には簡単で理解はしやすいですね。
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
まとめ
ちょっと細かいところまでは詰めきれませんが大体こんな流れかと思います。