转自:http://blog.chinaunix.net/uid-311680-id-2973653.html
1.1 使用openssl命令签发二级、三级数字证书
下面以linux系统为例
1.1.1 linux下OpenSSL下的CA机制的配置
OpenSSL下的CA机制配置主要依靠根目录下的openssl.cnf文件。他规定了CA生成,签发和吊销证书的主要规则。并且openssl的ca指令必须搭配正确的openssl.cnf文件配置才能够正确运行(ca命令并不一定需要完全依赖于openssl.cnf文件中的配置才能正常运行,其实在ca命令中,存在另外一种机制,可以在命令行中指定相应的配置信息,但是这种方法使用起来太过繁琐,不推荐使用)。所以,我们首先必须给OPENSSL CA指定一个正确的配置文件。以下列出文件中几处比较重要的字段信息加以说明。
[ ca ]
default_ca = CA_default
这一部分十分简单,只包含了一个键值default_ca,他的值是一个保存了CA默认配置的段的名字,这里是CA_default。这意味着OpenSSL在生成证书时将要到CA_default字段来寻找相应的配置信息。
openssl命令允许在一个配置文件里面,存在有多个CA的配置。
[ CA_default ]
这个段里包含了CA的配置信息,其中主要包括了指定CA的根目录结构,并且告诉openssl去那里去能够找到他签发证书时需要的文件,和将要生成的文件的存放位置。
[ CA_default ]
dir = /etc/ssl/demoCA # 指定了CA的根目录
certs = $dir/certs # 已经签发的证书的存储目录
crl_dir = $dir/crl # 存储证书吊销列表的目录
database = $dir/index.txt # 数据库的索引文件,用来存放签发证书的信息。
#unique_subject = no #设置为’no’表示允许同时创建多个相同主题的证书。
new_certs_dir = $dir/newcerts # 设置存放新签发的证书的默认位置
Certificate = $dir/cacert.pem # 指定CA证书
serial = $dir/serial # 指定存放当前序列号的文件
crl = $dir/crl.pem # 当前的CRL
private_key = $dir/private/cakey.pem # CA的私钥
RANDFILE = $dir/private/.rand #指明一个用来读写时候产生random key的seed文件。
当我们需要在命令行中使用req命令生成证书请求文件,我们必须为req命令提供必要的信息,在命令行中,提供了与其命名相同的段,来配置其必要的信息。
[ req_distinguished_name ]
req_distinguished_name这个扩展区域的键值是在我们使用req命令生成证书请求文件时希望被填入的信息。
1.1.2 生成CA证书和用户证书。 1.1.2.1 二级数字证书的签发
(1)$sudo openssl req -x509 -newkey rsa:1024 -out cacert.pem -outform PEM
这一步用来产生一个1024位的RSA私钥“privkey.pem”,并用他自签发出来一个证书“cacert.pem”,这个证书将来用来当作CA根证书(这里会要求用户填入相应的信息,首先是privkey.pem的加密口令,下来是CA根证书的相应信息)。
(2)$sudo cp privkey.pem /etc/pki/demoCA/private/cakey.pem
将ca的私钥privkey.pem拷贝到/etc/pki/demoCA/private下,并改名为cakey.pem。CA中心在签发证书的时候会来这个目录下找cakey.pem文件。
(3)$sudo cp cacert.pem /etc/pki/demoCA
将cacert.pem拷贝到/etc/pki/demoCA文件夹下。CA中心在签发证书的时候会来这个目录下找cacert.pem文件。
(4)$sudo openssl req -newkey rsa:1024 -keyout testkey.pem -keyform PEM -out testreq.pem -outform PEM
生成一个用户密钥,并为这个用户密钥生成一个证书申请(这里会要求用户输入个人信息,首先是私钥文件testkey.pem的加密口令,下来是证书申请文件testreq.pem的相应用户信息)。这个证书申请在CA中心申请签发证书的时候,将会被用作信息校验。
(5)$sudo openssl ca -in testreq.pem -out testres.pem -config openssl.cnf
ca指令是一个模拟的CA服务器程序,他实现了CA服务器的基本功能。这里将会校验证书申请中的信息,如果正确,将提示用户是否签发证书。如果用户选择yes,CA将为这个证书申请颁发证书testres.pem。
注:上面指令可能会出现错误:variable lookup failed for CA_default::certificate
7436:error:0E06D06C:configuration file routines:
NCONF_get_string:no value:conf_lib.c:329:group=CA_default name=certificate
解决方法:openssl.cnf中,应该是name=certificate,但写成了Certificate,区分大小写
上面的命令也可以写为:
openssl ca -in testreq.pem -out testres.pem -cert cacert.pem -keyfile privkey.pem -config openssl.cnf
这两个命令的区别是,第一个使用文件夹下默认的根证书、私钥;第二个命令使用参数-cert –keyfile指定根证书、私钥。
1.1.2.2 三级数字证书的签发
(1)私钥和根证书的生成跟上面二级数字证书中式一样的,参考上面。
(2)中级证书的颁发:
openssl ca -extensions v3_ca -out ca2008.crt -in testreq.pem -config openssl.cnf
注:中级证书的签发要加参数-extensions v3_ca,而用户证书不用此参数。
(3)三级证书的颁发:
openssl ca -in 3testreq.pem -out 3testres_3.pem -cert ca2008.crt -keyfile testkey.pem -config openssl.cnf