12

以下代码读取 macOS 中的根证书。

我只是想知道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;
4

2 回答 2

5

鉴于应用程序生态系统是沙盒化的,恐怕无法在 iOS 中做同样的事情。

在不知道您的目的的情况下,解决此问题的常用方法是从apple.com/certificateauthority下载苹果根证书,然后将其存储在您的应用程序中以供阅读。

看看这篇文章也能启发你。

PS:如果iOS设备越狱,它可能可以做到这一点。

于 2017-03-05T17:22:42.120 回答
4

SecTrustCopyAnchorCertificates从中Security.framework可以检索存储在系统中的根证书的功能仅在 macOS 上可用。奇怪的是,它是少数几个在 iOS 上不可用的功能之一(来自一组相关功能)。故意的,谁知道呢?

于 2017-03-10T22:11:16.527 回答