这个问题试图为我的特定用例找到解决方案,并记录我为遵循此过程的任何其他人所做的事情。
我们有一个RESTful服务器和一个iOS应用程序。我们有自己的证书颁发机构,服务器有根证书颁发机构和自签名证书。我们按照这个过程生成了以下文件:
http://datacenteroverlords.com/2012/03/01/creating-your-own-ssl-certificate-authority/
rootCA.pem rootCA.key server.crt server.key
只有服务器证书存储在我们的服务器上,作为SSL过程的一部分,公钥与API调用一起发送以进行验证。
我遵循这个过程来使用AFNetworking来使用证书固定以及公钥固定来验证我们的自签名证书:
http://initwithfunk.com/blog/2014/03/12/afnetworking-ssl-pinning-with-self-signed-certificates/
我们根据本指南将.crt文件转换为.cer文件(采用DER格式):
并将.cer文件(server.cer)包含在iOS应用程序包中。这成功地允许我们的应用程序向我们的服务器发出GET/POST请求。但是,因为我们的服务器证书可能会过期或重新颁发,所以我们希望改用根CA,就像AFNetworking上此线程中的用户所做的那样:
https://github.com/AFNetworking/AFNetworking/issues/1944
目前我们已经更新到AFNetworking 2.6.0,所以我们的网络库应该包含所有更新,包括本文讨论中的更新:
https://github.com/AFNetworking/AFNetworking/issues/2744
用于创建我们的安全策略的代码:
var manager: AFHTTPRequestOperationManager = AFHTTPRequestOperationManager()
manager.requestSerializer = AFJSONRequestSerializer() // force serializer to use JSON encoding
let policy: AFSecurityPolicy = AFSecurityPolicy(pinningMode: AFSSLPinningMode.PublicKey)
var data: [NSData] = [NSData]()
for name: String in ["rootCA", "server"] {
let path: String? = NSBundle.mainBundle().pathForResource(name, ofType: "cer")
let keyData: NSData = NSData(contentsOfFile: path!)!
data.append(keyData)
}
policy.pinnedCertificates = data
policy.allowInvalidCertificates = true
policy.validatesDomainName = false
manager.securityPolicy = policy
在包含server.cer的情况下,我们可以通过固定公钥(也尝试使用AFSecurityPolicyPinningMode.Certificate)来信任我们的服务器;这之所以有效,是因为包含了确切的证书。但是,因为我们可能会更改服务器所拥有的server.crt文件,所以我们希望能够只使用rootCA.cer来完成此操作。
然而,由于应用程序捆绑包中只包含rootCA,这似乎不起作用。是否rootCA没有足够的公钥信息来验证使用根CA签名的服务器证书?server.crt文件也可能具有不断变化的CommonName。
此外,由于我对SSL术语的流利程度很低,如果有人能澄清我提出的问题是否正确,那就太好了。具体的问题是:
https://stackoverflow.com/questions/32258330
复制相似问题