【问题标题】:SSL Pinning with AFNetworking使用 AFNetworking 进行 SSL 固定
【发布时间】:2013-05-17 15:41:55
【问题描述】:

在我的应用程序中,我使用 https 和自签名 SSL 证书来保护我的客户端和服务器之间的连接。

我试图让 AFNetworking 库对我捆绑在应用程序中的证书副本执行 SSL 固定。

AFURLConnectionOperation 标头中我定义了两者:

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ =1
#define _AFNETWORKING_PIN_SSL_CERTIFICATES_ =1

在我的AFJSONRequestOperation 上调用start 之前,我将SSLPinningMode 属性设置为AFSSLPinningModeCertificate

但是在尝试执行 JSON 请求时,我不断收到以下错误:

Error Domain=NSURLErrorDomain Code=-1012 "The operation couldn’t be completed. 
(NSURLErrorDomain error -1012.)" UserInfo=0x758f120 
{NSErrorFailingURLKey=https://mydomain.com,
NSErrorFailingURLStringKey=https://mydomain.com}

AFURLConnectionOperation 标头中,我读到 SSL Pinning 可以使用 .cer 证书,但在我的自托管 OS X 网络服务器中,我有一个 .crt 证书。

这是问题吗?有没有办法让 AFNetworking 与 .crt 一起工作?

在 Windows 机器上,我将 .crt 转换为 .cer 并尝试将其捆绑到我的应用程序中,但仍然遇到相同的错误。我是否应该尝试在服务器端使用新创建的 .cer 切换 .crt 文件?

【问题讨论】:

  • 你找到答案了吗?介意分享一下吗?
  • 我刚刚放弃使用 AFNetworking 并编写了一个使用标准 NSURLConnection 的类(并充当连接本身的代表)来发出请求,我手动处理了比较的东西在- (void)connection: NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 方法中,它是NSURLConnectionDelegate 协议的一部分,如果您想查看代码,请随时询问。
  • 我自己没试过。但在 AFNetworking 示例项目中。 SSL 固定模式设置为 AFSSLPinningModePublicKey,而不是 AFSSLPinningModeCertificate。你试过了吗?

标签: ios ssl afnetworking


【解决方案1】:

我搞定了。

我的情况是,我创建了一个自签名证书,以便从我的 iOS 应用程序中访问我自己的服务器 API。 我用 OpenSSL 创建了我的证书。当我完成创建它时,我有几个文件,其中一个是“server.crt”。最初,我尝试将其重命名为“server.cer”,并为我的 AFURLConnectionOperation 对象使用“AFSSLPinningModeCertificate”。这不起作用,我注意到示例使用“AFSSLPinningModePublicKey”,所以我尝试了,仍然没有运气。

所以我将我的文件(即重命名的“.crt”文件)与他的文件进行了比较。
我注意到“server.crt”是 base64 编码的,就像这样:

-----BEGIN CERTIFICATE-----
394230AFDFD... 
-----END CERTIFICATE-----

我从 Mattt 在 AFNetworking 中的示例中注意到,他使用的“adn.cer”文件不是 base64 编码的。它只是原始字节。 所以,我这样做了:

$ base64 -D -i ./server.crt -o ./server.cer

我将 AFURLConnectionOperation 设置为 AFSSLPinningModePublicKey。
我把它放回项目中,对我的 iOS 项目进行了清理和构建,一切正常。

希望这会有所帮助!

顺便说一句,您可能会注意到 Xcode 会为您的“.crt”或“.cer”键显示信息,无论它是 base64 还是原始密钥,所以不要让您感到困惑。无论哪种情况,您都应该能够看到证书数据,只是 AF 只会接受原始(非 base64)数据。

更新:
任何对 base64 有问题的人,这对我在 OS X 上使用 OpenSSL 有用:

$ openssl base64 -d -in ./server.crt -out ./server.cer

【讨论】:

  • 您的解决方法是正确的,但是,如何在没有任何 .cer 文件的情况下使其工作?这就是问题!
  • 仅供参考,我在使用 base64 进行转换时遇到了问题。相反,我使用了“openssl x509 -in test.crt -outform der -out test.cer”。
  • 任何人对 .cer 感到困惑 | .crt 等,有一个关于它的nice post 肯定会消除你的疑虑。它还展示了如何将证书转换为不同的格式。
  • @tanmaykhandelwal:该链接现在已断开,但我注意到the content was reposted on support.ssl.com
  • @firebear 我在帖子中添加了更新,希望对您有所帮助!
【解决方案2】:

如果您使用的是 AFNetworking 2.x,并且您使用的是正确的 .cer,但在您的呼叫中仍然收到错误代码 -1012,您应该禁用 validatesCertificateChain

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
securityPolicy.validatesCertificateChain = NO;

或者你可以在pinnedCertificates的整个证书链中全部传递。

【讨论】:

    【解决方案3】:

    您的证书必须有扩展名 cer 而不是 crt 并且应该是 .der 格式。将输出文件添加到您的 Xcode 项目。

    您可以使用以下命令:

    openssl x509 -in your.crt -out certificate_cer.cer -outform der

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 2018-04-15
      • 1970-01-01
      • 2018-01-17
      • 2017-01-06
      • 1970-01-01
      相关资源
      最近更新 更多