Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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
Xcode 程序生成的x509标识将不会使用SecPKCS12Import函数导入_Xcode_Macos_Openssl_X509 - Fatal编程技术网

Xcode 程序生成的x509标识将不会使用SecPKCS12Import函数导入

Xcode 程序生成的x509标识将不会使用SecPKCS12Import函数导入,xcode,macos,openssl,x509,Xcode,Macos,Openssl,X509,我试图使用函数SecPKCS12Import将编程生成的标识添加到OSX密钥链中 对于使用KeychainAssistant程序生成的证书,一切都很好。即使SecPKCSImport未报告任何错误,以编程方式生成几乎相同的证书也不会导入。这是两张证书。首先是进口: Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: sha256Wit

我试图使用函数
SecPKCS12Import
将编程生成的标识添加到OSX密钥链中

对于使用KeychainAssistant程序生成的证书,一切都很好。即使
SecPKCSImport
未报告任何错误,以编程方式生成几乎相同的证书也不会导入。这是两张证书。首先是进口:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=Tes001, C=US
        Validity
            Not Before: Mar 14 21:05:31 2015 GMT
            Not After : Mar 13 21:05:31 2016 GMT
        Subject: CN=Tes001, C=US
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    00:c0:fc:0b:81:1f:b7:9f:d2:bb:eb:50:6d:0d:9a:
                    35:3b:b3:a6:26:e5:b1:67:99:0f:51:30:2b:f5:a4:
                    ...
                    a7:76:60:ab:72:3f:21:48:aa:37:ca:b4:6e:b1:b0:
                    06:85
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage: critical
                E-mail Protection
    Signature Algorithm: sha256WithRSAEncryption
        3d:d8:72:a8:85:f7:4d:6e:52:08:16:cc:76:40:33:9e:41:0d:
        48:f0:ba:0c:b2:03:d5:06:9a:bb:95:54:48:1d:db:6f:fe:97:
        ...
        ac:37:a3:ee:11:65:3b:e7:8f:26:f0:09:ae:ed:e0:53:e4:34:
        40:1c:ef:bd
No Trusted Uses.
No Rejected Uses.
Alias: Tes001
Key Id: 3A:2F:24:91:A9:D7:FA:C2:C5:48:56:86:11:89:E4:41:A0:24:07:F8
这是一个不会加载的:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=US, CN=Test001
        Validity
            Not Before: Mar 14 23:46:07 2015 GMT
            Not After : Mar 13 23:46:07 2016 GMT
        Subject: C=US, CN=Test001
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    00:be:86:09:de:8e:08:4d:4a:14:b4:e9:7b:b2:bb:
                    c6:87:09:3b:c1:5f:9e:0e:bc:58:93:44:7d:b1:7b:
                    ...
                    38:b0:84:0c:08:22:fd:96:a8:0a:09:90:a7:e8:35:
                    11:c9
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature
    Signature Algorithm: sha1WithRSAEncryption
        8e:d1:e5:b3:55:ee:04:dd:bc:15:32:1d:6b:3b:a9:e1:6f:c7:
        0b:5e:6d:51:a5:d0:82:52:f5:6d:f5:89:97:71:2a:26:fc:f1:
        ...
        aa:37:fe:fc:80:34:8e:2a:ec:6d:c9:7e:25:b2:c1:f5:65:2f:
        25:4a:ad:b8
唯一的显著差异是第一份证书的最后四行:

No Trusted Uses.
No Rejected Uses.
Alias: Tes001
Key Id: 3A:2F:24:91:A9:D7:FA:C2:C5:48:56:86:11:89:E4:41:A0:24:07:F8
我不知道如何以编程方式生成这个。我知道这个函数
X509\u alias\u set1(self.X509,“Test001”,-1)
将生成前三行,尽管我不确定它是否正确。我不知道如何生成“Key Id:”行。我认为这与根据openssl命令的可信证书的信任命令有关。有什么想法吗?

1。)代码运行良好。问题是证书和私钥被直接导入密钥链。如果密钥链中已经存在相同的证书,则不会导入新证书,也不会在SecPKCS12Import函数的items字典中返回新证书。未报告任何错误(因为PKCS12是正确的),也未返回任何数据。这一点并不清楚,特别是考虑到SecPKCS12Import的官方描述:“然后可以使用Keychain服务API(请参阅Keychain服务参考)将身份和相关证书放入Keychain中。”不!这似乎是自动发生的

2.)我在第一篇帖子中提到了证书末尾的字段:无可信使用、无拒绝使用、别名和密钥ID。我不认为这些是必需的,但它们是由openSSL函数设置的
X509\u别名\u集1(X509*x,无符号字符*名称,整数长度)
int X509\u密钥id\u集1(X509*x,无符号字符*id,整数长度)
。 SecPKCS12Import中的密钥ID字段(
kSecImportItemKeyID
)由
X509\u keyid\u set1
确定。标签字段似乎由证书中的通用名称决定,而不是由
X509\u alias\u set1
决定。最后,通过函数
sk\u ASN1\u OBJECT\u value
包括可信或拒绝的使用。有关详细信息,请参见x509.h和x509.c。可以找到有关密钥ID结构的详细信息。它似乎是ASN.1模+ASN.1指数的SHA1散列。我还没有完全试验过这个,所以你只能靠自己了

3.)最后,如果在PKCS12_create中将私钥设置为NULL,则证书将导入到密钥链中,但不会返回任何数据结构(假设它还不存在)


我希望这有帮助。我发现了一些关于这个问题的参考资料,但没有明确解释发生了什么。

PKCS12需要私钥和证书对。第一个看起来有密钥,而第二个没有。另外,我不知道这是否对您试图做的事情有意义,但您似乎在第一个密钥对的别名中有一个输入错误-tes001(注意缺少第二个“t”)
没有可信的使用
,而且朋友听起来像是来自Keychain或其API。它不是证书数据的一部分。您应该显示用于保存证书的代码。您还应该将完整证书显示为通过
openssl x509-in-inform DER-text-noout转储。最后,这是什么类型的最终实体证书?它是用户证书还是服务器证书(从主题DN看不明显)?从第一个证书开始,由于S/MIME(电子邮件保护),它看起来像是一个用户证书。感谢您的评论。正如我在随后的帖子中所解释的,这促使我深入了解这件事。我处于一种学习模式,所以证书有些做作,因此有些混乱。