spring-saml2-sample アプリを自分のアプリケーションに統合しています。私のサービス プロバイダーは Shibboleth IDP に接続します。Spring Security SAML アプリケーションに付属の samlKeystore.jks で提供されるプライベート証明書を使用して SP をテストしています。次のコマンドを使用して、IDP 署名公開鍵をキーストアに登録しました: keytool -importcert -alias idpSignKey -keypass passwordS -file key.cer -keystore samlKeystore.jks
アプリを実行し、IDP でログインできます。saml メッセージで返された公開証明書が、idp メタデータにあり、キーストアに登録されているものに対応していることをログで確認できます。JKSKeyManager から idp クレデンシャルを取得中にアプリが壊れます。
java.lang.UnsupportedOperationException: 信頼できる証明書エントリはパスワードで保護されていません java.security.KeyStoreSpi.engineGetEntry(不明なソース) java.security.KeyStore.getEntry(不明なソース) KeyStoreCredentialResolver.java:132) org.opensaml.xml.security.credential.AbstractCriteriaFilteringCredentialResolver.resolve(AbstractCriteriaFilteringCredentialResolver.java:57) org.opensaml.xml.security.credential.AbstractCredentialResolver.resolveSingle(AbstractCredentialResolver.java:30) org.opensaml. xml.security.credential.AbstractCredentialResolver.resolveSingle(AbstractCredentialResolver.java:26) org.springframework.security.saml.key.JKSKeyManager.resolveSingle(JKSKeyManager.java:172) org.springframework.security.saml.key.JKSKeyManager.getCredential(JKSKeyManager.java:194) org.springframework.security.saml.trust.MetadataCredentialResolver.retrieveFromMetadata(MetadataCredentialResolver.java:102) org.opensaml.security.MetadataCredentialResolver.resolveFromSource(MetadataCredentialResolver.java:169)
これは、keyManager が contextSecurity.xml でどのように見えるかです。
<!-- Central storage of cryptographic keys -->
<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
<constructor-arg value="classpath:security/samlKeystore.jks"/>
<constructor-arg type="java.lang.String" value="nalle123"/>
<constructor-arg>
<map>
<entry key="apollo" value="nalle123"/>
<entry key="idpSignKey" value="passwordS"/>
<entry key="idpEncKey" value="passwordE"/>
</map>
</constructor-arg>
<constructor-arg type="java.lang.String" value="apollo"/>
</bean>
これは、idp の拡張メタデータです。
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
<property name="local" value="false"/>
<property name="securityProfile" value="metaiop"/>
<property name="sslSecurityProfile" value="pkix"/>
<property name="signingKey" value="idpSignKey"/>
<property name="encryptionKey" value="idpEncKey"/>
<property name="requireArtifactResolveSigned" value="false"/>
<property name="requireLogoutRequestSigned" value="false"/>
<property name="requireLogoutResponseSigned" value="false"/>
<property name="idpDiscoveryEnabled" value="false"/>
</bean>