您的位置:首页 > 运维架构

OpenSSL生成正确显示中文证书的方法

2007-09-20 07:02 971 查看

OpenSSL生成正确显示中文证书的方法

作者:刘凯 mslk.sa@gmail.com 来源:http://blog.csdn.net/mslk 发表时间:2006-10-23 浏览次数: 3896 字号:

用openssl生成正确显示中文的证书的方法

\author 刘凯 mslk.sa@gmail.com

最近要用openssl生成证书,来配合https一起使用,可是没有根证书的签名,只能自签名一下,当用户访问https时会有一个安全警告,查看证书都是一堆字母和数字,里面如果能显示一些中文提示信息,就能让用户明白一些,这样可以少些问题。

openssl的req子命令创建的证书请求只能使用ASCII和UTF-8两种编码。

一开始创建的证书总是乱码,网上只找到了一篇文章[ http://www.infosecurity.org.cn/forum/read.php?fid=11&tid=201&fpage=1]是说如何创建中文证书的解决办法,其中还要修改openssl源代码,仔细看了他的修改方法,这是把所有的ASCII都作为UTF-8来处理了,因为主要修改的是:
switch(inform)的case MBSTRING_ASC

switch(outform)的case MBSTRING_ASC

部分的代码。

感觉他改的不对,就没有用他的办法改这部分代码,我就看了case MBSTRING_UTF8部分的代码,主要有两个函数比较重要,都在文件a_utf8.c中

switch(inform)时的UTF8_getc函数

switch(outform)时的UTF8_putc函数

里面的位操作很多,因一直对unicode的东西不熟悉,又看了UTF-8的资料,http://www.linuxforum.net/books/UTF-8-Unicode.html,这里摘录一下UTF-8的重要特性:

* UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容). 这意味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的.

* 所有 >U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集. 因此, ASCII 字节 (0x00-0x7F) 不可能作为任何其他字符的一部分.

* 表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个字符包含多少个字节. 多字节串的其余字节都在 0x80 到 0xBF 范围里. 这使得重新同步非常容易, 并使编码无国界, 且很少受丢失字节的影响.

* 可以编入所有可能的 231个 UCS 代码

* UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节长.

* Bigendian UCS-4 字节串的排列顺序是预定的.

* 字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到.

强烈建议配合这些特性看这两个函数(UTF8_getc、UTF8_putc),会很有收获的,能充分理解UTF-8。

可以肯定是,openssl中已完全实现了UTF-8的功能,可以制作中文证书。

经过各种试验终于可以在证书中使用UTF-8正确显示中文了,方法如下:

一、假设配置文件为openssl.cnf(在openssl-0.9.8.d/apps/目录下),编辑修改如下内容:

string_mask = utf8only

countryName_default = CN

stateOrProvinceName_default = 中文的省份名称

localityName_default = 中文的城市名称

0.organizationName_default = 组织、公司

organizationalUnitName_default = 组织机构

commonName_default = 刘凯的中文证书

二、用如下命令转换文件格式为UTF-8

iconv -f gbk -t utf-8 openssl.cnf > openssl_utf8.cnf

三、用openssl生成证书签名请求时,加上-utf8和将配置文件指定为openssl_utf8.cnf

openssl req -utf8 -config openssl_utf8.cnf -new -out server.req

除了输入密码,其他的一律enter,就OK了

然后将证书签名请求签名一下就生成有中文的证书了。

openssl x509 -in server.req -out server.crt -signkey privkey.pem -days 365

好了,安装一下server.crt,可以看看其中的中文信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: