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,可以看看其中的中文資訊。