OpenSAML3.4.5使用ECC公钥做KW-AES256密钥传输报错咨询
问题解答
1. 你的实现思路存在两处核心错误,并不合理
- 第一,算法匹配错误:你指定的密钥加密算法是
EncryptionConstants.ALGO_ID_KEYWRAP_AES256,这是对称密钥包裹算法,要求KeyEncryptionParameters传入的凭证是对称密钥,而你传入的是EC非对称公钥,本身就不匹配。 - 第二,对密钥传输的理解错误:非对称密钥传输场景下,确实是用接收方公钥加密对称密钥,但只有RSA公钥支持直接加密操作,EC公钥本身没有直接加密的能力,EC体系下共享对称密钥用的是ECDH密钥协商机制,不是直接传输加密后的密钥,所以OpenSAML直接禁止了EC公钥用于密钥传输场景,这个逻辑完全符合密码学规范,不存在矛盾。
- 额外纠正理解偏差:你提到的“AES是对称加密,应该用私钥加密”属于概念混淆:你用AES256-GCM加密Assertion用的是自己生成的临时对称密钥,这个密钥要发给接收方解密,必须用接收方的公钥加密(接收方用自己的私钥解密),不是用你自己的私钥,私钥加密是签名场景的逻辑,和加密完全无关。
2. 可行的修复方案
可根据实际场景三选一:
方案一:继续用非对称密钥传输,更换为RSA证书
把JKS里存储的接收方公钥换成RSA类型,同时把密钥加密算法改成对应的RSA加密算法,比如EncryptionConstants.ALGO_ID_KEYTRANSPORT_RSAOAEP,即可正常运行。
方案二:坚持使用EC密钥,切换为密钥协商模式
如果必须用EC证书,就不能用密钥传输模式,要切换到ECDH密钥协商流程,选择ECDH对应的密钥加密算法URI即可,OpenSAML原生支持ECDH密钥协商。
方案三:使用预共享对称密钥
如果接收方同意提前共享AES256对称密钥,你可以继续使用ALGO_ID_KEYWRAP_AES256算法,把KeyEncryptionParameters里的凭证换成预共享的对称密钥即可,不需要使用非对称公钥。
3. OpenSAML限制的合理性说明
OpenSAML的Encrypter类做这个校验完全符合W3C XML加密规范:XML Encryption 1.1标准明确规定,密钥传输(Key Transport)算法仅支持RSA类公钥,DSA、EC公钥都不支持密钥传输场景,所以源码里的校验是完全合规的,不是框架的问题。
内容的提问来源于stack exchange,提问作者Fitzcaraldo
相关产品推荐
相关产品推荐

