我把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