接続しようとしているIDPの509エントリをコピーしてtestIdp.cerファイルを生成しました。次に、次のコマンドを実行してJKSファイルを作成しました
keytool -importcert -alias adfssigning -keystore C:\Users\user\Desktop\samlKeystore.jks -file C:\Users\user\Desktop\testIdp.cer
実行すると、パスワードを指定したパスワードの入力を求められます。 「この証明書を信頼しますか?[いいえ]:」という質問に対して、「y」を入力として指定しました。 「証明書がキーストアに追加されました」というメッセージが出ました。
次に、securityContext.xmlで次の詳細を構成しました
<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
<constructor-arg value="classpath:security/samlKeystore.jks"/>
<constructor-arg type="Java.lang.String" value="mypassword"/>
<constructor-arg>
<map>
<entry key="adfssigning" value="mypassword"/>
</map>
</constructor-arg>
<constructor-arg type="Java.lang.String" value="adfssigning"/>
</bean>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
<property name="alias" value="adfssigning" />
<property name="signingKey" value="adfssigning"/>
</bean>
しかし、アプリケーションを実行すると、サーバーの起動時とアプリケーションのホームページをロードするときに、次の2つの例外が発生します。他に何か不足している場合、誰かが私に知らせることができますか?.
サーバーを起動すると、この例外が発生します
Caused by: org.opensaml.saml2.metadata.provider.FilterException: Signature trust establishment failed for metadata entry
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.verifySignature(SignatureValidationFilter.Java:327)
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.processEntityGroup(SignatureValidationFilter.Java:240)
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.doFilter(SignatureValidationFilter.Java:158)
at org.opensaml.saml2.metadata.provider.AbstractMetadataProvider.filterMetadata(AbstractMetadataProvider.Java:493)
at org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.processNonExpiredMetadata(AbstractReloadingMetadataProvider.Java:395)
この例外は、アプリケーションのホームページを実行すると発生します
Java.lang.UnsupportedOperationException: trusted certificate entries are not password-protected
at Java.security.KeyStoreSpi.engineGetEntry(Unknown Source)
at Java.security.KeyStore.getEntry(Unknown Source)
at org.opensaml.xml.security.credential.KeyStoreCredentialResolver.resolveFromSource(KeyStoreCredentialResolver.Java:132)
君の .cer
証明書には公開鍵のみが含まれているため、定義する必要はありません<entry key="adfssigning" value="mypassword"/>
公開鍵。プライベートのものにのみ使用できます。単にadfssigning
エントリを取り出し、Spring SAMLサンプルアプリケーションと同様に、代わりに秘密鍵を含めるようにしてください。
SAMLキーストアには、2つの基本タイプのキー(公開キーと秘密キー(およびそれらの証明書))を含めることができます。各キーには、それを参照するために使用されるエイリアスがあります。キーストア自体はパスワード(2番目のコンストラクターパラメーターで指定)で保護できます。さらに、各秘密鍵は追加のパスワードで保護することもできます(これらは、エイリアス->パスワードのマップのコンストラクターの3番目のパラメーターで定義されます)。キーストアにインポートする公開鍵(上記のコマンドで行ったのと同じように)は、このマップで定義してはなりません。追加の宣言なしでインポートされた後、それらは自動的に使用可能になります。 Spring SAMLが機能するためには、キーストアに少なくとも1つの秘密鍵が含まれている必要があり(サンプルアプリケーションにはエイリアスapolloの秘密鍵が含まれています)、そのエイリアスをコンストラクターの3番目のパラメーターで指定する必要があります。
上記の例は、公開鍵をインポートしましたが、秘密鍵にのみ使用できるマップに含まれているため失敗します。
ウラジミールは質問に正しく答えました理由エラーが発生しました。私の答えでは、howを表示したいので、証明書をキーストアにインポートしてその問題を解決できます:
証明書およびの秘密鍵をインポートする必要がありますが、keytoolでは直接実行できませんでした。
詳細に説明されたソリューションはここにあります: https://stackoverflow.com/a/8224863/1909531
ここに抜粋があります:
openssl pkcs12 -export -in server.crt -inkey server.key \
-out server.p12 -name [some-alias] \
-CAfile ca.crt -caname root
keytool -importkeystore \
-deststorepass [changeit] -destkeypass [changeit] -destkeystore server.keystore \
-srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass some-password \
-alias [some-alias]
このエラーは、キーストアに秘密鍵がない場合にも発生します。 SAMLは秘密鍵を使用して、IDPとの通信に使用されるサービスプロバイダーのメタデータを生成します。次のようにキーストアに1つ追加するだけです。 (私の例では100年間有効です)IDPから公開証明書を追加することを忘れないでください。その後、あなたは行く準備ができているはずです。
Java configで回答を探している人は、passwords.put( "mykeyalias"、 "mystorepass");行をコメント化してください。
@Bean
public KeyManager keyManager() {
DefaultResourceLoader loader = new DefaultResourceLoader();
Resource storeFile = loader.getResource("classpath:saml-keystore.jks");
Map<String, String> passwords = new HashMap<>();
// passwords.put("mykeyalias", "mystorepass");
return new JKSKeyManager(storeFile, "mystorepass", passwords, "mykeyalias");
}
opensslコマンドを使用してパブリック証明書を取得:
openssl s_client -showcerts -connect iam-sso.google.net:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >mycertfile.pem
キーストアにインポート:
keytool -import -alias "new-qet-alias" -keystore /usr/share/Tomcat8/webapps/ROOT/WEB-INF/classes/saml/samlKeystore.jks -file mycertfile.pem