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(电子邮件保护),它看起来像是一个用户证书。感谢您的评论。正如我在随后的帖子中所解释的,这促使我深入了解这件事。我处于一种学习模式,所以证书有些做作,因此有些混乱。