So-net無料ブログ作成
メッセージを送る

DANEのTLSA RRのCertificate Association Data部をopenssl(1)で出力してみる

DNSSEC and Certificatesを見て、いろんなSelectorMatching TypeTLSA RRCertificate Association Data Fieldの出力方法をメモっておこうと思った次第。

hash-slingerとかGnuTLSdanetoolとか使えば一撃なんでしょうけど、そこはなるべく普通に入っていそうなもんでなんとかしようかといったところです。

まず、TLSA RRの例は、RFC6698によると以下のような感じです。https://www.example.com/用の場合ですかね。

_443._tcp.www.example.com. IN TLSA (
    0 0 1 d2abde240d7cd3ee6b4b28c54df034b9
            7983a1d16e8a410e4561cb106618e971 )


要するに、d2abde240d7cd3e...なところを主にopenssl(1)でも使って出力していこうかという話。

ちなみに、0 0 1なところはRFC6698によると、順に、Certificate Usage FieldSelector FieldMatching Type Fieldだそうです。

Certificate Usage Fieldは0~3までが目的が決まっているようで、私のような下々の人々が使うのは1か3でしょうか。1はCAから発行された証明書なんかのときに、3はオレオレなんかのときに使います。正確にはPKIX certification path validationにパスすることが必須の場合は1で、不要な場合は3ですので、CAからちゃんと発行された証明書でも別にPKIX certification path validation不要なら3にしても構わないかと思います。尚、0はCAなんかの証明書で2はトラストアンカーといったところかと思われます。以下、Certificate Usage Fieldは3で記載していきます。

Selector Fieldは0か1で、0がFull certificate、1がSubjectPublicKeyInfo。ざっくり要約してしまえば、証明書全体か公開鍵部分かといったところです。

Matching Type Fieldは0~2で、0がSelector Fieldで指定したもの全体、1がそのSHA-256、2がそのSHA-512です。

以上を踏まえて作っていくことに。以下、server.crtをPEMなX.509証明書とします。

Selector Fieldが0で、Matching Type Fieldが1の場合。

$ openssl x509 -in server.crt -inform PEM \
-outform DER | openssl dgst -sha256
(stdin)= 11ac76469b7d60019acb39109caef2954ffdfe8a3155e1f143f088db8ce4421b


として、この値からTLSA RRは、

_443._tcp.www.example.jp. 86400 IN TLSA 3 0 1 11ac76469b7d60019acb39109caef2954ffdfe8a3155e1f143f088db8ce4421b


みたいな感じにします。Selector Fieldが0で、Matching Type Fieldが2の場合は、-sha256のところを-sha512にして、3 0 1のところを3 0 2にします。

取り敢えず、Matching Type Fieldが0の場合は後回しにして、Selector Fieldが1で、Matching Type Fieldが1の場合。証明書から公開鍵を取り出してそれをDERエンコードで出力してやって、SHA-256を取ればよいから、

$ openssl x509 -in server.crt -inform PEM -pubkey \
-noout | openssl asn1parse -out subject.der -noout


として、得られたsubject.der

$ openssl dgst -sha256 subject.der
SHA256(subject.der)= ae3b460d3cae8d5596896485a0df58ea22af8a8a75066f045c4b88e47cf55ae1


とすればCertificate Association Data Field値が得られますので、TLSA RRは、

_443._tcp.www.example.jp. 86400 IN TLSA 3 1 1 ae3b460d3cae8d5596896485a0df58ea22af8a8a75066f045c4b88e47cf55ae1


といった感じになります。Selector Fieldが1で、Matching Type Fieldが2の場合は、-sha256のところを-sha512にして、3 1 1のところを3 1 2にします。

後は、Matching Type Fieldが0の場合。あんまり使わないと思いますけど一応書いておこうかと。

Selector Fieldが0の場合は、

$ openssl x509 -in server.crt -inform PEM \
-outform DER | hexdump -e '4/1 "%02x"'
308203f53082035ea003020102020313f...


とすればCertificate Association Data Field値が得られますので、TLSA RRは、

_443._tcp.www.example.jp. 86400 IN TLSA 3 0 0 308203f53082035ea003020102020313f...


といった感じに。Matching Type Fieldが0でSelector Fieldが1の場合は、先に作ったsubject.derに対して、

$ hexdump -e '4/1 "%02x"' subject.der
30820122300d06092a864886f...


とすればCertificate Association Data Field値が得られますので、TLSA RRは、

_443._tcp.www.example.jp. 86400 IN TLSA 3 1 0 30820122300d06092a864886f...


といった感じになります。hexdump -e '4/1 "%02x"' subject.derは、hexdump(1)の代わりにod(1)awk(1)tr(1)を使って、od -t x1 subject.der | awk '{$1="";print}' | tr -d " \t\r\n"としてもいけるかと思います。もっとうまいやり方があるのかもしれませんけど。もっと良さげなオプションとかあれば教えて誰か教えて頂けると幸い。後、長すぎる場合は、()付けてmulti-line formatにするとかして工夫した方がいいのかもしれません。

直接関係ないですけど、DANE Test Siteshttps://www.nlnetlabs.nl/TLSA RRを参照すると以下のような出力が。

$ dig +dnssec +multi +noall +answer _443._tcp.www.nlnetlabs.nl. tlsa @127.0.0.1
_443._tcp.www.nlnetlabs.nl. 10166 IN CNAME 3.1.1._dane.nlnetlabs.nl.
_443._tcp.www.nlnetlabs.nl. 10166 IN RRSIG CNAME 8 5 10200 (
                                20121112005005 20121015005005 42393 nlnetlabs.nl.
                                AdqZ9MBS/LWP2y7X08F6vqB8207/bwty0GyCVDkUV3XP
                                ZsKyfUXBDvSLn69JpN9lTM+GndCCYABgNy2VJ6XApiKu
                                R1lwql8EHj+0e8VDxxZATVUFFy5XhnFbtoP1p8zEMXRr
                                TjJ4qAmgP0hmj91QkhVrll93PJM8H7c1rikpT6A= )
3.1.1._dane.nlnetlabs.nl. 10166 IN TLSA 3 1 1 (
                                0D1FCBD71686199607A132744A4918FC209565C91FA8
                                E9FFEEA0AAFD6B9305F6 )
3.1.1._dane.nlnetlabs.nl. 10166 IN RRSIG TLSA 8 6 10200 (
                                20121112005003 20121015005003 42393 nlnetlabs.nl.
                                GITh2HgD1va3ctKoEAoJ5YJmV5FpBTN5kjgxi4DX0QLq
                                /+DxQ3+yLj3HReTbmRKgVaeKImpOg9wEuJEkO8b3co5J
                                RrJOxO2sS542oN46y5zaZrk3OH78tofTx22axdIPgdRm
                                Uxn+wQheL/tDRDoFdmsdqYbneiBWz+yh5pM3QaY= )


ワイルドカードな証明書持ってて、メールとかにも併用してたりする場合なんかには便利な書き方かも。

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は1年以上新しい記事の更新がないブログに表示されております。