SCTに存在するLogID
がどのように作成されているのか書きたいと思います。
ここで言っているLogID
とは、下記のものです。
google .co.jp-signed-certificate-timestamp-logid
例としてgoogle.co.jp
にChrome でアクセスして表示させています。
まずLogIDがなんなのかCertificate TransparencyのRFC 6962
を確認してみます。
tools.ietf.org
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.