2009/12/05

authrootseq.txt authrootstl.cab

インターネットってのは原理的には盗聴し放題だったり
いつどこから誰がアクセスしてくるかも分からなかったりするので
盗聴とかユーザー認証とかするのに暗号技術ってのは基本リテラシーです
新版暗号技術入門とか分かりやすい

で、Windows の場合 CryptoAPI っていう API を持っていて
(Linux だと OpenSSL がスタンダードですかね)
暗号・PKI 関係を処理してくれています
capi とか capi2 とかいうみたいです
http://msdn.microsoft.com/en-us/library/aa380255(VS.85).aspx
こっから辿れば色々分かるのかな

テクノロジーは日々進歩して
結果 XP と Vista では CryptoAPI も大きく変わっているそうで
(2008 -> 2008 R2 でも随分と変わっているらしいけど)
例えば XP も Vista もルート証明書の自動インストール機能があるのに
Internet Explorer のセキュリティ Internet Explorer 7 の EV SSL 証明書の実装
にもある通りそのタイミングが違ったりしています

というかそもそも Vista/2008 は「信頼されたルート証明機関」が
インストール直後には 10 こも無かったりするんですが
必要に応じて勝手にインストールされてしまうわけです
例えば以下がお詳しいのではないかと
自堕落な技術者の日記 : Windows 7 RCを入れてみた(その2)
自堕落な技術者の日記 : Windowsルート認証機関の更新(2009.02)

でまぁ、確かに
Microsoft ルート証明書プログラムのメンバ (2009 年 2 月)
見たらどこが信頼されてるのかは分かるかもしれないですが
違う! そうじゃない! 欲しいのは証明書なんだっ!!
つうわけでどうしてるんだかちょっと調べてみました

で、ググっちゃみたんですが良く分からない
でも確かに IE on Vista で https://mixi.jp/ なんかにアクセスしてみると
ルート証明書が沢山インストールされてるのが確認できますし
mmc 経由で削除してもまたアクセスするとまたインストールされてます


良く分からなかったらパケットキャプチャだということで
Wireshark を使ってキャプチャーしてみました
http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootseq.txt
http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab
http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/02FAF3E291435468607857694DF5E45B68851868.crt
どうもこの辺りをダウンロードしてるみたいで関係あるみたい

でまぁ、この辺のファイル名とかでググればそれなりに情報が出てきます
authrootseq.txt は中を見るとテキストで何かシリアルみたいなものが
いま手元にあるのだと 1401CA5837700A984D って書いてありました

authrootstl.cab は中に authroot.stl ってのが入っていて
Vista で double click すると

1401CA5837700A984Dはシーケンス番号らしいし
どうやらこいつがリストっぽい

で、最後のは証明書で der で AddTrust の自己署名でした
$ sha1sum -b 02FAF3E291435468607857694DF5E45B68851868.crt 
02faf3e291435468607857694df5e45b68851868 *02FAF3E291435468607857694DF5E45B68851868.crt
なので、URI というか file name は DER を SHA1 したものみたい

で、authroot.stl ですわ
何か見辛いなと思ったし
「PKI 関係ならどうせ ASN.1 なんでしょ?」
と試しに asn1parse してみると
$ openssl asn1parse -inform der -in authroot.stl
0:d=0 hl=5 l=77575 cons: SEQUENCE
5:d=1 hl=2 l= 9 prim: OBJECT :pkcs7-signedData
16:d=1 hl=5 l=77559 cons: cont [ 0 ]
21:d=2 hl=5 l=77554 cons: SEQUENCE
26:d=3 hl=2 l= 1 prim: INTEGER :01
29:d=3 hl=2 l= 11 cons: SET
31:d=4 hl=2 l= 9 cons: SEQUENCE
33:d=5 hl=2 l= 5 prim: OBJECT :sha1
40:d=5 hl=2 l= 0 prim: NULL
42:d=3 hl=5 l=70016 cons: SEQUENCE
47:d=4 hl=2 l= 9 prim: OBJECT :1.3.6.1.4.1.311.10.1
58:d=4 hl=5 l=70000 cons: cont [ 0 ]
63:d=5 hl=5 l=69995 cons: SEQUENCE
68:d=6 hl=2 l= 12 cons: SEQUENCE
70:d=7 hl=2 l= 10 prim: OBJECT :1.3.6.1.4.1.311.10.3.9
82:d=6 hl=2 l= 9 prim: INTEGER :1401CA5837700A984D
93:d=6 hl=2 l= 13 prim: UTCTIME :091029013045Z
108:d=6 hl=2 l= 9 cons: SEQUENCE
110:d=7 hl=2 l= 5 prim: OBJECT :sha1
117:d=7 hl=2 l= 0 prim: NULL
119:d=6 hl=5 l=69939 cons: SEQUENCE
124:d=7 hl=3 l= 165 cons: SEQUENCE
127:d=8 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:A43489159A520F0D93D032CCAF37E7FE20A8B419
(以下略)
でたでた、PKCS#7 だったらしい、なるほど

