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

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



西村です。

出遅れてしまいました。大変申し訳ございません。いろいろと確認のため調べていたら時間がかかってしまいました。

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

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

手順は以下のようになります。Javaはすでにインストールされているものとしています。
(手順はバージョン1.1.4のものですが、最新版は1.1.5です。ハッシュ値は以下の通り。)
86da5e39508a5e80c51f6ffe680709828c806a3780a1fd192757cd44bd675391  xmlsectool-1.1.5-bin.zip

----- ここから

0. ツールの取得
$ cd ~
$ wget http://shibboleth.net/downloads/tools/xmlsectool/1.1.4/xmlsectool-1.1.4-bin.zip
$ sha256sum xmlsectool-1.1.4-bin.zip
727e988b5a6f2652ea597dd847f00063e577d43da5901bb14efbf8aacd63bb77  xmlsectool-1.1.4-bin.zip
$ unzip xmlsectool-1.1.4-bin.zip
$ cd ~/xmlsectool-1.1.4

1. 署名鍵を生成
$ openssl genrsa -des3 2048 > test.key
(適当なパスワードを設定)
$ openssl rsa -new -key test.key -out test.crt -x509 -subj "/CN=Soft Signer"
(上で設定した署名鍵のパスワードを入力)

2. gakunin-metadata-unsigned.xmlに対して署名を実行
$ env JAVA_HOME=/usr/lib/jvm/jre ./xmlsectool.sh --sign --inFile gakunin-metadata-unsigned.xml --outFile gakunin-metadata-signed.xml --key test.key --keyPassword '***' --certificate test.crt

事前にメタデータのスキーマをチェックする場合は、コマンドラインオプションの末尾に
	--validateSchema --schemaDirectory /usr/local/etc/schema
を追加します。--schemaDirecotryには添付のようなスキーマを配置しておきます。
# 添付は、Shibboleth SPのパッケージから取得し、リモートスキーマを参照しないよう
# に修正したものです。

おまけ. 署名検証
$ env JAVA_HOME=/usr/lib/jvm/jre ./xmlsectool.sh --verifySignature --signatureRequired --certificate test.crt --inFile gakunin-metadata-signed.xml

----- ここまで

出力例は以下になります。
https://metadata.gakunin.nii.ac.jp/gakunin-test-metadata.xml
# 実は運用フェデレーションでは別の(古い)署名ツールを使っていますので出力が若干異なります。
# こちらもxmlsectoolに移行予定です。

> という判断をして,メタデータには validUntil 属性を設定しませんでした.

validUntilについてはお書きの通り、過去の任意の時点のメタデータを誤って信頼
しないようにするためのもので、いちおう署名とは独立した機能(プラスαの機能)
と考えて問題ありません。
また、validUntilが設定されていればそれで十分かというとそうではなく、有効な
期間を狭めている(例えば2週間とか)だけでその間は依然として攻撃される可能性
がありますので、インシデント発生時は(これもお書きの通りですが)管理者への連絡および
更新依頼が欠かせないことに変わりはありません。

ということで、土屋さんの選択に賛成です。

PS
思い付きで、IdPが1つでSPが複数あるシチュエーションでIdPのメタデータを配りたいという
要望であれば、IdPの署名機能が使えれば… と思ったのですが、メタデータに署名する
という機能はありませんでした。
SPには「自分のメタデータに自分の鍵で署名する」という機能がありまして、それと混同していたようです。
https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPHandler#NativeSPHandler-MetadataGenerationHandler


On 2012/06/27, at 16:31, TSUCHIYA Masatoshi wrote:

> 土屋です.
> 
> 表題の件,自己解決しました.
> 
>>> On Tue, 26 Jun 2012 00:46:40 +0900
>>> xxxxxxxx@xxxxxx (TSUCHIYA Masatoshi) said as follows:
> 
>> (2) または,xmlsec というコマンド以外に何か簡単な署名方法はあるのでしょ
>> うか?
> 
> Debian だと opensaml2-tools というパッケージに入っている samlsign という
> ツールを使えば楽勝でした.
> 
> 以下,手順の概要をまとめておきます.
> 
> (1) OpenSSL でメタデータ署名用の鍵ペアを作る.
> 
> openssl req -newkey rsa:2048 -keyout federation.key -keyform PEM -out federation.req -outform PEM
> openssl x509 -in federation.req -out federation.cer -req -signkey federation.key -days 3650
> 
> (2) samlsign は暗号化された秘密鍵を読み込むことができないので,暗号化を
> 解除しておく.
> 
> openssl rsa -in federation.key -out federation_cleartext.key
> 
> (3) samlsign でメタデータに署名する.
> 
> samlsign -s -k ./federation_cleartext.key -c ./federation.cer -f ./unsigned_metadata.xml > metadata.xml
> 
> 各ファイルは必ず絶対パスか ./ を省略しない相対パスかで記述する必要があり
> ます.でないと,samlsign が /etc/openssl/ の下を探しに行ってエラーになり
> ます.
> 
> (4) 署名したメタデータをどこか適当なウェブサーバからダウンロードできるよ
> うにしておく.例えば,
> 
> https://idp.example.net/metadata/federation.xml
> 
> (5) IdP で上記メタデータを読み込む設定をする.IdP が稼働しているサーバと
> メタデータ配布サーバを同居させたので,特に難しいことはなく,relying-party.xml
> に以下のように記述すれば良い
> 
> <MetadataProvider id="ShibbolethMetadata" xsi:type="ChainingMetadataProvider" xmlns="urn:mace:shibboleth:2.0:metadata">
>    <MetadataProvider id="IdPMD" xsi:type="FilesystemMetadataProvider"
>                      metadataFile="/usr/share/metadata/federation.xml" />
>    (略)
> </MetadataProvider>
> 
> (5) メタデータの署名に使った公開鍵 federation.cer を,SP にコピーしておく.
> 
> (6) SP で上記メタデータを読み込む設定をする.
> /etc/shibboleth/shibboleth2.xml に以下を記述.
> 
> <MetadataProvider type="Chaining">
>    <MetadataProvider type="XML" uri="https://idp.example.net/metadata/federation.xml"
>                      backingFilePath="/var/lib/shibboleth/federation.xml"
>                      reloadInterval="3600">
>        <!--
>        <MetadataFilter type="RequireValidUntil" maxValidityInterval="2419200"/>
>        -->
>        <MetadataFilter type="Signature" certificate="/etc/shibboleth/federation.cer"/>
>    </MetadataProvider>
> </MetadataProvider>
> 
> 重要な注意点として,RequireValidUntil 属性をコメントアウトしている点があ
> ります.この属性は,メタデータを定期的に更新することを強制することによっ
> て,危殆化した IdP や SP をフェデレーションから排除するために必要な設定で
> す.しかし,大学ローカルなフェデレーションの場合は,
> 
>  - 専任の運用担当者がいるわけではないので,定期的にメタデータに署名し直
>    すのは負荷が高い.
> 
>  - 大学ローカルなフェデレーションですから,万一の場合は,全ての管理者に
>    設定変更や更新を依頼することも難しくない.
> 
> という判断をして,メタデータには validUntil 属性を設定しませんでした.そ
> のため,SP 側では RequireValidUntil 属性をコメントアウトしておく必要が生
> じます.
> 
> -- 
> 土屋 雅稔 ( TSUCHIYA Masatoshi )

-- 
西村健
国立情報学研究所 TEL:03-4212-2890
# 4月から内線番号が変わりました

Attachment: shibboleth-schema.zip
Description: Zip archive