Spring SAML:解密加密密钥时出错,没有安装的提供程序支持此密钥

Posted

技术标签:

【中文标题】Spring SAML:解密加密密钥时出错,没有安装的提供程序支持此密钥【英文标题】:Spring SAML: Error decrypting encrypted key, No installed provider supports this key 【发布时间】:2014-11-30 15:47:23 【问题描述】:

我参考了 Spring SAML 手册来创建私钥和导入公共证书。但我仍然面临加密/解密问题。

我已经使用手册中提到的以下命令创建了一个 JKS 文件,如下所示

用于导入 IDP 的公共证书的命令

keytool -importcert -alias adfssigning -keystore samlKeystore.jks -file testIdp.cer

用于私钥的命令

keytool -genkeypair -alias myprivatealias -keypass changeit -keystore samlKeystore.jks

私钥和密钥库的密码都定义为'changeit'

我已经将securityContext配置如下

<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
    <constructor-arg value="classpath:security/samlKeystore.jks"/>
    <constructor-arg type="java.lang.String" value="changeit"/>
    <constructor-arg>
        <map>
            <entry key="myprivatealias" value="changeit"/>
        </map>
    </constructor-arg>
    <constructor-arg type="java.lang.String" value="myprivatealias"/>
</bean>

我可以看到可以选择 IDP 的 idpDiscovery 页面。我也可以查看 IDP 的登录页面。但是当我提供用户凭据时,我得到了以下异常。

当 saml2:EncryptedAssertion 与 SAML 响应中的 saml2p:Status 一起发送时,会发生此异常。 (类:spring-saml jar的WebSSOProfileConsumerImpl)

ERROR org.opensaml.xml.encryption.Decrypter  - Error decrypting encrypted key
org.apache.xml.security.encryption.XMLEncryptionException: No installed provider supports this key: sun.security.provider.DSAPrivateKey
Original Exception was java.security.InvalidKeyException: No installed provider supports this key: sun.security.provider.DSAPrivateKey
at org.apache.xml.security.encryption.XMLCipher.decryptKey(XMLCipher.java:1479)
at org.opensaml.xml.encryption.Decrypter.decryptKey(Decrypter.java:697)
at org.opensaml.xml.encryption.Decrypter.decryptKey(Decrypter.java:628)
at org.opensaml.xml.encryption.Decrypter.decryptUsingResolvedEncryptedKey(Decrypter.java:783)

Caused by: java.security.InvalidKeyException: No installed provider supports this key: sun.security.provider.DSAPrivateKey
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at org.apache.xml.security.encryption.XMLCipher.decryptKey(XMLCipher.java:1475)
... 46 more
740323 [http-8080-2] ERROR org.opensaml.xml.encryption.Decrypter  - Failed to decrypt EncryptedKey, valid decryption key could not be resolved
740324 [http-8080-2] ERROR org.opensaml.xml.encryption.Decrypter  - Failed to decrypt EncryptedData using either EncryptedData KeyInfoCredentialResolver or EncryptedKeyResolver + EncryptedKey KeyInfoCredentialResolver
740325 [http-8080-2] ERROR org.opensaml.saml2.encryption.Decrypter  - SAML Decrypter encountered an error decrypting element content

谁能告诉我哪里出错了??

替代命令使用私钥生成而不是上面提到的

keytool -genkey -alias privatekeyalias -keyalg RSA -keystore samlKeystore.jks

如果我使用此命令并更新 JKS 文件,则会收到另一个异常,称为 InvalidKeyException: Key is too long for unwrapping

Caused by: java.security.InvalidKeyException: Key is too long for unwrapping
at com.sun.crypto.provider.RSACipher.engineUnwrap(DashoA13*..)
at javax.crypto.Cipher.unwrap(DashoA13*..)
at org.apache.xml.security.encryption.XMLCipher.decryptKey(XMLCipher.java:1477)
... 46 more
41   [http-8080-1] ERROR org.opensaml.xml.encryption.Decrypter  - Failed to decrypt EncryptedKey, valid decryption key could not be resolved
42   [http-8080-1] ERROR org.opensaml.xml.encryption.Decrypter  - Failed to decrypt EncryptedData using either EncryptedData KeyInfoCredentialResolver or EncryptedKeyResolver + EncryptedKey KeyInfoCredentialResolver
42   [http-8080-1] ERROR org.opensaml.saml2.encryption.Decrypter  - SAML Decrypter encountered an error decrypting element content

谁能帮我解决这个问题??

【问题讨论】:

您是否安装了无限强度密码库(docs.spring.io/autorepo/docs/spring-security-saml/…)? @vschafer Ya 我已经通过将 jars(US_export_policy 和 local_policy)复制到 C:\Program Files\Java\jdk1.6.0_25\jre\lib\security 和 C:\Program Files\ Java\jre6\lib\security。 仍然遇到同样的错误。 从 (oracle.com/technetwork/java/javase/downloads/…) 下载的 Jar。生成私钥是否有其他问题(keytool -genkey -alias privatekeyalias -keyalg RSA -keystore samlKeystore.jks)?? @vschafer 继续上面的评论,我也尝试了各种密钥生成。我通过提到 -keyalg RSA 使用了 keytool -genkeypairkeytool -genkey。对于这两个密钥,我得到了相同的错误,即 java.security.InvalidKeyException: Key is too long for unwrapping。我什至尝试安装上面评论中提到的无限强度加密库。你能告诉我哪里出错了吗? 也许您的安装使用的 JDK 与您想象的不同。您遇到的错误通常是由缺少无限制加密库引起的。请参阅***.com/questions/9422545/…,您可以尝试发布整个断言,以便查看 XML 中的密钥是如何编码的。 @vschafer 因为我无法在 cmets 中粘贴整个断言,所以我在下面提到的链接中发布了整个断言。非常感谢您在这方面的帮助。 ***.com/questions/26237273/… 【参考方案1】:

问题是由于在应用程序中使用的密钥库与生成的密钥库不同:

keytool -genkeypair -alias privatekeyalias -keypass samplePrivateKeyPass -keystore samlKeystore.jks -keyalg RSA -sigalg SHA1WithRSA

【讨论】:

以上是关于Spring SAML:解密加密密钥时出错,没有安装的提供程序支持此密钥的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenSAML 在 Java 中使用 SAML 2.0 解密加密断言

Spring在属性文件中加密和解密API密钥

python中的ascii加密程序出错

如果我用随机密钥加密字符串,如何解密它

尝试解密RSA时出错

如何为密钥持有者配置文件配置 Spring Security SAML 扩展