SSL与AFNetworking

问题描述:

钢钉在我的应用我使用HTTPS和自签名证书来保护我的客户端和服务器之间的连接。SSL与AFNetworking

我是想有AFNetworking库做我的证书中的应用程序捆绑在一起的副本SSL钢钉。

AFURLConnectionOperation头,我定义两个:

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ =1 
#define _AFNETWORKING_PIN_SSL_CERTIFICATES_ =1 

,并呼吁我的AFJSONRequestOperationstart之前,我的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钢钉可与.CER证书,但在我的自托管OS X Web服务器我有一个.crt证书。

这是什么问题?有没有办法使AFNetworking与.crt工作?

在Windows中我将我.CRT以.CER并试图捆绑到这一点我的应用程序,但我仍然得到同样的错误。我是否应该尝试使用新创建的.cer文件切换.crt文件,即使在服务器端也是如此?

+0

你找到答案吗?介意分享一下吗? – jAckOdE

+0

我刚刚放弃了使用AFNetworking并写了一个使用标准的NSURLConnection(并且充当连接本身的委托)的类来发出请求,并且我手工处理了' - (void)连接:NSURLConnection *)连接willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge'方法是NSURLConnectionDelegate协议的一部分,如果你想看看代码请随时询问。 – BigLex

+0

我还没有尝试过。但在AFNetworking样本项目中。 SSL固定模式设置为AFSSLPinningModePublicKey,而不是AFSSLPinningModeCertificate。你试过了吗? – jAckOdE

我明白了。

我在我所创造的,从我的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)的数据。

UPDATE:
,这对我来说什么作品在OS X上使用具有使用Base64困难的人的OpenSSL:

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

你的工作是正确的一个,但是,如何使它工作没有任何.cer文件?这是个问题! –

+8

仅供参考,我在使用base64进行转换时遇到了问题。相反,我用'openssl x509 -in test.crt -outform der -out test.cer'。 – CharlesA

+0

任何人都对.cer |感到困惑.crt等,有一个[好帖](http://www.gtopia.org/blog/2010/02/der-vs-crt-vs-cer-vs-pem-certificates/)关于它会当然清楚你的疑惑。 它还显示了如何将证书转换为不同的格式。 – nefarianblack

如果您使用AFNetworking 2.x和您所使用的正确的.CER但您的通话仍收到错误代码-1012,你应该禁用validatesCertificateChain

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

,或者你可以在通过这一切在整个证书链。

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

您可以使用下面的命令:

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