2013-05-13 69 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