2014-10-02 97 views
10

我通過複製509條計劃連接的IDP來生成testIdp.cer文件。然後,我通過執行以下命令受信任的證書條目不受密碼保護Spring SAML

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

創建JKS文件執行時,已經要求進入的,我都給予了密碼的密碼。對於「信任此證書?[否]:」這個問題,我已經給出了「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> 

配置了以下細節但是當我運行應用程序,我得到以下兩種情況例外,當在服務器啓動時,當我加載應用程序的主頁。任何人都可以讓我知道我是否缺少其他東西。

當我啓動服務器

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

庫馬爾嗨, 你如何解決您的問題?我也面臨同樣的問題。請通過這個鏈接。 http://stackoverflow.com/questions/33369965/trusted-certificate-entries-are-not-password-protected-java 請指引我一個解決方案 – praneeth 2015-10-28 14:55:17

回答

8

.cer證書只包含公用密鑰,你千萬不能沒有爲公鑰定義<entry key="adfssigning" value="mypassword"/>;它只能用於私人用途。只需取出adfssigning條目,並確保包含一個私鑰 - 就像在Spring SAML示例應用程序中一樣。

SAML密鑰庫可以包含兩種基本類型的密鑰 - 公共密鑰和私有密鑰(以及它們的證書)。每個鍵都有一個用於引用它的別名。密鑰庫本身可以通過一個密碼來保護(在第二個構造器參數中提供),另外每個私鑰也可以被一個額外的密碼保護(這些密碼在構造函數的第三個參數中定義在別名 - >密碼映射中)。您必須在此映射中定義您導入到密鑰庫的公鑰(與上面的命令一樣)。它們在導入後將自動可用,無需額外的聲明。爲了使Spring SAML能夠工作,密鑰庫必須至少包含一個私鑰(示例應用程序包含帶有別名apollo的私鑰),並且其別名需要在構造函數的第三個參數中提供。

上面的例子失敗了,因爲你已經導入了一個公鑰,但將它包含在只能用於私鑰的映射中。

+0

@vschafer你的意思是說,nalle123映射到說法春季SAML示例應用程序中的構造函數的2和3對應於相同的私鑰? 根據文檔參數2對應密鑰庫文件的密碼。在spring saml示例應用程序中,我認爲密鑰庫文件的密碼和私鑰是相同的,這只是巧合。 我如何檢索私鑰? – 2014-10-03 09:31:03

+0

@vschafer你的意思是說,春天的SAML示例應用程序中的nalle123映射到構造函數的參數2和3對應於相同的私鑰? 根據文檔參數2對應密鑰庫文件的密碼。在spring saml示例應用程序中,我認爲密鑰庫文件的密碼和私鑰是相同的,這只是巧合。 如何創建JKS?我目前只有公共證書被添加到一個.cer文件中,我正在使用命令keytool -importcert -alias adfssigning -keystore samlKeystore.jks -file testIdp.cer – 2014-10-03 10:09:53

+0

我已經更新了答案和其他解釋。有關如何創建JKS和導入密鑰的詳細信息,請參閱Spring SAML手冊或Java文檔。 – 2014-10-04 14:07:23

3

弗拉基米爾回答正確的問題爲什麼發生錯誤。 在我的答案我想告訴你如何導入證書密鑰庫來解決這個問題:

你必須導入證書這不能由密鑰工具直接完成私鑰。

的詳細描述的解決方案是在這裏找到: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]