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

时间:2017-02-08 10:48:09

标签: 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固定?
  • 如果没有,那么实施两者是否是个好主意?

谢谢

1 个答案:

答案 0 :(得分:7)

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

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

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

  1. 需要验证证书路径(签名,到期日期等),以确保服务器证书是由受信任的CA颁发的。
  2. 颁发服务器证书的名称(通用名称或使用者替代名称)需要与应用程序尝试连接的服务器名称相匹配。
  3. 这些步骤由SecPolicyRef

    表示
    • SecPolicyCreateBasicX509()返回的政策包含要检查的所有内容 1 ;这是出于历史原因,但永远不应该使用它。
    • SecPolicyCreateSSL()返回的政策包含 1和2 的所有规则;这是你必须使用的那个。

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

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

    1. 证书链必须包含特定密钥或证书。这样可以确保应用程序只接受您在服务器上部署的证书,而不是您域中任何CA颁发的证书。
    2. 我建议不要编写自己的SSL验证实现(有或没有固定),因为,你可以说,API非常复杂,并且存在巨大的错误,这些错误会使你的App非常不安全。

      我曾在图书馆工作,以便轻松进行SSL固定;它可以在https://github.com/datatheorem/TrustKit获得,并负责所有繁重的工作。