如何以pem格式以编程方式从OSX上的所有密钥链中提取所有根CA证书?
钥匙串编程服务应该允许这个,但如何?
任何帮助都会很明显。
回答我自己的问题:在OSX上,您可以调用NSTask从安全命令行实用程序获取响应:
security find-certificate -a -p /System/Library/Keychains/SystemCACertificates.keychain > allcerts.pem
嘿,我知道我迟到了,但我今天遇到了同样的问题,花了很多时间搞清楚如何做到这一点。我知道原来的海报可能不再需要知道这个了,但希望这有助于某人。
以下是我的代码,无需使用命令行即可完全复制您所执行的操作。
+ (NSURL *)createCertsFileInDirectory:(NSURL *)directory {
NSString *outPath = [directory path];
if (!outPath) {
return nil;
}
outPath = [outPath stringByAppendingPathComponent:@"allcerts.pem"];
NSURL * outURL = [NSURL fileURLWithPath:outPath];
SecKeychainRef keychain;
if (SecKeychainOpen("/System/Library/Keychains/SystemCACertificates.keychain", &keychain) != errSecSuccess) {
return nil;
}
CFMutableArrayRef searchList = CFArrayCreateMutable(kCFAllocatorDefault, 1, &kCFTypeArrayCallBacks);
CFArrayAppendValue(searchList, keychain);
CFTypeRef keys[] = { kSecClass, kSecMatchLimit, kSecAttrCanVerify, kSecMatchSearchList };
CFTypeRef values[] = { kSecClassCertificate, kSecMatchLimitAll, kCFBooleanTrue, searchList };
CFDictionaryRef dict = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 4, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFTypeRef results;
OSStatus status = SecItemCopyMatching(dict, &results);
CFArrayRef arr = results;
NSLog(@"total item count = %ld", CFArrayGetCount(arr));
CFRelease(dict);
CFRelease(searchList);
CFRelease(keychain);
if (status != errSecSuccess) {
return nil;
}
CFDataRef certsData;
status = SecItemExport(results, kSecFormatPEMSequence, kSecItemPemArmour, NULL, &certsData);
CFRelease(results);
if (status != errSecSuccess) {
return nil;
}
NSData *topLevelData = (NSData *) CFBridgingRelease(certsData);
if (![topLevelData writeToURL:outURL atomically:YES]) {
return nil;
}
return outURL;
}
security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain >certs-roots.pem
security find-certificate -a -p /Library/Keychains/System.keychain >certs-system.pem
security find-certificate -a -p ~/Library/Keychains/login.keychain-db >certs-user.pem
顺便说一句:当您将鼠标悬停在钥匙串列表(顶部/左侧)上时,您可以在Keychain Access中看到这些路径。
您可以使用默认证书源来组合系统和用户请求
security find-certificate -a -p >certs.pem
这对于node.js来说非常有用,当你想在典型的公司内部资源上使用require('https')。请求而不必在没有检查的情况下接受任何证书。您不需要包含系统根,因为nodejs已经涵盖了这些根。
NODE_EXTRA_CA_CERTS=certs.pem node