OSX:以编程方式从PEM格式的钥匙串中导出系统证书

时间:2015-09-09 06:28:33

标签: macos keychain pem

如何以pem格式以编程方式从OSX上的所有钥匙串中提取所有根CA证书?

钥匙串编程服务应该允许这样但是如何?

任何帮助都会很明显。

3 个答案:

答案 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