【问题标题】:Difference between SSL pinning and certificate validatingSSL pinning 和证书验证之间的区别
【发布时间】:2017-06-25 22:42:39
【问题描述】:

有人可以在这里解释验证证书与使用自签名证书描述的区别吗:

https://jetforme.org/2013/05/validating-a-self-signed-ssl-certificate-in-ios-and-os-x-against-a-changing-host-name/

和这里描述的 SSL 固定:

https://infinum.co/the-capsized-eight/how-to-make-your-ios-apps-more-secure-with-ssl-pinning

  • SecPolicyCreateSSL 是什么意思?
  • SecTrustEvaluate具体在做什么?
  • 第一个链接中的过程是否包括 SSL pinning?
  • 如果不是,是否同时实现两者是个好主意?

谢谢

【问题讨论】:

  • SecPolicyCreateSSL 是一个用于评估 SSL 证书链的策略对象。 SecTrustEvaluate 是一个评估指定 SSL 证书和策略的信任的函数。
  • 好的,谢谢您的回答,但这可以从函数名称中推导出来。例如 SecPolicyCreateSSL() 和 SecPolicyCreateBasicX509() 有什么区别?
  • 第一个链接中的代码存在巨大的安全问题(调用 SecPolicyCreateSSL(true, NULL) 来禁用主机名验证,我的回答中描述了第 2 步)。
  • 我知道。但这是验证自签名证书的唯一方法,对吧?
  • 是的,但我仍然会为正确的名称自行签署证书,因此我不必禁用关键的安全功能(这在此处可能无关紧要,但人们复制和粘贴代码)。

标签: ios ssl https self-signed pinning


【解决方案1】:

首先让我们澄清一下 Cocoa 世界中的术语:

  • SecPolicyRef 是在验证证书链时定义规则的策略:链内证书中要检查的内容(签名、到期日期等),它们确定证书链是否有效/信任与否。
  • SecTrustRef 对象是证书链(基本上是SecCertificateRef 的数组)和SecPolicyRef 的组合。该对象表示验证证书链所需的所有内容(证书 + 策略)。

验证服务器的证书链涉及两个步骤:

  1. 需要验证证书路径(签名、到期日期等)以确保服务器证书是由受信任的 CA 颁发的。
  2. 为其颁发服务器证书的名称(通用名称或主题备用名称)需要与应用程序尝试连接的服务器的名称相匹配。

这些步骤用SecPolicyRef表示:

  • SecPolicyCreateBasicX509() 返回一个包含所有要检查 1 的内容的策略;这是由于历史原因而存在的,但绝不应该使用它。
  • SecPolicyCreateSSL() 返回一个包含 1 和 2 的所有规则的策略;这是您必须使用的。

然后您使用SecTrustEvaluate() 来验证服务器的SecTrustRef。结果将根据传递的SecPolicyRef 告诉您服务器的证书链是否受信任。

最后,SSL pinning 意味着在整个过程中添加第三步:

  1. 证书链必须包含特定的密钥或证书。这可确保只有您知道您部署在服务器上的证书才会被应用接受,而不是任何 CA 为您的域颁发的任何证书。

我建议您不要编写自己的 SSL 验证实现(无论是否使用 pinning),因为您可以看出,API 非常复杂,并且很有可能出现巨大的错误,从而使您的应用程序极度不安全。

我开发了一个库来简化 SSL pinning;它可以在https://github.com/datatheorem/TrustKit 获得,并负责所有繁重的工作。

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 2010-09-11
    • 1970-01-01
    • 2017-03-31
    • 2017-07-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多