SOAP请求加密时出现Wrong key usage错误的求助
问题根源分析
核心错误java.security.InvalidKeyException: Wrong key usage是由于新证书的密钥用途(Key Usage)不满足SOAP加密操作的要求导致的:
对比新旧用户证书(证书链的第1个证书):
- 旧证书的Key Usage包含
keyEncipherment和dataEncipherment,同时Extended Key Usage包含clientAuth,完全符合客户端发起加密SOAP请求的密钥用途要求 - 新证书的Key Usage仅包含
keyEncipherment、digitalSignature、keyAgreement,缺少dataEncipherment字段,且Extended Key Usage为空,无法通过WSS4J 1.6.1的密钥用途校验
WSS4J 1.6.1在执行加密操作时,会严格校验证书的Key Usage是否匹配加密场景:
keyEncipherment用于加密对称密钥(对应你配置的rsa-1_5密钥传输算法)dataEncipherment用于加密实际的SOAP消息体(对应你配置的aes128-cbc对称加密算法)
解决方案
方案一:重新生成符合要求的证书(推荐)
联系证书签发机构,重新生成满足以下要求的用户证书:
- Key Usage必须包含:
keyEncipherment+dataEncipherment - Extended Key Usage建议添加:
clientAuth(明确标记证书用于客户端身份验证及加密操作)
方案二:临时关闭WSS4J的密钥用途校验(不推荐,降低安全级别)
针对你的Spring WS配置,修改密钥库(Crypto)的配置,关闭Key Usage校验:
如果你的keystore bean是org.springframework.ws.soap.security.wss4j.support.CryptoFactoryBean,添加以下属性:
<bean id="keystore" class="org.springframework.ws.soap.security.wss4j.support.CryptoFactoryBean"> <!-- 原有配置:密钥库路径、密码等 --> <property name="checkKeyUsage" value="false"/> </bean>
该配置会让WSS4J跳过证书Key Usage的校验,强制使用当前证书进行加密操作。
验证
修改后重新部署应用,发起SOAP请求,确认加密错误消失。
内容的提问来源于stack exchange,提问作者Uğur Yeşilyurt
相关产品推荐
相关产品推荐

