使用SecPKCS12Import函数不会导入以编程方式生成的x509标识

时间:2015-03-14 23:56:36

标签: xcode macos openssl x509

我正在尝试使用函数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命令有关。有什么想法吗?

1 个答案:

答案 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,则证书将导入到钥匙串中,但不会返回任何数据结构(假设它尚未存在)。

我希望这会有所帮助。我发现了几个对这个问题的引用,并没有明确解释发生了什么。