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

dju*_*dju 2 ssl https self-signed pinning ios

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

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

谢谢

Nab*_*bla 7

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

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

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

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

这些步骤表示为SecPolicyRef:

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

然后SecTrustEvaluate(),您可以使用它来验证服务器SecTrustRef.结果将告诉您服务器的证书链是否基于SecPolicyRef传递的信任链.

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

  1. 证书链必须包含特定密钥或证书.这样可以确保应用程序只接受您在服务器上部署的证书,而不是任何CA为您的域颁发的证书.

我建议不要编写自己的SSL验证实现(有或没有固定),因为,你可以说,API非常复杂,并且存在巨大的错误,这些错误会使你的App非常不安全.

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