【问题标题】:Old client's SSL certificate and new certificate with same pub/private key旧客户端的 SSL 证书和具有相同 pub/private 密钥的新证书
【发布时间】:2019-04-05 15:09:18
【问题描述】:

情况:我们无法更新客户端设备上的der 文件。我们网络服务器上的 SSL 证书即将到期。

是否可以在不更换客户端证书的情况下更新服务器的 SSL 证书?

我们希望遵循本指南:https://www.smashingmagazine.com/how-to-issue-a-new-ssl-certificate-with-an-old-ssl-key/

但是,我们不确定它是否有帮助。

问题是:

der 文件(在客户端)是否仅包含公钥,并且使用上面链接中描述的技术更新 SSL 证书是安全的(保持相同的 pub/private 密钥)。

在不替换der 文件的情况下,它可以在客户端设备上运行吗?或者der文件不仅包含SSL证书的公钥,还包含其他一些信息?

【问题讨论】:

  • 不清楚客户端设备上的证书是什么?客户端认证证书?服务器证书的公共副本?你能详细说明一下吗?
  • 这是一个 der 文件,用于在 iOS 应用程序中建立 SSL 固定。我认为如果服务器的证书是公共副本。如果您在 Firefox 中打开网站并下载证书 - 它是完全相同的文件。
  • 如何进行固定验证?基于完全匹​​配(比较证书的二进制副本时)还是仅基于密钥匹配(仅比较公钥部分时)?
  • 我将尝试从代码中了解自己,但快速响应是: // 建立锚定在我们捆绑证书上的信任链。 CFArrayRef certArrayRef = CFArrayCreate(NULL, (void *)&cert, 1, NULL); SecTrustRef serverTrust = protectionSpace.serverTrust; SecTrustSetAnchorCertificates(serverTrust, certArrayRef); // 验证信任。 SecTrustResultType 信任结果; SecTrustEvaluate(serverTrust, &trustResult);

标签: ssl ssl-certificate x509 public-key der


【解决方案1】:

恐怕,但根据您的原始帖子和说明,客户端将期望 Web 服务器 与客户端设备上的 DER 文件中存储的服务器证书相同。客户端执行精确的二进制副本比较(不仅是公钥)。

任何替换服务器证书的尝试都将导致客户端连接失败。如果您打算替换 Web 服务器上的证书,您还必须更新客户端设备。

不幸的是,有很多有缺陷的 HPKP 实现(老实说,没有看到任何可靠的实现)在更改服务器证书之前都可以正常工作。为了正确处理服务器证书替换,客户端必须能够存储至少两个服务器证书,现有的和新的。这是高级服务器证书替换过程:

  1. 提前从 CA 获取新的服务器证书。
  2. 通过并排包含新证书来更新应用程序。当客户端更新其设备上的应用程序时,客户端应用程序将信任现有证书和新证书。
  3. 让客户有时间在他们的设备上更新应用程序。理想情况下,您应该等到所有客户端都使用更新的证书更新了应用版本。
  4. 更改服务器绑定中的 SSL 证书。
  5. 一段时间后,您可以通过从信任库中删除过期证书来再次更新客户端证书。

只有这个步骤序列可以保证不间断的证书固定更新。

【讨论】:

  • 谢谢!我已经检查过了,你是对的。 SecTrustEvaluate 检查证书文件,而不是公钥(opensource.apple.com//source/Security/Security-55471/… - 我不精通 cpp,但看起来这是真的)。所以我必须更新客户端设备上的der 文件:(
  • 我同意你关于如何替换 SSL 证书的方式。但是对于正在查看此答案并希望在 iOS 上实现 SSL 固定的人来说,很高兴知道还有另一种方法 - 比较公钥。查看这篇文章了解更多详情:bugsee.com/blog/ssl-certificate-pinning-in-mobile-applications
  • 公钥固定仍需要正确实施,因为公钥也发生了变化。
猜你喜欢
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2017-04-28
  • 2021-02-09
  • 1970-01-01
  • 2023-03-07
  • 2014-11-20
相关资源
最近更新 更多