无法在AFNetworking 2中使用自签名证书

iel*_*ani 3 apache ssl-certificate ios afnetworking-2

我把Apache Server使用的.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'
Run Code Online (Sandbox Code Playgroud)

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

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
}];
Run Code Online (Sandbox Code Playgroud)

我没有运气将固定模式更改为AFSSLPinningModeCertificate.

当我删除这一行:

[self setSecurityPolicy:[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]];
Run Code Online (Sandbox Code Playgroud)

服务器响应错误消息:

"The operation couldn't be completed. (NSURLErrorDomain error -1012.)"
Run Code Online (Sandbox Code Playgroud)

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

至于Apache Server端,这里是虚拟主机配置:

# 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>
Run Code Online (Sandbox Code Playgroud)

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

ale*_*x-i 9

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

SecCertificateRef allowedCertificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)data);
NSParameterAssert(allowedCertificate);
Run Code Online (Sandbox Code Playgroud)

我有同样的错误(打开AFNetworking 1.1,但版本无关紧要),当我的证书看起来像这样:

-----BEGIN CERTIFICATE-----
..
-----END CERTIFICATE----- 
Run Code Online (Sandbox Code Playgroud)

我设法通过使用此答案中的命令将证书转换为x509格式来解决此问题:

openssl x509 -in adn.crt -outform der -out "adn.der"
Run Code Online (Sandbox Code Playgroud)

之后我重新命名adn.deradn.cer('.cer'似乎是预期的延伸AFNetworking),现在一切正常.