Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Apple Security framework从证书中检索主题或颁发者可分辨名称?_C_Objective C_Macos_Security_Certificate - Fatal编程技术网

如何使用Apple Security framework从证书中检索主题或颁发者可分辨名称?

如何使用Apple Security framework从证书中检索主题或颁发者可分辨名称?,c,objective-c,macos,security,certificate,C,Objective C,Macos,Security,Certificate,我想使用SecCertificateCopyValues函数,但找不到正确的证书OID。 我应该使用其他功能吗?是的,您应该使用SecCertificateCopyValues。在这个返回的字典中,从您提到的Apple文档链接中搜索kSecOIDX509V1IssuerName。在文件中提到 本词典中的每个条目本身就是一本词典,其关键字如中所述 例如,要获得发行人的通用名称,您可以: 检索密钥kSecOIDX509V1IssuerName的字典 从中获取具有密钥kSecPropertyKey

我想使用
SecCertificateCopyValues
函数,但找不到正确的证书OID。


我应该使用其他功能吗?

是的,您应该使用
SecCertificateCopyValues
。在这个返回的字典中,从您提到的Apple文档链接中搜索
kSecOIDX509V1IssuerName
。在文件中提到

本词典中的每个条目本身就是一本词典,其关键字如中所述

例如,要获得发行人的通用名称,您可以:

  • 检索密钥kSecOIDX509V1IssuerName的字典
  • 从中获取具有密钥kSecPropertyKeyValue的值数组
  • 每个数组元素本身就是一个字典
  • e、 g.对于公共名称,您要使用密钥kSecOIDCommonName
要创建可分辨名称,可以检查不同的键

如果您有OID,您可以查看Apple开源中相应的常量,并将其添加到代码中,以获得您感兴趣的值:

在代码中,这可能如下所示:

static CFStringRef createDistinguishedName(CFDictionaryRef certValues, CFStringRef key) {
    CFDictionaryRef dict = CFDictionaryGetValue(certValues, key);
    CFArrayRef values = CFDictionaryGetValue(dict, kSecPropertyKeyValue);
    
    CFMutableStringRef dn = CFStringCreateMutableCopy(NULL, 0, CFSTR(""));
    
    CFStringRef keys[] = { kSecOIDCommonName, kSecOIDOrganizationName, kSecOIDOrganizationalUnitName, kSecOIDLocalityName, kSecOIDStateProvinceName, kSecOIDCountryName, kSecOIDSerialNumber, kSecOIDEmailAddress};
    CFStringRef txt[] = { CFSTR("CN"), CFSTR("O"), CFSTR("OU"), CFSTR("L"), CFSTR("S"), CFSTR("C"), CFSTR("SERIALNUMBER"), CFSTR("MAIL")};
    
    bool appendComa = false;
    for(int i = 0; i < CFArrayGetCount(values); i++) {
        CFDictionaryRef subDict = CFArrayGetValueAtIndex(values, i);
        CFStringRef labelVal = CFDictionaryGetValue(subDict, kSecPropertyKeyLabel);
        
        for(int k = 0; k < sizeof(keys)/sizeof(keys[0]); k++) {
            if (kCFCompareEqualTo == CFStringCompare(labelVal, keys[k], 0)) {
                if (appendComa)
                    CFStringAppend(dn, CFSTR(", "));
                CFStringAppend(dn, txt[k]);
                CFStringAppend(dn, CFSTR("="));
                CFStringAppend(dn, CFDictionaryGetValue(subDict, kSecPropertyKeyValue));
                appendComa = true;
            }
        }
    }
    return dn;
}
void printDN(CFDataRef certData) {
    SecCertificateRef certRef = SecCertificateCreateWithData(NULL, certData);
    CFDictionaryRef certValues = SecCertificateCopyValues(certRef, nil, nil);
    CFStringRef dn = createDistinguishedName(certValues, kSecOIDX509V1IssuerName);
    CFShow(dn);
    CFRelease(dn);
    CFRelease(certValues);
    CFRelease(certRef);
}
来自的示例证书将产生以下字符串:

C=JP, S=Tokyo, L=Chuo-ku, O=Frank4DD, OU=WebCert Support, CN=Frank4DD Web CA, MAIL=support@frank4dd.com

回答得好!非常感谢你。