Contents

`openssl x509 -hash` は何のハッシュを計算しているか

Contents

English: What does openssl x509 -hash calculate the hash of?

1
2
openssl req -out example.crt -keyout example.key -newkey rsa:2048 -nodes -x509 -subj '/C=US/CN=example.com' -days 3650
openssl x509 -in example.crt -hash -noout  # 8927dc31

8927dc31 は、subject (-issuer_hash ならissuer) のASN.1表現のsha1ハッシュ。以下のように計算できる。

1
2
3
4
5
6
7
8
9
echo '
  310b30 09060355
04060c02 75733114
30120603 5504030c
0b657861 6d706c65
2e636f6d
' | xxd -r -p | sha1sum
# => 31dc2789c1e1182fbfbb64ee0a0c9a6e11276f97  -
# 31 dc 27 89 --CPUがリトルエンディアンなら反転--> 89 27 dc 31 -> 8927dc31

この 310b30... というのは wireshark example.crt で見つかる。

/ja/openssl-hash/2022-02-06-14-16-52.png
WiresharkでsubjectのASN.1表現を見つける

最後の反転は違和感がある。エンディアンが異なると値が変わっちゃうし。 ここで ntohl() すべきだったのだろうと思う。

ちなみにsubjectが空なら空データのsha1になる。

1
2
3
4
5
openssl req -out example.crt -keyout example.key -newkey rsa:2048 -nodes -x509 -subj '/' -days 3650
openssl x509 -in example.crt -hash -noout  # eea339da
sha1sum </dev/null
# => da39a3ee5e6b4b0d3255bfef95601890afd80709  -
# da 39 a3 ee ... -> flip bytes: ee a3 39 da: eea339da