2014-10-02 8 views
10

Ich habe die Datei testIdp.cer erzeugt, indem ich den 509-Eintrag des IDP kopiert habe, den ich verbinden möchte. Dann habe ich JKS-Datei, indem Sie den folgenden Befehl ausführenvertrauenswürdige Zertifikateinträge sind nicht kennwortgeschützt Spring SAML

keytool -importcert -alias adfssigning -keystore C:\Users\user\Desktop\samlKeystore.jks -file C:\Users\user\Desktop\testIdp.cer 

Wenn er ausgeführt wird darum gebeten hat, ein Passwort einzugeben, für die ich ein Passwort gegeben haben. Für die Frage "Dieses Zertifikat vertrauen? [Nein]:" habe ich "y" als Eingabe angegeben. Nachricht kam als "Zertifikat wurde zu Keystore hinzugefügt".

Dann habe ich die folgenden Details in 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> 

konfiguriert Aber wenn ich die Anwendung ausführen, bekomme ich die folgenden zwei Ausnahmen, wenn der Server startet, und wenn ich die Homepage der Anwendung laden. Kann mir jemand Bescheid geben, wenn mir noch etwas fehlt?

Diese Ausnahme auftreten wird, wenn ich den Server

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) 

Diese Ausnahme auftreten beginnen, wenn ich die Homepage meiner Anwendung ausführen

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) 
+0

Hallo Kumar, Wie Sie Ihr Problem gelöst? Auch ich stehe vor dem gleichen Problem.Bitte gehen Sie durch diesen Link. http://stackoverflow.com/questions/33369965/trusted-certificate-entries-are-not-password-protected-java Bitte führen Sie mir eine Lösung – praneeth

Antwort

8

Ihr .cer Zertifikat nur einen öffentlichen Schlüssel enthält, mustn Sie definiere nicht <entry key="adfssigning" value="mypassword"/> für öffentliche Schlüssel; es kann nur für private genutzt werden. Nehmen Sie einfach den Eintrag adfssigning heraus und stellen Sie sicher, dass Sie stattdessen einen privaten Schlüssel einfügen - genau wie in der Spring SAML-Beispielanwendung.

Der SAML Keystore kann zwei grundlegende Arten von Schlüsseln enthalten - öffentliche und private Schlüssel (plus ihre Zertifikate). Jeder Schlüssel hat einen Alias, der verwendet wird, um darauf Bezug zu nehmen. Der Schlüsselspeicher selbst kann durch ein Kennwort geschützt werden (im zweiten Konstruktorparameter angegeben), und jeder private Schlüssel kann auch durch ein zusätzliches Kennwort geschützt werden (diese sind im dritten Parameter des Konstruktors in einer Zuordnung von alias-> password definiert). Die öffentlichen Schlüssel, die Sie in den Keystore importieren (genau wie bei dem obigen Befehl), dürfen in dieser Map nicht definiert werden. Sie werden nach dem Import ohne zusätzliche Deklarationen automatisch verfügbar sein. Damit Spring SAML funktioniert, muss der Schlüsselspeicher mindestens einen privaten Schlüssel enthalten (die Beispielanwendung enthält einen privaten Schlüssel mit Alias ​​apollo), und sein Alias ​​muss im dritten Parameter des Konstruktors angegeben werden.

Ihr Beispiel oben schlägt fehl, weil Sie einen öffentlichen Schlüssel importiert, aber in die Karte aufgenommen haben, die nur für private Schlüssel verwendet werden kann.

+0

@vschafer Meinen Sie, dass nalle123 zu Argument abgebildet sagen 2 und 3 des Konstruktors in der Spring-SAML-Beispielanwendung entsprechen demselben privaten Schlüssel? Gemäß Dokumentation entspricht das Argument 2 dem Passwort der Keystore-Datei. Im Frühjahr Sampl Beispielanwendung, glaube ich, dass es nur ein Zufall ist, dass das Passwort der Keystore-Datei und der private Schlüssel identisch sind. Wie kann ich den privaten Schlüssel abrufen? –

+0

@vschafer Willst du sagen, dass nalle123, die den Argumenten 2 und 3 des Konstruktors in der Spring-SAML-Beispielanwendung zugeordnet sind, demselben privaten Schlüssel entsprechen? Gemäß Dokumentation entspricht das Argument 2 dem Passwort der Keystore-Datei. Im Frühjahr Sampl Beispielanwendung, glaube ich, dass es nur ein Zufall ist, dass das Passwort der Keystore-Datei und der private Schlüssel identisch sind. Wie kann ich JKS erstellen? Ich habe derzeit nur das öffentliche Zertifikat, das in eine .cer-Datei hinzugefügt wird und ich verwende den Befehl keytool -importcert -alias adfssigning -keystore samlKeystore.jks -file testIdp.cer –

+0

Ich habe die Antwort mit zusätzlichen Erklärungen aktualisiert. Einzelheiten zum Erstellen von JKS und zum Importieren von Schlüsseln finden Sie im Spring SAML-Handbuch oder in der Java-Dokumentation. –

3

Vladimir hat die Frage richtig beantwortet, warum der Fehler auftritt. In meiner Antwort möchte ich zeigen, wie Sie ein Zertifikat zum Schlüsselspeicher, dieses Problem importieren zu lösen:

Sie haben das Zertifikat und privaten Schlüssel zu importieren, die konnte nicht direkt von keytool getan.

Die detaillierte beschriebene Lösung finden Sie hier: https://stackoverflow.com/a/8224863/1909531

Hier ein Auszug:

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] 
Verwandte Themen