【问题标题】:"Signature does not match" error when importing a certificate into keystore - why?将证书导入密钥库时出现“签名不匹配”错误 - 为什么?
【发布时间】:2025-07-01 07:40:02
【问题描述】:

原则上,这是一个 keytool 问题,与 Shibboleth 无关,但了解我想要到达的位置可能会有所帮助(如果Shibboleth 的东西对你没有任何意义):

我正在尝试设置 Shibboleth SSO 配置。 IdP 已经建立,我已经建立了一个 SP 来与它交谈。到目前为止(经过多次黑客攻击),非常好 - SP(链接到 apache 反向代理)拦截了对安全资源的调用并正确重定向到 IdP,它显示了一个登录页面。登录后,IdP 回复给 SP 一个令牌。

然后,SP 应该联系 IdP 以将令牌转换为对登录者有效的属性,但这里 IdP 抱怨消息不符合安全要求。

据我所知,这是因为 tomcat 不接受 SP 的证书,该证书是自签名的。

相反,我正在尝试生成 CA 证书,并使用它来签署证书。我已将 CA 证书添加到 $JAVA_HOME/jre/lib/security/cacerts,因此 keytool 应该信任它,但是当我尝试将签名的 SP 证书导入密钥库时,我收到错误:

keytool 错误:java.security.SignatureException:签名不匹配。

我使用的导入命令是:

keytool -import -v -alias sp_signed_cert -keystore idp.jks -trustcacerts -file server.crt

其中 server.crt 是签名的 SP 证书。

为什么会出现此错误,我该怎么办?

我似乎剩下的唯一选择是:

  • 将 apache 放在运行 IdP 的 Tomcat 前面,并使用其“optional_no_ca”设置来使用自签名证书,
  • 花钱请知名 CA 签署证书(不过,这并不适合概念验证)

【问题讨论】:

  • 目前看来,我们的技术支持可以为我提供 GoDaddy 签名的证书。

标签: tomcat ssl-certificate keytool


【解决方案1】:

老实说,我不知道 SSO 或 IdP,但这里是:

据我所知,这是因为 tomcat 不接受 SP 的证书,它是自签名的。

如果这确实是问题,您只需将该证书导入 Tomcat 的信任库。

相反,我正在尝试生成 CA 证书,并使用它来签署 证书

我不知道你想在这里做什么。是谁签的?
默认情况下,cacerts 具有所有受信任的 CA 的证书,例如威瑞信。
此外,您在帖子中提到的导入命令正在尝试导入 idp.jks 而不是 cacerts

【讨论】:

  • 我将 CA 证书导入到信任库(以及 cacerts 文件 - 因此 java 应该将其视为受信任的根 CA),然后尝试将签名的服务器 (SP) 证书导入到 idp。 jks 密钥库。 CA 证书是自签名的(由我创建)。
【解决方案2】:

将 apache 放在运行 IdP 的 Tomcat 前面并使用它的 "optional_no_ca" 设置能够使用自签名证书,

你不需要 apache 在 tomcat 前面,同样,Shibboleth 人说不需要。

花钱请知名 CA 签署证书(不是真的 不过,适用于概念验证)

需要一个众所周知的 CA,只是因为信任链,如果你不想要,你永远不需要付费。

尝试首先在不加密的情况下进行通信,因为您正在进行概念验证。

错误是在您进行导入时出现的? 为什么不导入 CA 证书而不仅仅是特定的 SP?

【讨论】:

  • IdP 已经设置好(以前的 PoC),所以加密已经设置好了,并且对于重定向的登录请求工作正常,但我明白你的意思。目前看来,我可以通过我们的技术支持“借用”由 GoDaddy 签署的证书。