zkat’s diary

技術ブログ

SCT(Signed Certificate Timestamp)のLogIDについて

SCTに存在するLogIDがどのように作成されているのか書きたいと思います。 ここで言っているLogIDとは、下記のものです。

f:id:zkat:20190420122437j:plain
google.co.jp-signed-certificate-timestamp-logid

例としてgoogle.co.jpChromeでアクセスして表示させています。
まず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.