利用openssl管理证书及SSL编程第1部分
参考:
1) 利用openssl创建一个简单的CA
http://www.cppblog.com/flyonok/archive/2010/10/30/131840.html
2) Win32平台下OpenSSL编写SSL,TLS程序
http://www.cppblog.com/flyonok/archive/2011/03/24/133100.html
cheungmine
2015-12-15
1. 利用openssl管理证书
CA(Certification Authority),简称CA证书。CA 也拥有一个证书(内含公钥
和私钥)。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得
到 CA 的证书(含公钥),用以验证它所签发的证书。如果用户想得到一份属于
自己的证书,他应先向 CA 提出申请。在 CA判明申请者的身份后,便为他分配
一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便
形成证书发给申请者。
如果一个用户想鉴别另一个证书的真伪,他就用 CA 的公钥对那个证书上的签字
进行验证,一旦验证通过,该证书就被认为是有效的。证书实际是由证书签证机
关(CA)签发的对用户的公钥的认证。
证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字
和有效期等等。目前,证书的格式和验证方法普遍遵循X.509 国际标准。
CA一般指证书授权机构,比如VeriSign, Startssl。浏览器内嵌了这些公司的公钥
证书,这样用户使用由这些公司颁发出来的证书就得到了浏览器的信任,不会提示
用户安全问题。
也可以认为CA是得到了浏览器厂商认证的授权证书颁发机构,谁都可以成为CA,但
要想得到浏览器厂商认证是非常难的。如果得到了浏览器厂商认证的CA,其颁发的
证书都会被浏览器检查通过放行,否则浏览器要提示用户有证书需要安装,让用户
自己承担风险,这些提示常常被认为是不愉快的(比如12306.cn)。
如果接受了(无论提示与否),浏览器就安装了这个证书,于是访问网站就在一个
安全的隧道中进行,这个隧道称为 SSL(Secure Sockets Layer 安全套接层)及
其继任者传输层安全(Transport Layer Security,TLS)。
用商业的CA证书,都是要花钱的,而且不便宜。除非用自己的证书,就涉及到浏览
器接受的问题。免费的startssl可以解决一部分问题,烦人的是需要1年1签。
假定我们可以接受这个浏览器提示,或者我们根本就是在写一个ssl程序,那么自
己做CA完全没问题。自己做老大的感觉很爽。下面就让我们利用开源openssl软件,
在Linux(或UNIX/Cygwin)下创建一个简单的CA。我们可以利用这个CA进行PKI、
数字证书相关的测试。比如,在测试用Tomcat或Apache构建HTTPS双向认证时,我
们可以利用自己建立的测试CA来为服务器端颁发服务器数字证书,为客户端(浏
览器)生成文件形式的数字证书(可以同时利用openssl生成客户端私钥)。
1.1 创建CA
假定我的CA公司叫做pepstack,我的网站叫pepstack.com(这是我个人使用的域名),
我想建立自己的CA,并且给自己的网站颁发证书,给使用我的网站的用户颁发客户
端证书。下面开始创建我的CA。(用户可以把pepstack换成你公司的名字)
该简单的CA将建立在用户自己的目录下($HOME/pepstack),无需超级用户(root)
权限。
1) 创建CA需要用到的目录和文件:
执行命令如下:
mkdir -p $HOME/ca.pepstack.com/{newcerts,private,conf} chmod g-rwx,o-rwx $HOME/ca.pepstack.com/private echo "01" > $HOME/ca.pepstack.com/serial touch $HOME/ca.pepstack.com/index.txt
说明:
$HOME/ca.pepstack.com 为待建CA的主目录(以下简称CA_HOME)。
newcerts 目录将存放CA签署(颁发)过的数字证书(证书备份目录)。
private 目录用于存放CA的私钥(pepstackcakey.pem)。
conf 目录用于存放一些简化参数用的配置文件。
文件serial和index.txt分别用于存放下一个证书的序列号和证书信息数据库。
1.2 生成CA的私钥和自签名证书(即根证书)
1) 创建配置文件:
$HOME/ca.pepstack.com/conf/genpepstackca.conf
内容如下:
[req] default_keyfile=$ENV::HOME/ca.pepstack.com/private/pepstackcakey.pem default_md=md5 prompt=no distinguished_name=ca_distinguished_name x509_extensions=ca_extensions [ca_distinguished_name] organizationName=pepstack.com organizationalUnitName=ca.pepstack.com commonName=pepstackca emailAddress=master@pepstack.com [ca_extensions] basicConstraints=CA:true
2) 然后在CA_HOME目录下执行命令:
$ openssl req -x509 -newkey rsa:2048 -out pepstackcacert.pem -outform PEM -days 3650 \ -config $HOME/ca.pepstack.com/conf/genpepstackca.conf
执行过程中需要输入CA私钥的保护密码(万万不可泄露),假设我们输入密码:123456
可以用如下命令查看一下CA自己证书的内容
$ openssl x509 -in pepstackcacert.pem -text -noout
3) 创建一个配置文件,以便后续CA日常操作中使用
$HOME/ca.pepstack.com/conf/pepstackca.conf
内容如下:
[ca] # The default ca section default_ca=pepstackca [pepstackca] # top dir dir=$ENV::HOME/ca.pepstack.com # index file database=$dir/index.txt # new certs dir new_certs_dir=$dir/newcerts # The CA cert certificate=$dir/pepstackcacert.pem # serial no file serial=$dir/serial # CA private key private_key=$dir/private/pepstackcakey.pem # random number file RANDFILE=$dir/private/.rand # how long to certify for default_days=365 # how long before next CRL default_crl_days=30 # message digest method to use default_md=md5 # Set to 'no' to allow creation of several ctificates with same subject unique_subject=no # default policy policy=policy_any [policy_any] countryName=optional stateOrProvinceName=optional localityName=optional organizationName=optional organizationalUnitName=optional commonName=supplied emailAddress=optional
2. CA签发数字证书
现在我们已经是CA了,如果我们的根证书(公钥)能被浏览器厂商接受,嵌入到
比如火狐浏览器中,那么我们就可以给某个网站(如a.com)签发证书,当用户
用火狐访问https://a.com的时候,ssl(tls)就起作用了,a.com可以信任访问它
的用户,而用户也能信任a.com网站。往来信息被加密。
2.1 创建一个证书请求
a.com要建立https的网站,于是请求我们给他们签发一个证书,首先要创建一个证书请求:
$ mkdir $HOME/ca.pepstack.com/newcerts/a.com && cd $HOME/ca.pepstack.com/newcerts/a.com $ openssl req -newkey rsa:1024 -keyout acomkey.pem -keyform PEM -out acomreq.pem -outform PEM \ -subj "/O=a.com/OU=ou.a.com/CN=a.com"
执行过程中需要输入私钥的保护密码,假设输入密码: 888888
执行完后,acomkey.pem即为a.com的密钥,而acomreq.pem即为证书请求。
可以查看证书请求的内容:
$ openssl req -in acomreq.pem -text -noout
2.2 pepstack CA为a.com签发证书
$ openssl ca -in acomreq.pem -out acomcert.pem \ -config $HOME/ca.pepstack.com/conf/pepstackca.conf
执行过程中需要输入CA的密钥保护密码(刚才设置的123456),并且最后询问
是否要给该用户签发证书时要选y。
执行完后,acomcert.pem 即为证书,用命令查看证书内容:
$ openssl x509 -in acomcert.pem -text -noout
2.3 制作一个PKCS12格式的文档(个人数字证书)
本节“个人数字证书”意为包含私钥和证书的实体,而不是单指只保护公钥的数字证书。
我们制作的这个PKCS#12文件将包含密钥、证书和颁发该证书的CA证书。该证书文件
可以直接用于服务器数字证书或个人数字证书。把前几步生成的密钥和证书制作成
一个pkcs12文件acomcert.p12的方法执行命令:
$ openssl pkcs12 -export -in acomcert.pem -inkey acomkey.pem \ -out acom.p12 -name a.com \ -chain -CAfile $HOME/ca.pepstack.com/pepstackcacert.pem
执行过程中需要输入保护a.com密钥的密码(888888),以及新的保护pkcs12文件
的密码: 222222
执行完后,acom.p12即为pkcs12文件。你可以直接拷贝到windows下,作为个人
数字证书,双击导入IE后就可以使用了(输入密码222222)。该文件也可以直接用于
tomcat作为服务器证书使用。
若要查看acom.p12的内容可以用命令:
$ openssl pkcs12 -in acom.p12
Enter Import Password: 222222
3 CA的日常操作
3.1. 根据证书申请请求签发证书
假设收到一个证书请求文件名为req.pem,文件格式应该是PKCS#10格式
(标准证书请求格式)。
首先可以查看一下证书请求的内容,执行命令:
$ openssl req -in req.pem -text -noout
将看到证书请求的内容,包括请求者唯一的名字(DN)、公钥信息(可能还有一
组扩展的可选属性)。
执行签发命令:
$ openssl ca -in req.pem -out cert.pem -config $HOME/ca.pepstack.com/conf/pepstackca.conf
执行过程中会要求输入访问CA的私钥密码(刚才设置的123456)。
完成上一步后,签发好的证书就是cert.pem,另外$HOME/ca.pepstack.com/newcerts
里也会有一个相同的证书副本(文件名为证书序列号, 如: 01.pem)。
你可以执行以下语句来查看生成的证书的内容:
$ openssl x509 -in cert.pem -text -noout
3.2. 吊销证书(作废证书)
一般由于用户私钥泄露等情况才需要吊销一个未过期的证书。
(当然我们用本测试CA时其时很少用到该命令,除非专门用于测试吊销证书的情况)
假设需要被吊销的证书文件为cert.pem,则执行以下命令吊销证书:
$ openssl ca -revoke cert.pem -config $HOME/ca.pepstack.com/conf/pepstackca.conf
3.3. 生成证书吊销列表文件(CRL)
准备公开被吊销的证书列表时,可以生成证书吊销列表(CRL),执行命令如下:
$ openssl ca -gencrl -out pepstackca.crl -config $HOME/ca.pepstack.com/conf/pepstackca.conf
还可以添加-crldays和-crlhours参数来说明下一个吊销列表将在多少天后(或多少小时候)发布。
可以用以下命令检查pepstackca.crl的内容:
$ openssl crl -in pepstackca.crl -text -noout