(1) 環境準備
首先,需要準備一個目錄放置CA文件,包括頒發的證書和CRL(Certificate Revoke List)。
這里我們選擇目錄
/opt/ca。
然后我們在/opt/ca下建立兩個目錄,certs用來保存我們的CA頒發的所有的證書的副本;private用來保存CA證書的私鑰匙。
CA的私鑰匙很重要,至少需要2048位長度。建議保存在硬件里,或者至少不要放在網絡中。
除了生成鑰匙,在我們的CA體系中還需要創建三
個文件。第一個文件用來跟蹤最后一次頒發的證書的序列號,我們把它命名為serial,初始化為01。第二個文件是一個排序數據庫,用來跟蹤已經頒發的證
書。我們把它命名為index.txt,文件內容為空。
$ mkdir /opt/myca
$ cd /opt/myca
$ mkdir certs private
$
chmod g-rwx,o-rwx private
$ echo "01" > serial
$ touch
index.txt
第三個文件是OpenSSL的配置文件,創建起來要棘手點。示例如下:
[ ca ]
default_ca = myca
[ myca ]
dir = /opt/myca
certificate = $dir/cacert.pem
database
= $dir/index.txt
new_certs_dir = $dir/certs
private_key =
$dir/private/cakey.pem
serial = $dir/serial
default_crl_days= 7
default_days = 365
default_md = md5
policy = myca_policy
x509_extensions = certificate_extensions
[ myca_policy ]
commonName = supplied
stateOrProvinceName =
supplied
countryName = supplied
emailAddress = supplied
organizationName=
supplied
organizationalUnitName = optional
[ certificate_extensions ]
basicConstraints= CA:false
我們需要告訴OpenSSL配置文件的路徑,有兩種方法可以達成目的:通過config命令選項;通過環境變量OPENSSL_CONF。這里我們
選擇環境變量的方式。
$ OPENSSL_CONF="/opt/myca/openssl.cnf"
$ export OPENSSL_CONF
(2) 生成根證書(Root Certificate)
我們需要一個證書來為自己頒發的證書簽名,這個證書可從其他CA獲取,或者是自簽名的根證書。這里我們生成一個自簽名的根證書。
首先我們需要往配置文件里面添加一些信息,如下所示,節名和命令行工具的命令req一樣。我們把所有必要的信息都寫進配置,而不是在命令行輸入,這
是唯一指定X.509v3擴展的方式,也能讓我們對如何創建根證書有個清晰的把握。
[ req ]
default_bits = 2048
default_keyfile =
/opt/myca/private/cakey.pem
default_md = md5
prompt = no
distinguished_name
= root_ca_distinguished_name
x509_extensions = root_ca_extensions
[
root_ca_distinguished_name ]
commonName = My Test CA
stateOrProvinceName
= Beijing
countryName = CN
emailAddress =
yingyuan@staff.sina.com.cn
organizationName = Root Certification
Authority
[ root_ca_extensions ]
basicConstraints = CA:true
萬事俱備,我們可以生成根證書了。注意設置好環境變量OPENSSL_CONF。
$ openssl req -x509 -newkey rsa -out cacert.pem -outform PEM
驗證一下我們生成的文件。
$ openssl x509 -in cacert.pem -text -noout
(3) 給客戶頒發證書
在給客戶頒發證書之前,需要客戶提供證書的基本信息。我們另外開啟一個終端窗口,使用默認的OpenSSL配置文件(不要讓之前的
OPENSSL_CONF干擾我們,那個配置是專門用來生成根證書的)。
命令和我們生成根證書的類似,都是req,不過需要提供一些額外的信息。如下:
$ openssl req -newkey rsa:1024 -keyout testkey.pem -keyform PEM -out
testreq.pem -outform PEM
有兩次提示要口令,第一次的口令用來加密私鑰匙testkey.pem,第二次口令一般被OpenSSL忽略。
結果生成兩個文
件:testkey.pem,私鑰匙;testreq.pem,請求信息,其中包括公鑰匙。
我們來看看testreq.pem都有哪些信息?
$ openssl req -in testreq.pem -text -noout
現在,我們可以把testreq.pem提交給我們的CA生成證書了。
為了方便起見,我們假定testreq.pem在/opt/myca
/private/中。
$ openssl ca -in testreq.pem
有三次提示,一次是問你CA的私鑰匙密碼,兩次是確認,輸出的結果就是為客戶頒發的證書。
可以通過batch選項取消命令提示,可通過
notext選項取消證書的輸出顯示。
此外,還可以一次給多個客戶頒發證書,方法是用
infiles選項替換in選項,不過這個選項必須放在最后,因為此后的任何字符均被處理為文件名稱列表。
生成的證書放在certs目錄,同時index.txt和serial的內容都發生了改變。
(4) 吊銷證書
吊銷證書的操作很簡單,我們將待吊銷的證書從證書的保存位置拷貝到另外一個目錄,然后運行ca命令就可以。
主要設置好
OPENSSL_CONF環境變量。
$ cp certs/01.pem testcert.pem
$ openssl ca -revoke testcert.pem
輸入CA私鑰匙的密碼就可以。
為了使你的吊銷操作讓別人知道,你可以生成CRL(Certificate Revoke List),然后公布到網上去。
由于每個頒發的
證書都有一個過期時間,一旦證書過期了,就可以把該證書從CRL中刪除。因為這時候在不在CRL中已經無所謂了。
# 生成CRL列表
$ openssl ca -gencrl -out exampleca.crl
# 查看CRL列表信息
$ openssl crl -in exampleca.crl -text -noout
# 驗證CRL列表簽名信息
$ openssl crl -in exampleca.crl -noout -CAfile
cacert.pem
可以看到CRL的版本號為1,這是OpenSSL默認的,除非crl_extensions被指定在配置文件ca一節中。
?
文章一:http://blog.chinaunix.net/u/11234/showart_290705.html
文章二:http://blog.chinaunix.net/u/11234/showart_291316.html