首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法对AFNetworking 2使用自签名证书

无法对AFNetworking 2使用自签名证书
EN

Stack Overflow用户
提问于 2013-11-27 04:50:54
回答 4查看 6.8K关注 0票数 3

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

代码语言:javascript
复制
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'

下面是调用服务器的代码:

代码语言:javascript
复制
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,但没有成功。

当我删除这一行时:

代码语言:javascript
复制
[self setSecurityPolicy:[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]];

服务器返回错误消息:

代码语言:javascript
复制
"The operation couldn't be completed. (NSURLErrorDomain error -1012.)"

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

至于Apache Server端,以下是虚拟主机配置:

代码语言:javascript
复制
# 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端口

EN

回答 4

Stack Overflow用户

发布于 2014-02-22 17:41:22

看起来您的证书文件的格式不正确。您的代码在以下行(AFURLConnectionOperation/pinnedPublicKeys)失败:

代码语言:javascript
复制
SecCertificateRef allowedCertificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)data);
NSParameterAssert(allowedCertificate);

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

代码语言:javascript
复制
-----BEGIN CERTIFICATE-----
..
-----END CERTIFICATE----- 

我设法解决了这个问题,方法是使用this answer中的命令将证书转换为x509格式

代码语言:javascript
复制
openssl x509 -in adn.crt -outform der -out "adn.der"

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

票数 9
EN

Stack Overflow用户

发布于 2013-11-28 03:07:40

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

您可以将自签名证书添加为受信任的来源,方法是在您的iOS设备上打开证书(将其发送给您自己并打开),然后按照安装说明进行操作。

票数 0
EN

Stack Overflow用户

发布于 2013-11-28 03:54:23

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

代码语言:javascript
复制
[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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20227700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档