Security

有沒有辦法將現有 CSR“國家程式碼”欄位的字元串格式從 UTF8 更改為可列印字元串?

  • October 18, 2012

CentOS 5.x

簡短版本:

有沒有辦法將現有CSR“國家程式碼”欄位的編碼格式從 UTF8 更改為可列印字元串?

長版:

我有一個使用標準 java 安全提供程序 (jsse/jce) 的產品生成的 CSR。CSR 中的一些資訊使用 UTF8 字元串(據我了解,這是截至 2003 年 12 月 31 日的首選編碼要求 - RF 3280)。

我送出 CSR 的證書頒發機構明確要求將國家程式碼指定為 PrintableString。我的 CSR 將其列為 UTF8 字元串。

我回到了最新的 RFC - http://www.ietf.org/rfc/rfc5280.txt。它似乎特別在國家名稱上發生衝突。這就是它變得有點混亂的地方……

countryName 是相對 DN 的一部分。相對 DN 被定義為 DirectoryString 類型,它被定義為 TeletexString、printableString、universalString、utf8String 或 bmpString 的選擇。它還更具體地將 countryName 定義為 alpha(上限 2 個字節)或數字(上限 3 個字節)。此外,在附錄中,它指的是 X520countryName,它僅限於大小為 2 的 PrintableString。

因此,很清楚為什麼它不起作用。證書頒發機構和 Sun/Java 似乎不同意他們對 countryName 要求的解釋。我可以做些什麼來修改 CSR 以與 CA 兼容?

弄清楚了。以下是基本步驟:

1)打開原CSR,複製“——-BEGIN CERTIFICATE REQUEST——-”和“——-END CERTIFICATE REQUEST——-”標記之間的base64數據。

2)將此數據放入base64解碼器並將輸出保存為二進製文件。有多種線上服務可以做到這一點,或者如果您願意,也可以使用本地工具。

3)下載/安裝十六進制編輯器。用它來打開解碼的二進製文件。

  1. 在 countryName 之前查找兩個值:
0C
02
  1. 編輯值 0C (UTF8String) 並將其更改為 13(Printablestring)

  2. 保存更改並使用 base64 編碼器將其編碼回 base64。

  3. 在“——-BEGIN CERTIFICATE REQUEST——”和“——-END CERTIFICATE REQUEST——-”標記之間添加base64數據。

引用自:https://serverfault.com/questions/422639