2011-08-03 78 views
1

我想以編程方式創建一個CSR。我已閱讀關於ASN.1,RFC 2986,X.509。
我也解析手動幾個DER編碼的CSR文件,這是使用OpenSSL創建。
一切看起來只是一對夫婦的事情說清楚:創建CSR編程

  1. 公鑰部分包含下一字節8D 00 30 81 89 02 81 81位串內容之前(和03 81後)。這是什麼?我注意到用DER編碼的所有CSR文件都包含它們。在RFC中我沒有發現任何關於它們的信息。

  2. 簽名部分包含簽名內容之前,但03 81後下一不清楚字節。據我瞭解,這部分包含有關BIT STRING中最後一個八位字節的信息(實際上最後一個字節應該記錄多少個字節)。但我不明白如何解碼這些字節。例如簽名可能看起來像下面這樣:
    03 81 81 00 64 12 ... 24 B1 28
    其中03h是字符串格式,81h長度的比特串的64 12 ... 24 B1 28是簽名(但它有長度80H)。我不明白部分81 00

在此先感謝。

+0

什麼是您的公鑰算法? RSA? – emboss

+0

是的,我現在使用RSA – gN0Me

回答

3
  1. SubjectPublicKeyInfo中的BIT STRING取決於您的公鑰算法。內容再次DER編碼,請參閱RFC 3370以瞭解可能性。

  2. 如果你的簽名如下所示

    03 81 81 00 64 12 ... 24 B1 28

這是如下來解釋。 DER是TLV(標籤 - 長度 - 值)的編碼。所以第一個字節(用他們的話來說就是八位字節)表示正確注意到的BIT STRING標籤 - 03。

第二字節確定的長度:

在長形式中,長度字節必須由一個初始八位位組和一個或多個後續的八位位組。初始 字節必須如下編碼:

一個)位8應的一個; b)比特7至1應將長度八比特組中的後續八比特組的數目編碼爲無符號二進制整數 ,比特7作爲最高有效位;

81將第8位設置爲1,因此其餘位指示確定總長度的字節數。在你的情況下,它只是1字節。所以下一個字節是長度 - 81等於129字節的簽名長度。所以下面的129個字節代表你的價值,開始與00

+0

謝謝你的回答!我絕對理解簽名部分。關於SubjectPublicKeyInfo我不太清楚。我使用RSA算法來生成公鑰。我應該用DER編碼公鑰嗎?我已經看過RFC 3370了。 RSA應當編碼這樣的: 'RSAPublicKey :: = SEQUENCE { 模量INTEGER, - N的 publicExponent INTEGER} - e' 但爲什麼有使用INTEGER而不是BIT STRING? 「8D 00 30 81 89 02 81 81」看起來不像DER格式。例如,我不知道8D是什麼意思。你能幫我嗎? – gN0Me

+0

根據您使用的語言,通常有一種方法可以讓您檢索DER編碼。是的,你說得對,BIT STRING的價值又是一個獨立的(嵌套的)DER編碼。這意味着如果您解碼BIT STRING的**值**,那麼您將獲得RSAPublicKey的SEQUENCE。 – emboss

+0

謝謝,我發現了很好的DER編碼在線工具:http://lapo.it/asn1js/ – gN0Me

1

當你說「程序」,你到底是什麼意思?在代碼中?如果是這樣,你使用什麼語言?BouncyCastle JCE提供程序包含用於生成PKCS#10請求的類,前提是您使用的是Java。你需要做的就是指定必要的組件(DN,公鑰等)。我相信還有一個.Net的實現,它可能更適合微軟的環境。

+0

我在我的iPhone項目中創建了自己的ASN.1解碼器。看起來像這是唯一的解決方案 – gN0Me

+1

如果你在iPhone上開發,你應該能夠利用OpenSSL。它應該有你需要的所有方法。 ASN.1解析,CSR創建等 – Shadowman