以编程方式读取 iOS 中的根 CA 证书
Programmatically read root CA certificates in iOS
以下代码读取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;
考虑到应用生态系统是沙盒化的,恐怕无法在 iOS 中执行等效操作。
在不知道您的目的的情况下,解决此问题的常用方法是从 apple.com/certificateauthority 下载苹果根证书,然后将其存储在您的应用程序中以供读取。
看看这个 article 也会给你启发。
PS:如果 iOS 设备越狱,则可以执行此操作。
Security.framework
中的 SecTrustCopyAnchorCertificates
功能可让您检索存储在系统中的根证书,仅适用于 macOS。奇怪的是,它是 iOS 上不可用的少数几个函数之一(来自一组相关函数)。故意的,谁知道?
以下代码读取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;
考虑到应用生态系统是沙盒化的,恐怕无法在 iOS 中执行等效操作。
在不知道您的目的的情况下,解决此问题的常用方法是从 apple.com/certificateauthority 下载苹果根证书,然后将其存储在您的应用程序中以供读取。
看看这个 article 也会给你启发。
PS:如果 iOS 设备越狱,则可以执行此操作。
Security.framework
中的 SecTrustCopyAnchorCertificates
功能可让您检索存储在系统中的根证书,仅适用于 macOS。奇怪的是,它是 iOS 上不可用的少数几个函数之一(来自一组相关函数)。故意的,谁知道?