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——-”标记之间。