有没有办法将现有 CSR“国家代码”字段的字符串格式从 UTF8 更改为可打印字符串?

有没有办法将现有 CSR“国家代码”字段的字符串格式从 UTF8 更改为可打印字符串?

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 特别冲突。这里有点混乱……

countryName 是相对 DN 的一部分。相对 DN 被定义为 DirectoryString 类型,该类型定义为 teletexString、printableString、universalString、utf8String 或 bmpString 中的一种。它还更具体地将 countryName 定义为字母(上限为 2 个字节)或数字(上限为 3 个字节)。此外,在附录中,它引用了 X520countryName,该名称仅限于大小为 2 的 PrintableString。

所以,很明显为什么它不起作用。看来证书颁发机构和 Sun/Java 对 countryName 要求的解释不一致。我可以做些什么来修改 CSR 以与 CA 兼容?

答案1

搞清楚了。基本步骤如下:

1) 打开原始 CSR,并将 base64 数据复制在“——-BEGIN CERTIFICATE REQUEST——-”和“——-END CERTIFICATE REQUEST——-”标记之间。

2) 将这些数据放入 base64 解码器,并将输出保存为二进制文件。有多种在线服务可以执行此操作,或者如果您愿意,也可以使用本地工具。

3) 下载/安装十六进制编辑器。使用它打开解码的二进制文件。

4)查找 countryName 之前的两个值:

0C
02

5)编辑值0C(UTF8String),并将其更改为13(Printablestring)

6)保存更改并使用 base64 编码器将其编码回 base64。

7) 将 base64 数据重新添加到“——-BEGIN CERTIFICATE REQUEST——-”和“——-END CERTIFICATE REQUEST——-”标记之间。

相关内容