在我的应用中,我使用https和自签名SSL证书来保护我的客户端和服务器之间的连接。
我试图让AFNetworking库在应用程序中捆绑的证书副本上进行SSL固定。
在AFURLConnectionOperation
标题中我定义了两个:
#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ =1
#define _AFNETWORKING_PIN_SSL_CERTIFICATES_ =1
在致电start
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文件?
答案 0 :(得分: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
答案 1 :(得分:3)
如果您正在使用AFNetworking 2.x,并且您使用了正确的.cer但仍然在通话时收到错误代码-1012,则应禁用validatesCertificateChain
:
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
securityPolicy.validatesCertificateChain = NO;
或者您可以在pinnedCertificates
中的整个证书链中传递所有内容。
答案 2 :(得分:0)
您的证书必须具有cer而非crt的扩展名,并且应该是.der格式。将输出文件添加到Xcode项目中。
您可以使用以下命令:
openssl x509 -in your.crt -out certificate_cer.cer -outform der