SAML2.0サービスプロバイダーのメタデータ

<h3>SP Metadata</h3>

以下の例1,2を見つかったので、メモとして自分のブログとっておきたいと思いました。

先にSAML2.0プロトコルの使いみちが自由になっており、何をどう対応するが難しいでしょうか。
個人的にもいまも悩むことありますので、補足して書いておきたいと思います。

<h3>例:1</h3>

```
<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata"  entityID="https://SP-HostName/shibboleth-sp">
                                                                                     ↑ ホスト名
  <SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol urn:oasis:names:tc:SAML:1.1:protocol">
    <Extensions>
      <idpdisc:DiscoveryResponse xmlns:idpdisc="urn:oasis:names:tc:SAML:profiles:SSO:idp-discovery-protocol" Location="https://SP-HostName/Shibboleth.sso/DS" index="1" Binding="urn:oasis:names:tc:SAML:profiles:SSO:idp-discovery-protocol"/>
                                                                                                                                  ↑ ホスト名
      <mdui:UIInfo xmlns:mdui="urn:oasis:names:tc:SAML:metadata:ui">
        <mdui:DisplayName xml:lang="ja">実習セミナーSPテストXX</mdui:DisplayName>
        <mdui:DisplayName xml:lang="en"> SP名称（英/日）</mdui:DisplayName>
                                              
        <mdui:Description xml:lang="ja"> サービス内容</mdui:Description>
                                              
        <mdui:Logo height="50" width="50">https://SP-HostName/logo/logo.jpg</mdui:Logo>
                                                     ↑ ロゴ画像URL
        <mdui:InformationURL xml:lang="ja">https://SP-HostName/jp/</mdui:InformationURL>
        <mdui:InformationURL xml:lang="en">https://SP-HostName/en/</mdui:InformationURL>
                                                      ↑ SP情報URL（英/日）
      </mdui:UIInfo>
    </Extensions>
    <KeyDescriptor>
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>
MIIFITCCBAmgAwIBAgIIBpAaVBrt6kMwDQYJKoZIhvcNAQEFBQAwfTELMAkGA1UE
BhMCSlAxETAPBgNVBAcTCEFjYWRlbWUyMSowKAYDVQQKEyFOYXRpb25hbCBJbnN0
aXR1dGUgb2YgSW5mb3JtYXRpY3MxDTALBgNVBAsTBFVQS0kxIDAeBgNVBAsTF05J
（中略）
kBFfvNBdrux4CkIsKhpYQXCAIEuy12CFZUXEtHB5XxeBkntbs2lfP/rWbg2J1Ige
zZc6shCn3VdrL2douVFjaAXlc8zwys/KIpLzNSxOOGwJdKxFTaIzH/emcqKj93Jd
DC1rrFMhoPE=
↑ 設定した証明書に変更
          </ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </KeyDescriptor>
    <AssertionConsumerService isDefault="true" Location="https://SP-HostName/Shibboleth.sso/SAML2/POST" index="1" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"/>
                                                                    ↑ ホスト名
    <AssertionConsumerService Location="https://SP-HostName/Shibboleth.sso/SAML2/POST-SimpleSign" index="2" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"/>
                                                   ↑ ホスト名
    <AssertionConsumerService Location="https://SP-HostName/Shibboleth.sso/SAML2/Artifact" index="3" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact"/>
                                                   ↑ ホスト名
    <AssertionConsumerService Location="https://SP-HostName/Shibboleth.sso/SAML/POST" index="4" Binding="urn:oasis:names:tc:SAML:1.0:profiles:browser-post"/>
                                                   ↑ ホスト名
    <AssertionConsumerService Location="https://SP-HostName/Shibboleth.sso/SAML/Artifact" index="5" Binding="urn:oasis:names:tc:SAML:1.0:profiles:artifact-01"/>
                                                   ↑ ホスト名
  </SPSSODescriptor>
  <Organization>
    <OrganizationName xml:lang="en">Training Seminar University</OrganizationName>
    <OrganizationName xml:lang="ja">実習セミナー大学</OrganizationName>
                                          ↑ 機関名称（英/日）
    <OrganizationDisplayName xml:lang="en">Ex-SP-TestXX</OrganizationDisplayName>
    <OrganizationDisplayName xml:lang="ja">実習セミナーSPテストXX</OrganizationDisplayName>
                                                 ↑ SP名称（英/日）
    <OrganizationURL xml:lang="en">http://YourHomePage/</OrganizationURL>
                                              ↑ 機関情報URL 
  </Organization>
  <ContactPerson contactType="technical">
                                 ↑ 連絡先ポジションを以下から選択
                                 [technical, support, administrative, billing, other]
    <GivenName>Your GivenName</GivenName>
                     ↑ 連絡先名（名）
    <SurName>Your SurName</SurName>
                   ↑ 連絡先名（姓）
    <EmailAddress>mailto:admin@example.org</EmailAddress>
                             ↑ 連絡先のe-mailアドレス
                             （メタデータは公開されるのでalias名などを推奨：学認技術運用基準4.4項参照）
  </ContactPerson>
</EntityDescriptor>

```

