ios - SSL 固定和证书验证之间的区别

标签 ios ssl https self-signed pinning

有人可以在这里解释验证证书与自签名证书之间的区别吗:

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 固定?
  • 如果不是,是否同时实现两者是个好主意?

谢谢

最佳答案

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

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

验证服务器的证书链包括两个步骤:

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

这些步骤由 SecPolicyRef 表示:

  • SecPolicyCreateBasicX509() 返回一个策略,其中包含要检查的所有内容 1;这是出于历史原因,但绝不能使用。
  • SecPolicyCreateSSL() 返回一个包含1 和 2 的所有规则的策略;这是你必须使用的。

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

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

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

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

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

关于ios - SSL 固定和证书验证之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42111010/

相关文章:

ios - 如何检查单例是否已经初始化?

java - 创建证书时 IP 地址作为主机名 (CN)? (HTTPS 主机名错误 : should be <ipAddress>)

ios - 如何避免 iOS 11 上的 GPS 跟踪出现间隙

CN1 模拟器上的 SSL 握手问题

python - 当我使用 SUDS 使用 web 服务时绕过 SSL

python - 在不重建的情况下在 Python 3.6 上安装 SSL 模块

php - 在多部分表单调用中,OKHttp 中参数的正确位置是什么?

django - 如何为 Azure 中的 django 项目获取 SSL 证书?

ios - 增加应用程序输出的响度

ios - 如何在 FBSDK for iOS 中标记 facebook 页面