无法与AFNetworking 2一起使用自签名证书

我把Apache服务器使用的.cer证书放在Xcode项目中。 当应用程序试图与服务器交谈时,我在Xcode中得到这个错误:

Assertion failure in id AFPublicKeyForCertificate(NSData *__strong)(), /Users/../ProjectName/AFNetworking/AFSecurityPolicy.m:52 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: allowedCertificate' 

这里是调用服务器的代码:

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [AFJSONResponseSerializer serializer]; [self setSecurityPolicy:[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]]; [manager POST:@"https://www.example.com/" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { //success } failure:^(AFHTTPRequestOperation *operation, NSError *error) { //failure }]; 

我没有运气改变固定模式为AFSSLPinningModeCertificate。

当我删除这一行:

 [self setSecurityPolicy:[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]]; 

服务器响应错误消息:

 "The operation couldn't be completed. (NSURLErrorDomain error -1012.)" 

证书是使用OpenSSL创build的,我甚至尝试了一个来自StartSSL.com的免费证书

至于Apache服务器端,这里是虚拟主机configuration:

 # My custom host <VirtualHost *:443> ServerName www.example.com DocumentRoot "/path/to/folder" SSLEngine on SSLCipherSuite HIGH:!aNULL:!MD5 SSLCertificateFile /path/to/www.example.com.cer SSLCertificateKeyFile /path/to/www.example.com.key <Directory "/the/directory/"> Options Indexes FollowSymLinks Includes ExecCGI AllowOverride All Require all granted </Directory> ErrorLog "logs/mysite.local-error_log" </VirtualHost> 

并且服务器确实收听443端口

它看起来像你的证书文件格式不正确。 您的代码在这些行失败( AFURLConnectionOperation/pinnedPublicKeys ):

 SecCertificateRef allowedCertificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)data); NSParameterAssert(allowedCertificate); 

我有同样的错误(在AFNetworking 1.1 ,但版本应该不重要),当我的证书看起来像这样:

 -----BEGIN CERTIFICATE----- .. -----END CERTIFICATE----- 

我设法解决这个问题,将证书转换为x509格式,使用这个答案的命令:

 openssl x509 -in adn.crt -outform der -out "adn.der" 

之后,我将adn.der重新命名为adn.cer ('.cer'似乎是AFNetworking的预期扩展),现在一切正常。

问题不在于AFNetworkings,而是在iOS上:您需要在设备上安装自签名证书,因为iOS安全设置禁止连接到不受信任的源。

您可以通过在iOS设备上打开证书(将其邮寄给自己并打开它)并按照安装说明来添加自签名证书作为可信来源。

如果需要,您可以通过更改安全策略来禁用无效的证书检查。

 [self setAllowInvalidCertificates:YES]; 

请阅读以下文档: http : //cocoadocs.org/docsets/AFNetworking/2.0.3/Classes/AFSecurityPolicy.html#//api/name/allowInvalidCertificates

您也可以固定证书: http : //cocoadocs.org/docsets/AFNetworking/2.0.3/Classes/AFSecurityPolicy.html#//api/name/pinnedCertificates