2013/09/22

opensslのルート証明書がほしかった

cygwinからopensslを使ってみようとした。
openssl自体は、普通にcygwinのsetupツールからインストールできる。
できるのだが、openssl自体はルート証明書を入れてないということだ。

/usr/ssl/certs/README.RootCerts

The OpenSSL project does not (any longer) include root CA certificates.

Please check out the FAQ:
  * How can I set up a bundle of commercial root CA certificates?

リンク先を見ると、ルート証明書は提供してないから、好きにしな、とある。
それだけでは不親切と思ったのか、別のところではこうしている例もあるよ、というリンクがある。
Mozillaの例らしい。

リンク先にはperlのスクリプトがあり、cvsで取ってきて加工するようなのだが・・・。
pserverのところが[EMAIL PROTECTED]になってて、どこだかわからない。

 

で、みんなどうしているかというと、Mozillaのルート証明書をとってきてるみたいだ。
http://curl.haxx.se/ca/cacert.pem

でも、なんかすっきりしない・・・。
haxxって誰だよー、って気もする。
cacert.pemをテキストエディタで開くと、元データのURLがあった。
こっちはmozilla.orgだから、これを使ってみよう。

http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1

このcertdata.txtを取ってくるのがさっきpserverがわからんといってたところだから、certdata.txtを別でダウンロードして、catで吐きだしたものをスクリプトにすればいいんじゃなかろうかね。
あるいは、curlで取ってくるか(curlって、cat urlの略なのか?)。

   1: #!/usr/bin/perl -w
   2: #
   3: # Used to regenerate ca-bundle.crt from the Mozilla certdata.txt.
   4: # Run as ./mkcabundle.pl >; ca-bundle.crt
   5: #
   6: #original
   7: #http://www.mail-archive.com/modssl-users@modssl.org/msg16980.html
   8:  
   9: my $curltxt = 'http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1';
  10: my $certdata = 'certdata.txt';
  11:  
  12: #open(IN, "cat $curltxt |")
  13: open(IN, "curl $curltxt |")
  14:     || die "could not check out certdata.txt";
  15: 
  16: my $incert = 0;
  17:  
  18: print<;<EOH;
  19: # This is a bundle of X.509 certificates of public Certificate
  20: # Authorities.  It was generated from the Mozilla root CA list.
  21: #
  22: # Source: $certdata
  23: #
  24: EOH
  25:  
  26: while (<;IN>) {
  27:     if (/^CKA_VALUE MULTILINE_OCTAL/) {
  28:         $incert = 1;
  29:         open(OUT, "|openssl x509 -text -inform DER -fingerprint")
  30:             || die "could not pipe to openssl x509";
  31:     } elsif (/^END/ && $incert) {
  32:         close(OUT);
  33:         $incert = 0;
  34:         print "\n\n";
  35:     } elsif ($incert) {
  36:         my @bs = split(/\\/);
  37:         foreach my $b (@bs) {
  38:             chomp $b;
  39:             printf(OUT "%c", oct($b)) unless $b eq '';
  40:         }
  41:     } elsif (/^CVS_ID.*Revision: ([^ ]*).*/) {
  42:         print "# Generated from certdata.txt RCS revision $1\n#\n";
  43:     }
  44: }
  45:  

なんとかなりそうだ。

が、これで作ったcrtファイルは900KB近くある。
haxxさんから取ってきたpemは220KBくらい。
むぅ。

 

ここまで読んでこられて気付いたかもしれないが、私はこの辺りはまったくわかっていない。
pemとかcrtとか出てきても、「ぺむ?」くらいにしか思っていない。
ちょっと調べておかないと痛い目に会いそうだ・・・。

http://ja.wikipedia.org/wiki/X.509
まずよく聞く「X.509」だが、これは証明書の形式みたいなものらしい。
断りがなければ、証明書と言えばX.509の形式なのかな?

で、形式といっても「こんな構造で書け」というようなタイプみたいで、形式に沿っていればテキストでもバイナリでもよく、テキストも暗号化したりしてよいみたいだ。
ここら辺で、さっきのpemとかcrtが出てくるみたいだ。

wikipediaには、CER, DER, PEMはあったけど、CRTがない。
さっきのスクリプトでは、「openssl x509 -text -inform DER -fingerprint」となってるから、certdata.txtにはさまってる\xxxってなってるところがバイナリなのだろう。
-outformの指定がないが、デフォルトがわからん。PEMかDERかNET(Netscape)。。。試すとPEMだった。

haxxさんとの違いは、Signatureのことが書いてあるかどうかみたいな感じがする。
-textオプションをなくすとよさそうだ。

・・・とここまで調べて、haxxさんのところに変換スクリプトの紹介があることに気付いた。
まあ、世の中そんなもんだ。
http://curl.haxx.se/docs/caextract.html

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。