首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >自签名服务器根CA的AFNetworking验证问题

自签名服务器根CA的AFNetworking验证问题
EN

Stack Overflow用户
提问于 2015-08-28 03:55:13
回答 3查看 4.8K关注 0票数 18

这个问题试图为我的特定用例找到解决方案,并记录我为遵循此过程的任何其他人所做的事情。

我们有一个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格式):

https://support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-them

并将.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

用于创建我们的安全策略的代码:

代码语言:javascript
复制
    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术语的流利程度很低,如果有人能澄清我提出的问题是否正确,那就太好了。具体的问题是:

  1. 我是否正确生成了证书,以便服务器可以使用自签名server.crt文件证明其身份?
  2. 是否可以仅将rootCA.cer文件包含到捆绑包中,并能够验证叶证书server.crt?它是否能够验证由同一rootCA签名的另一个server2.crt文件?或者我们应该在rootCA和叶之间包含一个中间证书?
  3. 是公钥固定还是证书固定是正确的解决方案?我读过的每个论坛和博客文章都说可以,但即使有了最新的AFNetworking库,我们也没有任何幸运。
  4. 服务器需要以某种方式同时发送server.crt和roomCA.pem签名吗?
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32258330

复制
相关文章

相似问题

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