※端末のサイズによっては表記がずれる可能性がございます。画面を広くしてご覧ください。
※ 証明書は複数指定できます。例えば証明書を更新する場合などは一時的に古い証明書と新しい証明書の両方を並行運用したい場合があるでしょう。複数の証明書を記載する場合は<KeyDescriptor>部分を繰り返してください（下記参照）。

```
    <KeyDescriptor>
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>■１枚目</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </KeyDescriptor>
    <KeyDescriptor>
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>■２枚目</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </KeyDescriptor>

```

<h3>例:2</h3>

```
<?xml version="1.0"?>
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" validUntil="2017-12-08T04:11:26Z" cacheDuration="PT604800S" entityID="my-service" ID="pfx9d523822-366e-1bf9-69f9-0d33b0304f1f"><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
  <ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
    <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
  <ds:Reference URI="#pfx9d523822-366e-1bf9-69f9-0d33b0304f1f"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><ds:DigestValue>zy/X+acmyPGYPGlcSG21P4nspHU=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>TrNvmi8RykgeEjBn+nDHlHxWpfMPWe8Qoykxdu1ke3fzxr0FTvAoXlFPypfeghIUQ/RACpxLyJ/orJyqRs1z73dlYebJlYPzh4cMWoY5qjFthKDukMrxMDX3uJG5jP+5b0sQa0MPYwu3Rp75iCBy+I74W+aAztmrfq7WJLdjjhw=</ds:SignatureValue>
<ds:KeyInfo><ds:X509Data><ds:X509Certificate>MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgFIuAlPgAov6/nrDozdbyNY+tSj31rXa1if7oNaNXRMz4xOievGNzqtj9IlDh9jyc0LS339XDPMlNvnyLYpsHtCDWLcP2FptxJ6mIG+9L8D8MAIMj2gKJd1DxYqGbDkps1cYZiPQ/PNfPplRU5SQIh8rYGz/4pFglHSsDlc+8C9JAgMBAAE=</ds:X509Certificate></ds:X509Data></ds:KeyInfo></ds:Signature>
  <md:SPSSODescriptor AuthnRequestsSigned="true" WantAssertionsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <md:KeyDescriptor use="signing">
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgFIuAlPgAov6/nrDozdbyNY+tSj31rXa1if7oNaNXRMz4xOievGNzqtj9IlDh9jyc0LS339XDPMlNvnyLYpsHtCDWLcP2FptxJ6mIG+9L8D8MAIMj2gKJd1DxYqGbDkps1cYZiPQ/PNfPplRU5SQIh8rYGz/4pFglHSsDlc+8C9JAgMBAAE=</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </md:KeyDescriptor>
    <md:KeyDescriptor use="encryption">
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgFIuAlPgAov6/nrDozdbyNY+tSj31rXa1if7oNaNXRMz4xOievGNzqtj9IlDh9jyc0LS339XDPMlNvnyLYpsHtCDWLcP2FptxJ6mIG+9L8D8MAIMj2gKJd1DxYqGbDkps1cYZiPQ/PNfPplRU5SQIh8rYGz/4pFglHSsDlc+8C9JAgMBAAE=</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </md:KeyDescriptor>
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="http://localhost:8080/my-service/saml/logout"/>
    <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://localhost:8080/my-service/saml/acs" index="1"/>
  </md:SPSSODescriptor>
  <md:Organization>
    <md:OrganizationName xml:lang="en-US">test-team</md:OrganizationName>
    <md:OrganizationDisplayName xml:lang="en-US">test-team</md:OrganizationDisplayName>
    <md:OrganizationURL xml:lang="en-US">http://localhost:8080/my-service/info</md:OrganizationURL>
  </md:Organization>
  <md:ContactPerson contactType="technical">
    <md:GivenName>test</md:GivenName>
    <md:EmailAddress>test@example.com</md:EmailAddress>
  </md:ContactPerson>
  <md:ContactPerson contactType="support">
    <md:GivenName>test</md:GivenName>
    <md:EmailAddress>test@example.com</md:EmailAddress>
  </md:ContactPerson>
</md:EntityDescriptor>

```

