在我的应用我使用HTTPS和自签名证书来保护我的客户端和服务器之间的连接。
我是想有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钢钉可与.CER证书,但在我的自托管OS X网络服务器我有一个.CRT证书。
这是什么问题? 有没有一种方法,使AFNetworking工作,.CRT?
在Windows中我将我.CRT以.CER并试图捆绑到这一点我的应用程序,但我仍然得到同样的错误。 我应该尝试将.crt文件切换与新创建的.CER甚至在服务器端?
我得到它的工作。
我是在我已经创造了从我的iOS应用程序打我自己的服务器API自签名证书的情况。 我建立了我的证书与OpenSSL的。 当我完成创建它,我有几个文件,其中之一是“server.crt这”。 起初,我尝试了将其改名为“server.cer”,并使用“AFSSLPinningModeCertificate”我AFURLConnectionOperation对象。 没有工作,我注意到例子中使用“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困难的人,这对我来说是什么在起作用使用OpenSSL的OS X:
$ openssl base64 -d -in ./server.crt -out ./server.cer
如果您使用AFNetworking 2.x和你使用了正确的.CER但您的通话仍收到错误代码-1012,你应该禁用validatesCertificateChain
:
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
securityPolicy.validatesCertificateChain = NO;
或者您也可以通过这一切在整个证书链pinnedCertificates
。
您的证书必须具有扩展CER不CRT和应该在.der格式。 输出文件添加到您的Xcode项目。
您可以使用下面的命令:
OpenSSL的X509 -in your.crt退房手续certificate_cer.cer -outform德