我试图让AFNetworking图书馆在应用程序中捆绑我的证书的副本上进行SSL固定.
在AFURLConnectionOperation标题中我定义了两个:
#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ =1 #define _AFNETWORKING_PIN_SSL_CERTIFICATES_ =1
在我的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 webserver中,我有一个.crt证书.
这是问题吗?有没有办法使AFNetworking与.crt一起工作?
在Windows框上,我将.crt转换为.cer,并尝试将其捆绑到我的应用程序中,但我仍然收到相同的错误.我应该尝试用新创建的.cer甚至在服务器端切换.crt文件?
解决方法
我处于这样的情况,我已经创建了一个自我签发的证书,以从我的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项目,一切都正常.
希望这可以帮助!!
Btw,您可能会注意到,Xcode将显示您的“.crt”或“.cer”键的信息,无论它是base64还是原始密钥,所以不要让这混淆.您应该可以在任何一种情况下看到证书数据,只是AF仅接受原始(非base64)证书数据.
更新:
任何人在使用base64时遇到麻烦,这对于使用OpenSSL的OS X在我有用:
$openssl base64 -d -in ./server.crt -out ./server.cer