<h3>補足情報</h3>

<b>entityID</b>にURLがありますが、開発的にURLを記載しないほうがいいと思います。
URLの特定の文字、’？’などが入ってくるとIDPでのパラメータを切り出すなどが難しくなる。

<b>SPSSODescriptor</b>の部分で記載されているExtensionsは任意の項目で使うパターンが少ないと思います。

<b>AssertionConsumerService</b>に複数のエンドポイントを記載されていますが、
`urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST`がクラウド型の認証に使うパターンが多いです。
`urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact`もありますが、バックエンドチャネルなので、内部システムの間の認証に使用されるの多い、何故なっればネットワーク、ファイアウォール設定が必要になります。
クラウド型はIDPがそういう設定はSPことに一致一致設定してくれないです。

<b>賞名</b>
以下の例にないのは署名です。セキュリティを高めるために使用すれば良いでしょう。でもIDP側が対応するかしていてもバリデーションで落ちるパターンが多い。

```
<ds:SignedInfo>
　<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
  <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
  <ds:Reference URI="#pfx1466aeba-3769-5098-f8b1-9c4cd107f11c">
　<ds:Transforms>
　　<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
　<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
　</ds:Transforms>
　<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>　　
　　　<ds:DigestValue>Ylt8/pj8YIhkXULzCoAudFRmvaY=</ds:DigestValue>
　</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>H5+bOtojC34lxweksNd87HKEHml7JQ8HwJgjqwq0W/h2L+LcXnynXZXIn5naV5onE3s1PE0tr3S0CN1jJIM4QIAUhU2+c6sESK3dcWU/zjEqglTHtDeSc1o7edjq2IkGaM7C6zq++XWUS69wOyZ7A8Qn5dlX/9z+aRmaDD42wco=
</ds:SignatureValue>
```

<b>NameIDFormat</b>

`<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>`がメインでよく使われる文字列をそのままで送るということなので、使うと便利だと思います。

```
1.urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified

2.urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress

3.urn:oasis:names:tc:SAML:2.0:nameid-format:persistent

4.urn:oasis:names:tc:SAML:2.0:nameid-format:transient
```


<b>証明書</b>

最後は証明書、セキュリティを高めるたｍ、個人的に進めする。でも、SP側で秘密鍵の保持を十分に気をつけないと行かない。
又はSP内容にあまりに重要な情報（金周り）ない場合、いらないと思います。基本的にIDP側の公開鍵があるので。

```
    <KeyDescriptor>
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>
MIIFITCCBAmgAwIBAgIIBpAaVBrt6kMwDQYJKoZIhvcNAQEFBQAwfTELMAkGA1UE
BhMCSlAxETAPBgNVBAcTCEFjYWRlbWUyMSowKAYDVQQKEyFOYXRpb25hbCBJbnN0
aXR1dGUgb2YgSW5mb3JtYXRpY3MxDTALBgNVBAsTBFVQS0kxIDAeBgNVBAsTF05J
（中略）
kBFfvNBdrux4CkIsKhpYQXCAIEuy12CFZUXEtHB5XxeBkntbs2lfP/rWbg2J1Ige
zZc6shCn3VdrL2douVFjaAXlc8zwys/KIpLzNSxOOGwJdKxFTaIzH/emcqKj93Jd
DC1rrFMhoPE=
↑ 設定した証明書に変更
          </ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </KeyDescriptor>
```

<b>追加：</b>

以下のツールで何がどこに設定されるかを見れます。
https://www.samltool.com/sp_metadata.php

一緒に働いていたものの良い記事もあります。
http://nantonaku-shiawase.hatenablog.com/entry/2016/07/13/081053#f-bf0f28f2