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

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

                     /author    刘凯 mslk.sa@gmail.com

最近要用openssl生成证书,来配合https一起使用,可是没有根证书的签名,只能自签名一下,当用户访问https时会有一个 安全警告查看证书都是一堆字母和数字,里面如果能显示一些中文提示信息,就能让用户明白一些,这样可以少些问题。
openssl的req子命令创建的证书请求只能使用 ASCIIUTF-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_getcUTF8_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 -req -in server.req -out server.crt -signkey privkey.pem -days 365

好了,安装一下server.crt,可以看看其中的中文信息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值