[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[upki-fed:00478] Re: how to sign metadata?



土屋です.

>> On Thu, 28 Jun 2012 15:35:29 +0900
>> xxxxxxx@xxxxxxxxx (Takeshi NISHIMURA) said as follows:

>学認では、xmlsectoolというツールを使っています。
>https://wiki.shibboleth.net/confluence/display/SHIB2/XmlSecTool

>samlsignとの差分を調べたことはありませんが、以下のような特徴があります。
>- 前段階としてXMLのスキーマチェックを行なうことができる
>- OpenSSLの機能を使ってUSBトークン内の署名鍵も使える
>- パスワードのかかった署名鍵を使える(ただしコマンドラインオプションにパスワードを記述しなければならない)

これはイマイチですね.

samlsign の仕様もイマイチなので,パスワードのかかっていない署名鍵を RAM
ディスク上に一時的に置くラッパースクリプトを書いて誤魔化しています.

>事前にメタデータのスキーマをチェックする場合は、コマンドラインオプションの末尾に
>	--validateSchema --schemaDirectory /usr/local/etc/schema
>を追加します。--schemaDirecotryには添付のようなスキーマを配置しておきます。

なるほど,validation は重要ですね.

こちらも,運用手順に validation を組み込むことにしようと思って,少し調べ
ました.

    https://wiki.shibboleth.net/confluence/display/SHIB2/MetadataCorrectness

に情報がありましたので,折角なので xmllint を試してみました.ところがこい
つが異様に misleading な出力をするので,小1時間はまりました.コマンド実行
例を以下に示します.

$ wget https://metadata.gakunin.nii.ac.jp/gakunin-test-metadata.xml
$ xmllint --schema http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xsd --noout --valid --load-trace gakunin-test-metadata.xml 
Loaded URL="http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xsd" ID="(null)"
Loaded URL="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd" ID="(null)"
Loaded URL="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/xenc-schema.xsd" ID="(null)"
Loaded URL="http://docs.oasis-open.org/security/saml/v2.0/saml-schema-assertion-2.0.xsd" ID="(null)"
Loaded URL="http://www.w3.org/2001/xml.xsd" ID="(null)"
Loaded URL="gakunin-test-metadata.xml" ID="(null)"
gakunin-test-metadata.xml:1: validity error : Validation failed: no DTD found !
g/2001/XMLSchema-instance" Name="GakuNin-test" validUntil="2012-07-12T14:00:00Z"
                                                                               ^
gakunin-test-metadata.xml validates

という表示「validity error」で validation が通っていると思います?

実は,これが validation は通っているらしいのです.明示的にスキーマで許さ
れていない構文要素を挿入した XML ファイルを作って xmllint にかけてみたと
ころ最後の行が,

corrputed.xml:7: element hello: Schemas validity error : Element '{urn:oasis:names:tc:SAML:2.0:metadata}hello': This element is not expected. Expected is one of ( {http://www.w3.org/2000/09/xmldsig#}Signature, {urn:oasis:names:tc:SAML:2.0:metadata}Extensions, {urn:oasis:names:tc:SAML:2.0:metadata}EntityDescriptor, {urn:oasis:names:tc:SAML:2.0:metadata}EntitiesDescriptor ).
corrputed.xml fails to validate

というように変わりました.いやはや.

># 添付は、Shibboleth SPのパッケージから取得し、リモートスキーマを参照しないよう
># に修正したものです。

わざわざローカル参照で済むように調整したスキーマを用意してくださってどう
も有難うございます.何回か validation をやってみて,www.w3.org からのダウ
ンロードの遅さにしいらいらしました.このスキーマを使う場合は,

$ xmllint --schema saml-schema-metadata-2.0.xsd --path `pwd`/schema --noout --valid --load-trace gakunin-test-metadata.xml 

というように --path オプションでディレクトリを指定してやれば良いようです.

というわけで,本学のメタデータ署名手順も validation に失敗したメタデータ
を弾くようになりました.

なお,メタデータ署名鍵も key rollover を避けられないわけです.例えば,

$ openssl x509 -in gakunin-test-signer-2011.cer -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            dd:98:a1:aa:a7:b8:29:0e
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=JP, O=GakuNin TEST - Japanese Test Federation, CN=GakuNin TEST Metadata Signer
        Validity
            Not Before: Jan 14 11:29:30 2011 GMT
            Not After : Jan 14 11:29:30 2021 GMT

なので,学認テストフェデレーションだと2021年に問題が発生します.この手順
は検討されたでしょうか? 普通に新しい鍵を用意して,新しい鍵を使って署名し
たメタデータと,古い鍵を使って署名したメタデータを一定期間並行配布するし
かないでしょうか?

1つの思いつきですが,メタデータ署名鍵を,さらに認証局で署名してもらったら
どうでしょう?

$ openssl req -newkey rsa:2048 -keyout federation.key -keyform PEM -out federation.req -outform PEM
$ openssl ca -in federation.req -config openssl.cnf

こうやって作ったメタデータ署名鍵は,大学ローカルな自己認証局の公開鍵
localca.pem で検証できるので,federation.cer を直接配布する代わり
に,localca.pem を配布するだけで済ませられないかなあ,TrustEngine の設定
でうまくできないかなあと暫く考えてみたのですが,ここで本日の作業時間切れ.

10年後の作業量を減らすために,今苦労するというのはモチベーションが維持し
にくいです.

-- 
土屋 雅稔 ( TSUCHIYA Masatoshi )