我正在尝试使用函数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_alias_set1(self.x509, "Test001", -1)
会生成前三行,但我不确定它是否正确。我不知道如何生成"密钥ID:"线。我认为它与openssl命令的可信证书的Trust命令有关。有什么想法吗?
答案 0 :(得分:0)
1。)代码工作正常。问题是证书和私钥直接导入到钥匙串中。在密钥链中已经存在相同的证书将导致新的证书不被导入,也不会在SecPKCS12Import函数的项目字典中返回。没有报告错误(因为PKCS12是正确的)并且没有返回任何数据。这根本不明确,特别是考虑到SecPKCS12Import的正式描述:"然后您可以使用Keychain Services API(请参阅Keychain Services Reference)将身份和相关证书放入钥匙串中。"没有!它似乎是自动发生的。
2.。)我在第一篇文章中提到了证书末尾的字段:没有受信任的使用,没有被拒绝的使用,别名和密钥ID。我不相信这些是必需的,但它们是由openSSL函数设置的
X509_alias_set1(X509 *x, unsigned char *name, int len)
和int X509_keyid_set1(X509 *x, unsigned char *id, int len)
。
SecPKCS12Import中的密钥ID字段(kSecImportItemKeyID
)由X509_keyid_set1
确定。标签字段似乎由证书中的公用名确定,而不是由X509_alias_set1
确定。最后,通过函数sk_ASN1_OBJECT_value
完成包括受信任或被拒绝的使用。有关详细信息,请参阅x509.h和x509.c。可以找到关键ID结构的详细信息here。它似乎是ASN.1模数+ ASN.1指数的SHA1哈希值。我没有对此进行过彻底的实验,所以你是独立的。
3.)最后,如果私钥在PKCS12_create中设置为NULL,则证书将导入到钥匙串中,但不会返回任何数据结构(假设它尚未存在)。
我希望这会有所帮助。我发现了几个对这个问题的引用,并没有明确解释发生了什么。