2017-06-19 326 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捆綁在一起。就我而言,這就是關鍵。你的回答幫我弄清楚了要去哪裏看。雖然我沒有回電查詢證書,但我想使用的服務具有其自己的近似等效性;看到我的答案。再次感謝! –