ios - 获取 iOS 中包含的可信根证书的 PEM 文件(用于验证 gRPC)

标签 ios objective-c swift ssl grpc

我有一个使用 gRPC 与服务器通信的 iOS 应用程序。为了保护连接,服务器已颁发绑定(bind)到主机名的证书。我需要根据 iOS 设备上的根证书验证该证书。

看起来可以使用 gRPC 在 iOS 上提供的以下方法来进行验证:

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

因此,要使用它,我需要提供要用于验证的根证书,以及服务器已针对其颁发证书的主机。主机部分很简单——它应该只是服务器颁发的证书绑定(bind)到的主机名。但我坚持要获取根证书。

我找到了以下用于访问根证书的示例:

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

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

我要使用的证书是 this list 上受信任的根证书之一iOS 10 中包含的可信根证书。不过我不知道如何访问它。

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

最佳答案

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

首先——正如 John Tracid 所指出的——加载特定的根证书是不可能的,就像我最初想要的那样。看起来需要 PEM 文件的方法调用也不适合此用途。它可能只应在 John 建议的情况下使用,即当您想要添加您自己的证书以便随后可以轻松访问时。

其次,为了让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;

具体来说:如果@c pemRootCerts 为 nil,将使用与 gRPC 捆绑的默认 CA 证书。与 gRPC 捆绑的证书列表不一定与与 iOS 捆绑的相同,但它看起来像一个 pretty solid list ,我想使用的证书在两者中。

所以为了让它工作,我只需要为 pem 传递 nil

关于ios - 获取 iOS 中包含的可信根证书的 PEM 文件(用于验证 gRPC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44627931/

相关文章:

ios - 设置 iOS 导航背景颜色无法正常工作

ios - 更改 UIControl 的 NSAttributedString 文本值

ios - 动画转换 UILabel 的一部分

ios - <file>-Info.plist 无法打开,因为没有这样的文件

ios - 为什么默认 Storyboard 应用程序有第二个接口(interface)声明

ios - Scenekit - 软化物理主体

ios - UIPopoverController 和内容 ViewController - 内存管理问题

ios - 点击 UITextField 不工作

iOS Crashlytics 原始未处理的崩溃日志

ios - 如何调用这个完成处理程序?