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

问题描述 投票:3回答:3

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

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

任何帮助都会很明显。

macos keychain pem
3个回答
3
投票

回答我自己的问题:在OSX上,您可以调用NSTask从安全命令行实用程序获取响应:

security find-certificate -a -p /System/Library/Keychains/SystemCACertificates.keychain > allcerts.pem

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;
}

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

顺便说一句:当您将鼠标悬停在钥匙串列表(顶部/左侧)上时,您可以在Keychain Access中看到这些路径。

您可以使用默认证书源来组合系统和用户请求

security find-certificate -a -p >certs.pem

这对于node.js来说非常有用,当你想在典型的公司内部资源上使用require('https')。请求而不必在没有检查的情况下接受任何证书。您不需要包含系统根,因为nodejs已经涵盖了这些根。

NODE_EXTRA_CA_CERTS=certs.pem node
© www.soinside.com 2019 - 2024. All rights reserved.