有在我的例子三個證,假設它們形成一個鏈條,但我還不知道他們簽署了:如何知道哪些X509證書籤名的另一個證書(JAVA)
X509Certificate c1 = ....
X509Certificate c2 = ....
X509Certificate c2 = ....
我會喜歡知道哪個證書負責簽署其他證書。
該計劃是要獲得「AuthorityKeyIdentifier」並將其與「SubjectKeyIdentifier」匹配。
import org.bouncycastle.asn1. DEROctetString;
private static String decodeKey(byte[] e) {
DEROctetString octet = new DEROctetString(e);
return octet.toString();
}
String subjectKeyId = decodeKey(c.getExtensionValue("2.5.29.14"));
String authorityKeyId = decodeKey(c.getExtensionValue("2.5.29.35"));
即時得到的證書以下(在鏈中的順序):主體/權限密鑰ID對
的執行subjectKeyIdentifier和執行authorityKeyIdentifier的值進行解碼後:
證書1:(端鏈
#0416041482b7384a93aa9b10ef80bbd954e2f10ffb809cde
#04183016801482b7384a93aa9b10ef80bbd954e2f10ffb809cde
的)證書2:由證書1
簽名#04160414ab8059c365836d1d7d13bd19c3ec1a8f0d476aa3
#04183016801482b7384a93aa9b10ef80bbd954e2f10ffb809cde
證書3:證書2
(no SubjectKeyIdentifier - null bytes)
#041830168014ab8059c365836d1d7d13bd19c3ec1a8f0d476aa3
格式化並對齊,方便閱讀(同樣的事情,在頂部的一個)
------------------------------------------------------------------------------
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
------------------------------------------------------------------------------
Certificate 1
#04 16 04 14 82 b7 38 4a 93 aa 9b 10 ef 80 bb d9 54 e2 f1 0f fb 80 9c de
#04 18 30 16 80 14 82 b7 38 4a 93 aa 9b 10 ef 80 bb d9 54 e2 f1 0f fb 80 9c de
Certificate 2
#04 16 04 14 ab 80 59 c3 65 83 6d 1d 7d 13 bd 19 c3 ec 1a 8f 0d 47 6a a3
#04 18 30 16 80 14 82 b7 38 4a 93 aa 9b 10 ef 80 bb d9 54 e2 f1 0f fb 80 9c de
Certificate 3
=== == == == == == == == == == == NO DATA == == == == == == == == == == == ==
#04 18 30 16 80 14 ab 80 59 c3 65 83 6d 1d 7d 13 bd 19 c3 ec 1a 8f 0d 47 6a a3
簽名我期待C3的執行authorityKeyIdentifier等同於c2的SubjectKeyIdentifier。這似乎並非如此。編輯:結果的某些部分似乎匹配,我對「SubjectKeyIdentifier」有一些想法 - 它始終以'#04'開始,後面跟着內容的長度(以十六進制表示)。我現在對如何解碼「SubjectKeyIdentifier」有一定的想法,但「AuthorityKeyIdentifier」對我來說仍然是一個很大的謎團。
相關 SO post難道我做錯任何事與解碼? AuthorityKeyIdentifier爲什麼與對其簽名的證書的SubjectKeyIdentifier不正確匹配?
您可以發佈證書本身供我們分析嗎? – frasertweedale