Macos 如何创建类似Safari中的证书选择窗口?

Macos 如何创建类似Safari中的证书选择窗口?,macos,cocoa,certificate,keychain,client-certificates,Macos,Cocoa,Certificate,Keychain,Client Certificates,我一直在寻找一种在我的程序中创建这样一个窗口的方法,但我还没有找到它的任何实现。现在我所能做的就是从keychain获取所有证书,但我无法获取pem或der格式的证书。需要向特定站点提供证书 - (void)logMessageForStatus:(OSStatus)status functionName:(NSString *)functionName { CFStringRef errorMessage; errorMessage = SecCo

我一直在寻找一种在我的程序中创建这样一个窗口的方法,但我还没有找到它的任何实现。现在我所能做的就是从keychain获取所有证书,但我无法获取pem或der格式的证书。需要向特定站点提供证书

- (void)logMessageForStatus:(OSStatus)status
               functionName:(NSString *)functionName
{
    CFStringRef errorMessage;
    errorMessage = SecCopyErrorMessageString(status, NULL);
    NSLog(@"error after %@: %@", functionName, (__bridge NSString *)errorMessage);
    CFRelease(errorMessage);
}





- (void)listCertificates
{
    OSStatus status;
    SecKeychainSearchRef search = NULL;

    // The first argument being NULL indicates the user's current keychain list
    status = SecKeychainSearchCreateFromAttributes(NULL,
                                                   kSecCertificateItemClass, NULL, &search);

    if (status != errSecSuccess) {
        [self logMessageForStatus:status
                     functionName:@"SecKeychainSearchCreateFromAttributes()"];
        return;
    }

    SecKeychainItemRef searchItem = NULL;

    while (SecKeychainSearchCopyNext(search, &searchItem) != errSecItemNotFound) {
        SecKeychainAttributeList attrList;
        CSSM_DATA certData;

        attrList.count = 0;
        attrList.attr = NULL;

        status = SecKeychainItemCopyContent(searchItem, NULL, &attrList,
                                            (UInt32 *)(&certData.Length),
                                            (void **)(&certData.Data));

        if (status != errSecSuccess) {
            [self logMessageForStatus:status
                         functionName:@"SecKeychainItemCopyContent()"];
            CFRelease(searchItem);
            continue;
        }

        // At this point you should have a valid CSSM_DATA structure
        // representing the certificate

        SecCertificateRef certificate;
        status = SecCertificateCreateFromData(&certData, CSSM_CERT_X_509v3,
                                              CSSM_CERT_ENCODING_BER, &certificate);

        if (status != errSecSuccess) {
            [self logMessageForStatus:status
                         functionName:@"SecCertificateCreateFromData()"];
            SecKeychainItemFreeContent(&attrList, certData.Data);
            CFRelease(searchItem);
            continue;
        }

        // Do whatever you want to do with the certificate
        // For instance, print its common name (if there's one)

        CFStringRef commonName = NULL;
        CFErrorRef err = NULL;
        ///CFArrayRef  arr = NULL;
        SecCertificateCopyCommonName(certificate, &commonName);
        certs = SecCertificateCopyValues(certificate, NULL, &err);
        //NSLog(@"common name = %@", (__bridge NSString *)commonName);
        //NSLog(@"data = %@", (__bridge NSArray *)arr);
        //certs = arr;
        if (commonName) CFRelease(commonName);
        //if (arr) CFRelease(arr);
        SecKeychainItemFreeContent(&attrList, certData.Data);
        CFRelease(searchItem);
    }

    CFRelease(search);
}

有没有标准的api来调用这样的窗口?或者有图书馆?如何从SecCertificateRef获取der数据

提前谢谢你