利用openssl管理证书及SSL编程第1部分: openssl证书管理

时间:2021-06-29 07:18:47

利用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