AddTrust のは
(前略)
42165:d=7 hl=4 l= 261 cons: SEQUENCE
42169:d=8 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:02FAF3E291435468607857694DF5E45B68851868
42191:d=8 hl=3 l= 236 cons: SET
42194:d=9 hl=2 l= 32 cons: SEQUENCE
42196:d=10 hl=2 l= 10 prim: OBJECT :1.3.6.1.4.1.311.10.11.29
42208:d=10 hl=2 l= 18 cons: SET
42210:d=11 hl=2 l= 16 prim: OCTET STRING [HEX DUMP]:06F9583C00A763C23FB9E065A3366D55
42228:d=9 hl=2 l= 36 cons: SEQUENCE
42230:d=10 hl=2 l= 10 prim: OBJECT :1.3.6.1.4.1.311.10.11.11
42242:d=10 hl=2 l= 22 cons: SET
42244:d=11 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:5500530045005200540072007500730074000000
42266:d=9 hl=2 l= 36 cons: SEQUENCE
42268:d=10 hl=2 l= 10 prim: OBJECT :1.3.6.1.4.1.311.10.11.20
42280:d=10 hl=2 l= 22 cons: SET
42282:d=11 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:ADBD987A34B426F7FAC42654EF03BDE024CB541A
42304:d=9 hl=2 l= 54 cons: SEQUENCE
42306:d=10 hl=2 l= 10 prim: OBJECT :1.3.6.1.4.1.311.10.11.83
42318:d=10 hl=2 l= 40 cons: SET
42320:d=11 hl=2 l= 38 prim: OCTET STRING [HEX DUMP]:30243022060C2B06010401B231010201050130123010060A2B0601040182373C0101030200C0
42360:d=9 hl=2 l= 68 cons: SEQUENCE
42362:d=10 hl=2 l= 10 prim: OBJECT :1.3.6.1.4.1.311.10.11.9
42374:d=10 hl=2 l= 54 cons: SET
42376:d=11 hl=2 l= 52 prim: OCTET STRING [HEX DUMP]:303206082B0601050507030106082B0601050507030206082B0601050507030406082B0601050507030306082B06010505070308
(後略
ここら辺っぽい

1.3.6.1.4.1.311.10.11.29 っていう OID がありますが
これもググると wincrypt.h っていうファイルに
#define szOID_CERT_SUBJECT_NAME_MD5_HASH_PROP_ID            "1.3.6.1.4.1.311.10.11.29"
ってあるんで
Subject を md5 したもんでこれで捜すのかと推察
他の OID もそれぞれ興味深いんだけど、今は置いといて

つまり authroot.stl を見れば信頼されたルートの証明書の
DER での SHA1 値が分かってしまって
"SHA1 値.crt" で
http://www.download.windowsupdate.com/
を叩きまくってやったらいいんではないかと思うわけです

$ for i in `openssl asn1parse -inform der < authroot.stl | perl -ne '$a[0]=$a[1];$a[1]=$a[2];$a[2]=$a[3];$a[3]=$_;if (/1.3.6.1.4.1.311.10.11.29/) {$a[0]=~/.+:([0-9A-F]+)/; print $1 . "\n"}'`; do echo http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/$i.crt; done
なんかまぁ、これでいいのかどうかは置いといて
とりあえず何かスラズラーっと出てきました
ん〜、これで全部なんだろうか?
確認しようと思えばできるけどなぁ...

2009/12/03

Haskell import AF_INET

不要なものを import するなんて!
ってのが何原理主義なんだか分からないですが
fromMaybe だけ使いたい! って思ったら
import Data.Maybe (fromMaybe)
ってしろって色々書いてあります
素敵

AF_INET が欲しいと思ったんで
import Network.Socket (AF_INET)
ってしてみました
$ ghci af_inet.hs
GHCi, version 6.10.4: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main ( af_inet.hs, interpreted )

af_inet.hs:1:23: Module `Network.Socket' does not export `AF_INET'
Failed, modules loaded: none.
あら、"does not export" って言われてしまった

Prelude Network.Socket> :i AF_INET
data Family = ... | AF_INET | ...
-- Defined in Network.Socket.Internal
なるほど
AF_INET は Family っていう型の data constructor らしい
だから素直には呼べないのかな?
import Network.Socket (Family)
これは通るんだけど
$ ghci af_inet.hs
GHCi, version 6.10.4: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main ( af_inet.hs, interpreted )
Ok, modules loaded: Main.
*Main> AF_INET

<interactive>:1:0: Not in scope: data constructor `AF_INET'
そうよね、うんうん

残念ながらプログラミング Haskell にも記述が無く
色々ググっていたんですが、結局どうすればいいかっていうと
import Network.Socket (Family(AF_INET))
こうすればいいみたいでした
どこでこの記述見つけたんだかもぉ忘れちゃった

原理主義疲れる

haskell timeout

プログラミング Haskell って素敵本も買ってみて、
ちょいちょい「お勉強」してるんですが
Haskell で timeout したくなったらどうしよう!?
心配性なので事前に調べておかないと気になって仕方がありません
ググってみました

System.Timeout
timeout :: Int -> IO a -> IO (Maybe a)
何マイクロ秒待つか指定して
IO しようとして、失敗すると Nothing 返ってくるっぽい

試してみた
Prelude Network.HTTP System.Timeout> timeout (3*10^6) $ simpleHTTP $ getRequest "http://10.0.0.1/"
Nothing
Prelude Network.HTTP System.Timeout> timeout (3*10^6) $ simpleHTTP $ getRequest "http://google.com/"
Just (Right HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Sat, 05 Dec 2009 04:49:50 GMT
Expires: Mon, 04 Jan 2010 04:49:50 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 0
Connection: close

)
Prelude Network.HTTP System.Timeout>
何だこの最後の )Just ( の pair の ) じゃ
でもまぁ、待ててるみたいでした
Network.HTTP に timeout がある気がしないでもないけど、いつか調べよう