SimpleSAMLphpをSPとしてShibbolethをIdPにする
現在の手元のShibbolethが非常に「アレ」な設定になってるため詳細については詰めないけれども、メモがわりに気をつけるべき点を書く
一番厄介に見えたのは「デフォルトでShibbolethはAssertionをSP側のサーバ証明書 (に入ってる公開鍵) で暗号化する」という点。
https://groups.google.com/forum/?fromgroups=#!topic/shibboleth-users/FvcuVGTHd7Y
もうひとつ参考: http://shibboleth.1660669.n2.nabble.com/Configure-IdP-to-encrypt-SAML-assertions-td2198881.html
Shibboleth側のmetadataに追加する EntityDescriptor 内にこういう感じの設定が必要。これによってこのSPとやり取りするための基本的な記述をShibboleth (IdP) が得る。
X509Certificateで囲まれている部分をサーバの証明書とする。これがShibboleth (IdP) から送られるAssertionを暗号化する際の公開鍵を含んでる。
# ついでに、Shibbolethのattribute-filter.xmlでこのSPに対して公開したい属性も書くこと。これも、重要だよ
次にSimpleSAMLphpの方で上記のIdPを受け入れてかつAssertionを復号化するための設定を書く。
ローカルで試した限りだと metadata/saml20-sp-hosted.php の privatekey は見にいってくれないので注意。今回は公開鍵証明なのでsaml20-idp-remote.phpへの (共有鍵を用いた暗号化・復号化のための) sharedkeyの設定も行わない(このあたりのドキュメントも参照)
○ 自力でたどり着く道
このレベルですら結構試した例がWebにないのだが、要求としてはまぁまぁ普通のレベルの話。読むべきは以下のログなど
一番厄介に見えたのは「デフォルトでShibbolethはAssertionをSP側のサーバ証明書 (に入ってる公開鍵) で暗号化する」という点。
https://groups.google.com/forum/?fromgroups=#!topic/shibboleth-users/FvcuVGTHd7Y
Shibboleth IdPs encrypt by default and the metadata you gave the IdP for your SP doesn't include an encryption key.IdPとSPを両方SimpleSAMLphpにした場合と一番異なるのがこれ。不幸にしてSimpleSAMLphpのデフォルトスクリーン上で"Federation"タブ経由で見れるSAML 2.0 Metadata XMLがこれを意識してくれないというのもまた一つ問題。そのままコピペでShibbolethのmetadataに書いても動かない。
もうひとつ参考: http://shibboleth.1660669.n2.nabble.com/Configure-IdP-to-encrypt-SAML-assertions-td2198881.html
Shibboleth側のmetadataに追加する EntityDescriptor 内にこういう感じの設定が必要。これによってこのSPとやり取りするための基本的な記述をShibboleth (IdP) が得る。
<EntityDescriptor entityID="https://sp_exp.example.com/simplesamlphp/module.php/saml/sp/metadata.php/default-sp">
<SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol">
<SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://sp_exp.example.com/simplesamlphp/module.php/saml/sp/saml2-logout.php/sp_as_spexp"/>
<AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://sp_exp.example.com/simplesamlphp/module.php/saml/sp/saml2-acs.php/sp_as_spexp" index="0"/>
<AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:browser-post" Location="https://sp_exp.example.com/simplesamlphp/module.php/saml/sp/saml1-acs.php/sp_as_spexp" index="1"/>
<AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://sp_exp.example.com/simplesamlphp/module.php/saml/sp/saml2-acs.php/sp_as_spexp" index="2"/>
<AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" Location="https://sp_exp.example.com/simplesamlphp/module.php/saml/sp/saml1-acs.php/sp_as_spexp/artifact" index="3"/>
<AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser" Location="https://sp_exp.example.com/simplesamlphp/module.php/saml/sp/saml2-acs.php/sp_as_spexp" index="4"/>
<KeyDescriptor>
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509Data>
<ds:X509Certificate>MII(ごーにょごにょ
ごーにょごにょ
ぽーにょぽにょ
さかなのこ</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</KeyDescriptor>
</SPSSODescriptor>
<ContactPerson contactType="technical">
<GivenName>Hansode</GivenName>
<SurName>San</SurName>
<EmailAddress>hansode@example.com</EmailAddress>
</ContactPerson>
</EntityDescriptor>
X509Certificateで囲まれている部分をサーバの証明書とする。これがShibboleth (IdP) から送られるAssertionを暗号化する際の公開鍵を含んでる。
# ついでに、Shibbolethのattribute-filter.xmlでこのSPに対して公開したい属性も書くこと。これも、重要だよ
次にSimpleSAMLphpの方で上記のIdPを受け入れてかつAssertionを復号化するための設定を書く。
- metadata/saml20-idp-remote.php の上記Shibboleth IdP に該当する設定に 'assertion.encryption' => 'TRUE' を追加
- config/authsources.php の当該SP設定に privatekey (秘密鍵へのパス) を追加
$metadata['https://idp_shibboleth.example.com/idp/shibboleth'] = array (
'name' => 'Shibboleth',
'metadata-set' => 'saml20-idp-remote',
'entityid' => 'https://idp_shibboleth.example.com/idp/shibboleth',
'SingleSignOnService' =>
array (
0 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://idp_shibboleth.example.com/idp/profile/SAML2/Redirect/SSO',
),
),
'certData' => 'しょーめーしょ',
'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient',
'assertion.encryption' => 'TRUE',
);
ローカルで試した限りだと metadata/saml20-sp-hosted.php の privatekey は見にいってくれないので注意。今回は公開鍵証明なのでsaml20-idp-remote.phpへの (共有鍵を用いた暗号化・復号化のための) sharedkeyの設定も行わない(このあたりのドキュメントも参照)
○ 自力でたどり着く道
このレベルですら結構試した例がWebにないのだが、要求としてはまぁまぁ普通のレベルの話。読むべきは以下のログなど
- shibboleth-idp の idp-process.log (変なmetadata XMLを書いてたまにここに例外が吐かれてるのを見た)
- SimpleSAMLphpのログ (DEBUGレベルのログを出して、IdPとSPがやりとりしているSAMLも見ると楽)
- 今回はphpのソースまでたどってprivatekeyがどうやって読まれてるかもチェックした。いわゆるprintfデバッグでしかない
- エラーメッセージをそのまんま検索する