AFNetworking - SSL - 添加了 .cer 文件,但在服务器端出现 400 错误
Posted
技术标签:
【中文标题】AFNetworking - SSL - 添加了 .cer 文件,但在服务器端出现 400 错误【英文标题】:AFNetworking - SSL - .cer file added but 400 error on server-side 【发布时间】:2014-05-20 16:12:41 【问题描述】:我正在开发一个 ios 应用,我们希望通过 SSL 保护我们的私有 API。
服务器端一切正常,我们的 android 应用已经连接到 HTTPS。 另一方面,在 iOS 上,我被卡住了。
我正在使用 AFNetworking,所以:
正如this topic 解释的那样,我只是将我们的 .cer 文件添加到我的包中 由于我们使用的是自签名证书,所以我还添加了:_
AFHTTPRequestOperationManager *requestManager = [AFHTTPRequestOperationManager manager];
requestManager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
requestManager.securityPolicy.allowInvalidCertificates = YES;
AFNetworking 找到证书,但我们的服务器拒绝认证,并返回丑陋的 400。
由于我对 SSL 非常陌生,因此非常感谢任何有关如何查找失败位置的提示。我们可以在服务器端记录一些东西或类似的东西来“调查”吗?
【问题讨论】:
url是通过https://
连接的吗?如果不是,它每次都会吐回 400。我只需要用 Google API 来处理这个问题。除非网址以 https://
开头,否则它将不起作用
@ChaseWalden 是的,我确实连接到 https...
如果服务器是“拒绝者”,您可能需要检查您的服务器端配置并确保它不会因为配置错误而拒绝连接。您的服务器可能会拒绝它,因为它是自签名的。您是否有调试代理来查看传出的 http 请求。试试跨平台的 Charles Web Proxy。用它来查看您发出的请求。
好吧,我终于知道问题所在了: - 如果我提供 base-64 编码的 .cer 文件,iOS 会崩溃,因为 AFNetworking/iOS 不支持 base-64 编码的证书 - 但在服务器上 -一方面,nginx 需要一个 base-64 编码的证书。因此它尝试解码未编码的证书。但是我们如何在不替换 Nginx 的情况下解决这个问题呢?
您需要覆盖 AFHTTPRequestSerializer 以将 NSData 转换为 base64。
【参考方案1】:
我建议不要使用您正在使用的固定模式。它不像从服务器获取证书的“setDefaultSSLPinningMode:AFSSLPinningModePublicKey”那样可维护。
通过这种方式,您可以将有效的 .cer 文件放入您的应用程序包中一次,然后在将来,只要您继续使用相同的公钥和私钥(.key 文件)更新您的证书,您就不会'不必更新您的应用程序。
考虑这个选项。如果您尝试这样做并保持设置相同以允许无效证书,您应该能够使其正常工作。当您不允许使用不受信任的证书时,事情会变得有些棘手。
【讨论】:
以上是关于AFNetworking - SSL - 添加了 .cer 文件,但在服务器端出现 400 错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 AFNetworking 2.3.1 的自签名 SSL 证书
使用 AFNetworking 进行 SSL 固定 - validatesCertificateChain = true