15

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

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

AFURLConnectionOperation标题中我定义了两个:

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ =1
#define _AFNETWORKING_PIN_SSL_CERTIFICATES_ =1

在调用startmy之前,AFJSONRequestOperation我将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 文件?

4

3 回答 3

20

我让它工作了。

我的情况是,我创建了一个自签名证书,以便从我的 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
于 2013-06-24T02:00:49.970 回答
3

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

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

或者您可以在整个证书链中将其全部传递给pinnedCertificates.

于 2014-12-23T07:37:39.480 回答
0

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

您可以使用以下命令:

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

于 2017-12-13T11:05:19.527 回答