2017-02-24 21 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:jailbrokenの場合は、iOSデバイスでこれを行うことができます。

+0

目的は、iOSでmbedtls(以前はPolarSSLとして知られていました)を使用することです。 mbedtlsは機能するためにルートCAを必要とするためです。投稿されたmacOSコードは正確なことを行います。 – KevinResoL

+0

[They](https://github.com/robotmedia/RMStore/blob/master/RMStore/Optional/RMAppReceipt.m#L247)も同様です。あなたに影響を与えるかもしれません。オプションとして、それをDER形式で変換することができます。 – Ricowere

+0

この例では、インターネットからルート証明書(Appleのもの)を1つだけダウンロードしたり、アプリケーション内にバンドルしたりしています。だから私の要求とはまったく異なっています。 (私はすべてのルート証明書がデバイス自体に格納されている必要があります) – KevinResoL

2

システムに保存されているルート証明書を取得できるのSecurity.frameworkは、macOSでのみ使用できます。不思議なことに、これはiOS上で利用できない(関連する関数のセットからの)いくつかの関数の1つです。意図的に、誰が知っていますか?

+0

申し訳ありませんが、私はそれを取得しません。私のコードは 'SecTrustCopyAnchorCertificates'を使わなかったので、なぜあなたがそれを言及したのか分かりません。つまり、iOSで利用できないAPIがあるだけなので、元の質問に対する解決策はありません。 – KevinResoL

+0

はい。 macOSでは、システム内のルート証明書を取得するさまざまな方法があります。あなたの質問のコードスニペットは、iOSのサンドボックスの制限のためにiOSでは機能しません。 'SecTrustCopyAnchorCertificates'と' SecTrustSettingsCopyCertificates'は、iOS上でルート証明書を取得する機能を提供する2つの関数です。どんな理由であれ、iOSでは利用できません。 –

関連する問題