如何以pem格式以编程方式从OSX上的所有钥匙串中提取所有根CA证书?
钥匙串编程服务应该允许这样但是如何?
任何帮助都会很明显。
答案 0 :(得分:3)
回答我自己的问题: 在OSX上,您可以调用NSTask从安全命令行实用程序获取响应:
security find-certificate -a -p /System/Library/Keychains/SystemCACertificates.keychain > allcerts.pem
答案 1 :(得分:2)
嘿,我知道我迟到了,但我今天遇到了同样的问题,花了很多时间搞清楚如何做到这一点。我知道原来的海报可能不再需要知道这个了,但希望这有助于某人。
以下是我的代码,可以在不使用命令行的情况下完全复制您所做的事情。
+ (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;
}
答案 2 :(得分:1)
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
顺便说一句:将鼠标悬停在“钥匙串”列表(顶部/左侧)上时,您可以在“钥匙串访问”中看到这些路径。
您可以通过使用默认证书来源来组合系统和用户pems
security find-certificate -a -p >certs.pem
当您要对典型公司内部内容使用require('https')。request而无需诉诸于接受未经检查的证书等黑客攻击时,这对于node.js超级有用。您不需要包括系统根目录,因为nodejs已经涵盖了这些根目录。
NODE_EXTRA_CA_CERTS=certs.pem node