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

来源:互联网 发布:炉石传说淘宝充值 编辑:程序博客网 时间:2024/05/18 02:51

最近要用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
部分的代码。

感觉他改的不对,就没有用他的办法改这部分代码,我就看了caseMBSTRING_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,可以看看其中的中文信息。

原创粉丝点击