web-dev-qa-db-ja.com

信頼できる証明書エントリは、パスワードで保護されたSpring SAMLではありません

接続しようとしている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)
17
SM KUMAR

君の .cer証明書には公開鍵のみが含まれているため、定義する必要はありません<entry key="adfssigning" value="mypassword"/>公開鍵。プライベートのものにのみ使用できます。単にadfssigningエントリを取り出し、Spring SAMLサンプルアプリケーションと同様に、代わりに秘密鍵を含めるようにしてください。

SAMLキーストアには、2つの基本タイプのキー(公開キーと秘密キー(およびそれらの証明書))を含めることができます。各キーには、それを参照するために使用されるエイリアスがあります。キーストア自体はパスワード(2番目のコンストラクターパラメーターで指定)で保護できます。さらに、各秘密鍵は追加のパスワードで保護することもできます(これらは、エイリアス->パスワードのマップのコンストラクターの3番目のパラメーターで定義されます)。キーストアにインポートする公開鍵(上記のコマンドで行ったのと同じように)は、このマップで定義してはなりません。追加の宣言なしでインポートされた後、それらは自動的に使用可能になります。 Spring SAMLが機能するためには、キーストアに少なくとも1つの秘密鍵が含まれている必要があり(サンプルアプリケーションにはエイリアスapolloの秘密鍵が含まれています)、そのエイリアスをコンストラクターの3番目のパラメーターで指定する必要があります。

上記の例は、公開鍵をインポートしましたが、秘密鍵にのみ使用できるマップに含まれているため失敗します。

10

ウラジミールは質問に正しく答えました理由エラーが発生しました。私の答えでは、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]
9
Matthias M

このエラーは、キーストアに秘密鍵がない場合にも発生します。 SAMLは秘密鍵を使用して、IDPとの通信に使用されるサービスプロバイダーのメタデータを生成します。次のようにキーストアに1つ追加するだけです。 (私の例では100年間有効です)IDPから公開証明書を追加することを忘れないでください。その後、あなたは行く準備ができているはずです。

2

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");
}
0
Sandeep Shukla

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
0
Velu