2013-05-13 127 views
0

我正在为一些基于python的程序开发X509存储系统。所有证书都保存在PostgresSQL数据库中以便于访问。所有工作正常,当为每个主题(用户或CA权威)时,只有一个证书。然后找到验证路径是容易的,因为发行人现场唯一标识一个证书:当一些证书续期因过期或任何其他原因X509证书 - 维护认证路径

UserCert1(CA_cert_class1) -> CA_cert_class1(CA_cert_root) -> CA_cert_root(CA_cert_root) 

的问题开始。 然后两个或多个证书具有相同的主题。在这种情况下,有多种可能的认证途径。

UserCert1(CA_cert_class1) -> CA_cert_class1(CA_cert_root)(old)->.... 
          -> CA_cert_class1(CA_cert_root)(new)->.... 

尝试每种组合都不是解决方案。此外,删除过期证书不是解决方案,因为我需要它们来验证旧的数字签名。

问题:如何唯一标识X509证书内的颁发者证书。我想,这与X509v3扩展有关。我不知道如何使用它们。

回答

2

这里有一个X509v3扩展。这是AKI(权威密钥标识符)。子证书中的该号码应与父证书中的SKI(主题密钥标识符)匹配。

请参阅RFC5280了解更多详情。 SKI可以通过公钥的散列或任何产生唯一编号的东西来派生。

+0

谢谢!这是我正在寻找的。现在我必须弄清楚,如何使用OpenSSL API在cpp中添加扩展。 – Marek 2013-05-14 00:21:20

+0

我在cpp中找到了很好的例子: http://stackoverflow.com/questions/2883164/openssl-certificate-lacks-key-identifiers – Marek 2013-05-14 00:29:15

1

证书颁发者和序列号唯一标识X.509证书(适用于所有符合证书)。即使更新证书,其序列号也应该不同。

X509v3扩展如主题唯一标识符不保证存在于证书中。

请尝试发行人和序列号的组合。

+0

是的,那是真的。但问题是主体证书中没有提到发行人的序列号。我所有的是名称字段和发行者名称(X500表示法)。 我可以保证在任何证书中都存在X509v3扩展,因为它们都将由我的程序创建。 因此,如果有任何方法可以将发行人证书指纹放入对象的证书中 - 这将解决我所有的问题。 – Marek 2013-05-13 08:37:57

+0

我不是一个Python程序员。在C中,以下宏可帮助您获得颁发者唯一ID #define X509_issuerUID(x)(x) - > cert_info-> issuerUID 其中x是X509 *结构证书。 – doptimusprime 2013-05-13 08:52:46

+0

意思是如果你可以访问Python中的X509 *结构,你可以访问下面的字段。 – doptimusprime 2013-05-13 08:53:25