【问题标题】:Get a PEM file for a trusted root certificate included in iOS (for authenticating gRPC)获取包含在 iOS 中的可信根证书的 PEM 文件(用于验证 gRPC)
【发布时间】:2017-06-19 10:19:06
【问题描述】:

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

看起来可以使用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 文件?

【问题讨论】:

    标签: ios objective-c swift ssl grpc


    【解决方案1】:

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

    首先——正如 John Traacid 所指出的——不可能像我最初想要的那样加载特定的根证书。看起来需要 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;
    

    具体来说:If @c pemRootCerts is nil, the default CA Certificates bundled with gRPC will be used。 gRPC 捆绑的证书列表不一定和 iOS 捆绑的证书列表一样,但看起来像pretty solid list,而我要使用的证书在两者中。

    所以为了让它工作,我只需要通过 nil 来获取 pem。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 您好,感谢您的回答!是的,颁发者有证书,而且很容易得到它。但我特别想不添加任何证书,特别是看到服务器证书的根目录与 iOS 捆绑在一起。就我而言,这就是重点。您的回答帮助我弄清楚了在哪里看。虽然我没有回调来查询证书,但我想使用的服务有它自己的等价物;看我的回答。再次感谢!
      猜你喜欢
      • 2021-07-21
      • 1970-01-01
      • 2021-09-20
      • 2020-11-30
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      相关资源
      最近更新 更多