「Synology DS-216JでLet's Encryptの更新不具合」に「コメント(1時間のずれ)」が寄せられた。調べるのをすっかり忘れていた。
(1)状況
「Synology DS-216JでLet's Encryptの更新不具合で更新処理した時刻と発行された証明書の有効期間の時刻(Not Before)で1時間の差がある。発行された証明書のSCT(Signed Certificate Timestamps)の時刻は、更新処理した時刻となっている。
(2)Signed Certificates Timestampを調べてみる
「Certificate Transparency ~証明書の透明性とは何か〜(2016/4/22)」によるとこの時点でLet's Encryptは、Logサーバに登録はするけど証明書には埋め込まないと書かれている。
「Engineering deep dive: Encoding of SCTs in certificates(Apr 4, 2018 )」でLet's Encryptは、SCTを証明書に埋め込むとアナウンス。
crt.shでlogを調べてみる
「Synology DS-216JでLet's Encryptからサーバ証明書(Free)を得る」で最初に証明書を得たのが「2017/11/30」で「2018/2/3」の更新までLog登録は「PreCertificte」無しでSCTの埋め込みも無い。この時すでに証明書発行時刻とLog登録時刻に1時間の差が存在する。
2018/4のSCT埋込アナウンス後、「PreCertificte」のLog登録も行われ、証明書にSCTが埋め込まれるようになった。
(3)PreCertificateとCertificate
「Synology DS-216JでLet's Encryptの更新不具合」で更新された後に発行された2019/5/31の証明書をLogから確認してみた。
PreCertificate(2019/5/31 09:51:29)
申請のあった時刻より1時間前から有効期限が始まる証明書を発行し、 CT Precertificate Poison( 1.3.6.1.4.1.11129.2.4.3 )でLogサーバに登録しSCTを得る。
Logサーバーに登録してSCTをえた時刻: 2019/05/31 09:51:30 GMT
証明書の有効開始時刻: 2019/05/31 08:51:29 GMT
Certificate(2019/5/31 09:51:30)
PreCertificateをLogサーバーに登録して得たSCTを証明書に埋込後CA署名し発行する。シリアル番号、有効期限などの情報変更なし。
LogIDは、Logサーバーの公開鍵(DER)をSHA256ハッシュした値。
「certificate-transparency-community-site」にある「The list of all known and announced CT Logs」の「log_id」からLogサーバーの情報が得られる。
証明書内の「CT Precertificate SCTs」にある最初のサーバーのLog_ID「74:7E:DA:83:31:AD:33:10:91:21:9C:CE:25:4F:42:70:C2:BF:FD:5E:42:20:08:C6:37:35:79:E6:10:7B:CC:56」をbase64に変換する「dH7agzGtMxCRIZzOJU9CcMK//V5CIAjGNzV55hB7zFY=」でリストを検索するとが得られる。
「https://ct.cloudflare.com/logs/nimbus2019/」は、2020/2/7にクローズされ「Not Found」状態。
現在有効な証明書で確認してみる
https://ct.cloudflare.com/logs/nimbus2023/
(3)まとめ
Let's EncryptがPreCertificateを生成する時、更新時刻より1時間前の時刻を有効期間の開始時刻として生成するため。
(1)状況
「Synology DS-216JでLet's Encryptの更新不具合で更新処理した時刻と発行された証明書の有効期間の時刻(Not Before)で1時間の差がある。発行された証明書のSCT(Signed Certificate Timestamps)の時刻は、更新処理した時刻となっている。
(2)Signed Certificates Timestampを調べてみる
「Certificate Transparency ~証明書の透明性とは何か〜(2016/4/22)」によるとこの時点でLet's Encryptは、Logサーバに登録はするけど証明書には埋め込まないと書かれている。
「Engineering deep dive: Encoding of SCTs in certificates(Apr 4, 2018 )」でLet's Encryptは、SCTを証明書に埋め込むとアナウンス。
crt.shでlogを調べてみる
「Synology DS-216JでLet's Encryptからサーバ証明書(Free)を得る」で最初に証明書を得たのが「2017/11/30」で「2018/2/3」の更新までLog登録は「PreCertificte」無しでSCTの埋め込みも無い。この時すでに証明書発行時刻とLog登録時刻に1時間の差が存在する。
2018/4のSCT埋込アナウンス後、「PreCertificte」のLog登録も行われ、証明書にSCTが埋め込まれるようになった。
(3)PreCertificateとCertificate
「Synology DS-216JでLet's Encryptの更新不具合」で更新された後に発行された2019/5/31の証明書をLogから確認してみた。
PreCertificate(2019/5/31 09:51:29)
申請のあった時刻より1時間前から有効期限が始まる証明書を発行し、 CT Precertificate Poison( 1.3.6.1.4.1.11129.2.4.3 )でLogサーバに登録しSCTを得る。
Logサーバーに登録してSCTをえた時刻: 2019/05/31 09:51:30 GMT
証明書の有効開始時刻: 2019/05/31 08:51:29 GMT
Certificate(2019/5/31 09:51:30)
PreCertificateをLogサーバーに登録して得たSCTを証明書に埋込後CA署名し発行する。シリアル番号、有効期限などの情報変更なし。
LogIDは、Logサーバーの公開鍵(DER)をSHA256ハッシュした値。
「certificate-transparency-community-site」にある「The list of all known and announced CT Logs」の「log_id」からLogサーバーの情報が得られる。
証明書内の「CT Precertificate SCTs」にある最初のサーバーのLog_ID「74:7E:DA:83:31:AD:33:10:91:21:9C:CE:25:4F:42:70:C2:BF:FD:5E:42:20:08:C6:37:35:79:E6:10:7B:CC:56」をbase64に変換する
$ cat <<EOF | xxd -r -p | openssl enc -base64
> 74:7E:DA:83:31:AD:33:10:91:21:9C:CE:25:4F:42:70:C2:BF:FD:5E:42:20:08:C6:37:35:79:E6:10:7B:CC:56
> EOF
dH7agzGtMxCRIZzOJU9CcMK//V5CIAjGNzV55hB7zFY=
{
"description": "Cloudflare 'Nimbus2019' Log",
"log_id": "dH7agzGtMxCRIZzOJU9CcMK//V5CIAjGNzV55hB7zFY=",
"key": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkZHz1v5r8a9LmXSMegYZAg4UW+Ug56GtNfJTDNFZuubEJYgWf4FcC5D+ZkYwttXTDSo4OkanG9b3AI4swIQ28g==",
"url": "https://ct.cloudflare.com/logs/nimbus2019/",
"mmd": 86400,
"state": {
"rejected": {
"timestamp": "2020-02-07T00:00:00Z"
}
},
"temporal_interval": {
"start_inclusive": "2019-01-01T00:00:00Z",
"end_exclusive": "2020-01-01T00:00:00Z"
}
}
「https://ct.cloudflare.com/logs/nimbus2019/」は、2020/2/7にクローズされ「Not Found」状態。
現在有効な証明書で確認してみる
SCTの最初のログサーバー
Key_ID=7A 32 8C 54 D8 B7 2D B6 20 EA 38 E0 52 1E E9 84 16 70 32 13 85 4D 3B D2 2B C1 3A 57 A3 52 EB 52
$ cat <<EOF | xxd -r -p | openssl enc -base64
> 7A 32 8C 54 D8 B7 2D B6 20 EA 38 E0 52 1E E9 84 16 70 32 13 85 4D 3B D2 2B C1 3A 57 A3 52 EB 52
> EOF
ejKMVNi3LbYg6jjgUh7phBZwMhOFTTvSK8E6V6NS61I=
-------------------
{
"description": "Cloudflare 'Nimbus2023' Log",
"log_id": "ejKMVNi3LbYg6jjgUh7phBZwMhOFTTvSK8E6V6NS61I=",
"key": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEi/8tkhjLRp0SXrlZdTzNkTd6HqmcmXiDJz3fAdWLgOhjmv4mohvRhwXul9bgW0ODgRwC9UGAgH/vpGHPvIS1qA==",
"url": "https://ct.cloudflare.com/logs/nimbus2023/",
"mmd": 86400,
"state": {
"usable": {
"timestamp": "2019-10-31T19:22:00Z"
}
},
"temporal_interval": {
"start_inclusive": "2023-01-01T00:00:00Z",
"end_exclusive": "2024-01-01T00:00:00Z"
}
}
https://ct.cloudflare.com/logs/nimbus2023/
(3)まとめ
Let's EncryptがPreCertificateを生成する時、更新時刻より1時間前の時刻を有効期間の開始時刻として生成するため。
なぜ「1時間早い時間」になるのでしょうか
数分ではなく、30分でもなく、半日や1日でもなく、1時間とはどういう理由なのかとても気になります
サマータイムが関係してるのでしょうか
---------
1時間のズレがSynology DS-216Jアプリケーションによるズレでない事を確認しています。
---------
あくまでも推測ですが、
SCTより前の時刻で、処理時間などを考慮し、十二分な時間を設定した結果が「1時間」だった。