2017-06-19 324 views
0

我有一个iOS应用程序,它使用gRPC与服务器进行通信。为了保证连接的安全,服务器发布了绑定到主机名的证书。我需要根据iOS设备上的根证书验证该证书。获取iOS中包含的受信任根证书的PEM文件(用于验证gRPC)

它看起来像下面的方法,通过GRPC iOS上提供的,可以用来做验证:

open class func setTLSPEMRootCerts(_ pemRootCert: String?, forHost host: String) throws 

,我需要提供根证书我想使用的所以使用它验证以及服务器针对其颁发证书的主机。主机部分很简单 - 它应该是服务器颁发的与其绑定的证书的主机名。但我坚持拿到根证书。

我发现下面的示例中,用于访问一个根证书:

NSString *certsPath = [[NSBundle mainBundle] pathForResource:@"cacert_product" ofType:@"pem"]; 
NSError *error; 
NSString *contentInUTF8 = [NSString stringWithContentsOfFile:certsPath 
                encoding:NSUTF8StringEncoding 
                 error:&error]; 

在该示例中,所得到的contentInUTF8然后可以用作证书参数前述方法。但是,示例中的资源名称cacert_product似乎是占位符;无论如何,我的设备上没有这样的资源,我不认为它会引用我想要使用的资源。

我想要使用的证书是包含在iOS 10中的受信任根证书的this list上受信任的根证书之一。我不明白如何访问它。

所以我的问题是:如何获得iOS设备上包含的受信任根证书之一的PEM文件?

回答

1

我会在两部分回答我自己的问题。

首先 - 正如John Tracid指出的那样 - 无法加载特定的根证书,就像我最初想要的那样。它看起来像需要PEM文件的方法调用也不适用于此用途。它应该只用于像约翰建议的那种情况,即当你想添加自己的证书时,你可以很容易地访问它。

其次,为了得到GRPC工作,我发现这个方法和评论:

/** 
* Configures @c host with TLS/SSL Client Credentials and optionally trusted root Certificate 
* Authorities. If @c pemRootCerts is nil, the default CA Certificates bundled with gRPC will be 
* used. 
*/ 
+ (BOOL)setTLSPEMRootCerts:(nullable NSString *)pemRootCerts 
      withPrivateKey:(nullable NSString *)pemPrivateKey 
      withCertChain:(nullable NSString *)pemCertChain 
        forHost:(nonnull NSString *)host 
        error:(NSError * _Nullable * _Nullable)errorPtr; 

具体为:If @c pemRootCerts is nil, the default CA Certificates bundled with gRPC will be used。与gRPC绑定的证书列表不一定与iOS捆绑的证书相同,但看起来像是pretty solid list,我想使用的证书都是在两者中。

所以为了得到这个工作,我只需要通过nil为pem。

1

我认为最简单的方法是向PEM格式的发证人颁发服务器证书。他们通常拥有它。之后,您可以在gRPC中使用它。

AFAIK没有办法在iOS中获取根证书列表。当您需要检查针对iOS根证书的证书时,您使用策略(如kSecPolicyAppleSSL)。但是你的情况你没有在握手期间检查服务器证书的回调。

+0

嗨,谢谢你的回答!是的,发行人拥有证书,而且获得证书很简单。但我特别试图不添加任何证书,尤其是看到服务器证书的根与iOS捆绑在一起。就我而言,这就是关键。你的回答帮我弄清楚了要去哪里看。虽然我没有回电查询证书,但我想使用的服务具有其自己的近似等效性;看到我的答案。再次感谢! –