ものがたり(旧)

atsushieno.hatenablog.com に続く

NegotiateServiceCredentials, probably mostly useless

MSのGSSAPI実装にはバグがあるらしい

http://www3.ietf.org/proceedings/04aug/229.htm

GSSAPI実装って、つまりKerberosのことなんだけど。GSSAPI SPNEGO Issuesというセクションに次のような一文がある。

We couldn't find a way of producing a implementation that followed the spec and interoperated with MS.

ところでWSHttpBinding.Security.NegotiateServiceCredentialsをtrueにしていると、このspnegoあるいはsslnegoを使うことになるのだが、既に仕様違反と思しきspnegoとは違って、sslnegoは標準準拠になり得るのかと思いきや、全然そんなことは無かったのである。

WS-Trustに基づくRequestSecurityToken (RST)とRequestSecurityTokenResponse (RSTR)でTLS 1.0のnegotiationをClientHelloからServerFinished*1までやり取りして得られるSecurityContextToken (SCT)の中身は、まずデフォルトではDPAPIで暗号化されていてWindows以外では中に入っていると思しきsymmetric keyを取り出せない。

SecurityContextTokenの中身が標準仕様としてまともに策定されていない時点で、WS-SecureConversation逝って良しと考えるのが、おそらく僕ら一般人の反応であろう。

さて、ちょっとした技を使えばこのSCTの中身をDPAPIで暗号化しないようにすることが出来るのだが*2、それでもこのSCTの中に含まれる↓のようなバイナリデータのフォーマットは、通常人には理解できないだろう。

42 00 42 02 83 42 06 99 2B 75 75 69 64 2D 38 36 36 65 33 31 63 37 2D 39 35 33 62 2D 34 32 39 32 2D 38 30 34 37 2D 30 61 38 36 63 62 64 34 31 63 31 34 2D 31 42 04 AD ED FA 75 15 E6 38 41 43 8F 22 A3 2B 85 7F 6C 7F 42 08 9E 1E 3E 61 45 81 04 70 A8 66 59 2E 90 C4 20 8E 31 21 86 F6 1A 01 A2 AB 75 75 35 05 EB 3A 56 8D 9F 02 11 A3 42 0E 8F C6 E4 E9 D4 9A 33 C9 08 42 10 8F C6 F4 95 A6 EE 33 C9 08 42 14 8F C6 E4 E9 D4 9A 33 C9 08 42 16 8F C6 F4 95 A6 EE 33 C9 08 01

僕がbinary XmlDictionaryWriterのデータフォーマットであることを思い出すことが出来たのも奇跡に近い。utf16でもねえしbinary serialization formatでもねえ…と何時間か考えさせられた*3。binary dictionary readerなんて1年以上いじってねえし、忘れとるわ。

で、結局のところ何が言いたいかというと、WCFとinteroperabilityを実現していると宣伝している製品がいくつかあるようだが、いかがわしいなということである。少なくともXmlDictionaryReaderのデータ形式を解読するコードが無いと実装できないと思うのだが、本当に作っているものだろうか?

*1:実際にはClientFinishedまで処理すれば、その応答となるServerFinishedは無視出来る。

*2:ヒント: SecureConversationServiceCredential

*3:というか、最初はそもそもDPAPIで暗号化されたものから書式を読み取ろうと試みた。