SCTに存在するLogID
がどのように作成されているのか書きたいと思います。
ここで言っているLogID
とは、下記のものです。
例としてgoogle.co.jp
にChromeでアクセスして表示させています。
まずLogIDがなんなのかCertificate TransparencyのRFC 6962
を確認してみます。
3.2. Structure of the Signed Certificate Timestamp
によれば
LogID
は、key_id
をフィールドにもつ構造体の様です。そして、key_id
はCTログサーバーの公開鍵を
DER
形式でSHA256ハッシュをとったものと書いてあるように見えます。
CTログサーバーの公開鍵があれば、LogIDを作れそうです。 CTログサーバー(Chromeのポリシーに対応する)の公開鍵は次から取得することができます。
www.certificate-transparency.org
始めの図の一つ目のLogID
である、Google 'Pilot' log
を作ってみます。Google 'Pilot' log
の公開鍵は下記のようです。
{ "description": "Google 'Pilot' log", "key": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfahLEimAoz2t01p3uMziiLOl/fHTDM0YDOhBRuiBARsV4UvxG2LdNgoIGLrtCzWE0J5APC2em4JlvR8EEEFMoA==", "url": "ct.googleapis.com/pilot/", "maximum_merge_delay": 86400, "operated_by": [ 0 ], "dns_api_endpoint": "pilot.ct.googleapis.com" }
KEY
にある値をEC鍵(Elliptic Curve)としてopenssl
でSHA256ハッシュをとってみます。
$ cat << EOF | openssl ec -outform der -pubin | openssl dgst -SHA256 -binary | hexdump -C -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfahLEimAoz2t01p3uMziiLOl/fHTDM0YDOhBRuiBARsV4UvxG2LdNgoIGLrtCzWE0J5APC2em4JlvR8EEEFMoA== -----END PUBLIC KEY----- EOF read EC key writing EC key 00000000 a4 b9 09 90 b4 18 58 14 87 bb 13 a2 cc 67 70 0a |......X......gp.| 00000010 3c 35 98 04 f9 1b df b8 e3 77 cd 0e c8 0d dc 10 |<5.......w......| 00000020
すると、はじめの図に記載した通りのLogID
を得ることができました。
ちなみに、CTでの署名アルゴリズムはRFC 6962
に下記のように記載されているように
NIST P-256
に記載される楕円曲線暗号を使うか、RSA
の最低2048bitの鍵で署名する必要があるようです。
2.1.4. Signatures
Various data structures are signed. A log MUST use either elliptic curve signatures using the NIST P-256 curve (Section D.1.2.3 of the Digital Signature Standard [DSS]) or RSA signatures (RSASSA-PKCS1- V1_5 with SHA-256, Section 8.2 of [RFC3447]) using a key of at least 2048 bits.