2017-02-24 157 views
11

以下代碼讀出macOS中的根證書。以編程方式讀取iOS中的根CA證書

我只是想知道iOS中的等效代碼是什麼?

https://github.com/HaxeFoundation/hxcpp/blob/7bd5ff3/src/hx/libs/ssl/SSL.cpp#L455-L491

CFMutableDictionaryRef search; 
CFArrayRef result; 
SecKeychainRef keychain; 
SecCertificateRef item; 
CFDataRef dat; 
sslcert *chain = NULL; 

// Load keychain 
if(SecKeychainOpen("/System/Library/Keychains/SystemRootCertificates.keychain",&keychain) != errSecSuccess) 
    return null(); 

// Search for certificates 
search = CFDictionaryCreateMutable(NULL, 0, NULL, NULL); 
CFDictionarySetValue(search, kSecClass, kSecClassCertificate); 
CFDictionarySetValue(search, kSecMatchLimit, kSecMatchLimitAll); 
CFDictionarySetValue(search, kSecReturnRef, kCFBooleanTrue); 
CFDictionarySetValue(search, kSecMatchSearchList, CFArrayCreate(NULL, (const void **)&keychain, 1, NULL)); 
if(SecItemCopyMatching(search, (CFTypeRef *)&result) == errSecSuccess){ 
    CFIndex n = CFArrayGetCount(result); 
    for(CFIndex i = 0; i < n; i++){ 
     item = (SecCertificateRef)CFArrayGetValueAtIndex(result, i); 

     // Get certificate in DER format 
     dat = SecCertificateCopyData(item); 
     if(dat){ 
      if(chain == NULL){ 
       chain = new sslcert(); 
       chain->create(NULL); 
      } 
      mbedtls_x509_crt_parse_der(chain->c, (unsigned char *)CFDataGetBytePtr(dat), CFDataGetLength(dat)); 
      CFRelease(dat); 
     } 
    } 
} 
CFRelease(keychain); 
if(chain != NULL) 
    return chain; 
+0

由於您顯示的代碼是用'cpp'編寫的,所以您仍然可以直接使用它,因爲cpp中使用的所有關鍵字都來自Apple的'Security.framework',您是否嘗試過使用相同的內容,您可以使用整個'SSL.cpp'?我認爲它會爲你工作。 – iphonic

+0

'/ System/Library/Keychains/SystemRootCertificates.keychain'在iOS上不存在。或者至少你不能讀它,因爲一切都是沙盒。 – KevinResoL

回答

3

恐怕是不可能做到給出的應用生態系統中的iOS等效是沙箱。

不知道您的目的,解決此問題的常用方法是從apple.com/certificateauthority下載蘋果根證書,然後將其存儲在您的應用中以供閱讀。

看看這個article也鼓舞你。

PS:如果iOS設備已越獄,可能會這樣做。

+0

目的是在iOS中使用mbedtls(以前稱爲PolarSSL)。因爲mbedtls需要根CA來運行。發佈的macOS代碼確實如此。 – KevinResoL

+0

[他們](https://github.com/robotmedia/RMStore/blob/master/RMStore/Optional/RMAppReceipt.m#L247)正在做類似的事情。這可能會激勵你。作爲選項,您可以將其轉換爲DER格式以防萬一。 – Ricowere

+0

該示例僅從互聯網下載一個根證書(Apple版本),或將其捆綁到應用程序中。所以它與我的要求完全不同。 (我需要存儲在設備本身中的所有根證書) – KevinResoL

2

Security.framework函數SecTrustCopyAnchorCertificates允許您檢索存儲在系統中的根證書僅在macOS上可用。奇怪的是,它是iOS上不可用的少數函數之一(來自相關函數集)。故意,誰知道?

+0

對不起,我不太明白。我的代碼沒有使用'SecTrustCopyAnchorCertificates',所以我不確定你爲什麼提到它。或者換句話說,你的意思是說我的原始問題根本沒有解決方案,因爲有些API只是在iOS上不可用? – KevinResoL

+0

是的。在macOS上,有不同的方法來檢索系統中的根證書。由於iOS的沙盒限制,您的問題中的代碼片段無法在iOS上運行。 'SecTrustCopyAnchorCertificates'和'SecTrustSettingsCopyCertificates'是應該讓你能夠在iOS上檢索根證書的兩個函數;但無論出於什麼原因,它們都不適用於iOS。 –

相關問題