1 概念
数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。数字证书还有一个重要的特征就是只在特定的时间段内有效。数字证书是一种权威性的电子文档,可以由权威公正的第三方机构,即CA(例如中国各地方的CA公司)中心签发的证书,也可以由企业级CA系统进行签发。
一般证书分有三类,根证书、服务器证书和客户端证书。根证书,是生成服务器证书和客户端证书的基础,是信任的源头,也可以叫自签发证书,即CA证书。服务器证书,由根证书签发,配置在服务器上的证书。客户端证书,由根证书签发,配置在服务器上,并发送给客户,让客户安装在浏览器里的证书。
接下来,认识了证书的基本概念之后,我们来认识下这几个概念,公钥/私钥/签名/验证签名/加密/解密/对称加密/非对称加密。
我们一般的加密是用一个密码加密文件,然后解密也用同样的密码。这很好理解,这个是对称加密。而有些加密时,加密用的一个密码,而解密用另外一组密码,这个叫非对称加密,意思就是加密解密的密码不一样。其实这是数学上的一个素数积求因子的原理应用,其结果就是用这一组密钥中的一个来加密数据,用另一个来解密,或许有人已经想到了,没错这就是所谓的公钥和私钥。公钥和私钥都可以用来加密数据,而他们的区别是,公钥是密钥对中公开的部分,私钥则是非公开的部分。公钥加密数据,然后私钥解密的情况被称为加密和解密;私钥加密数据,公钥解密一般被称为签名和验证签名。其中签名和验证签名就是我们本文需要说明和用到的,因为证书的生成过程中就需要签名,而证书的使用则需要验证签名。
2 环境
一般linux系统是安装了openssl的,本文的linux系统是centos 7,openssl版本是OpenSSL 1.0.2k。可以通过以下命令来验证是否安装了openssl,或者查看当前openssl的版本。
openssl version -a
3 创建根证书CA
(1)查看openssl的配置文件openssl.cnf的存放位置(即openssl的安装位置)
openssl version -a
(2)查看openssl的配置文件openssl.cnf,因为配置文件中对证书的名称和存放位置等相关信息都做了定义。
vim /etc/pki/tls/openssl.cnf
3)创建为根证书CA所需的目录及文件
#根据配置文件信息,到CA根目录,若没有则自己创建
cd /etc/pki/CA
#创建配置文件信息中所需的目录及文件
mkdir -pv {certs,crl,newcerts,private}
touch {serial,index.txt}
(4)指明证书的开始编号
echo 01 >> serial
(5)生成根证书的私钥(注意:私钥的文件名与存放位置要与配置文件中的设置相匹配)。
(umask 077; openssl genrsa -out private/cakey.pem 2048)
参数说明:
genrsa --产生rsa密钥命令
-aes256--使用AES算法(256位密钥)对产生的私钥加密,这里没有此参数,则只是用了rsa算法加密。
-out ---输出路径,这里指private/ca.key.pem
这里的参数2048,指的是密钥的长度位数,默认长度为512位
(6)生成自签证书,即根证书CA,自签证书的存放位置也要与配置文件中的设置相匹配,生成证书时需要填写相应的信息。
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out cacert.pem -days 365
参数说明:
-new:表示生成一个新证书签署请求
-x509:专用于CA生成自签证书,如果不是自签证书则不需要此项
-key:用到的私钥文件
-out:证书的保存路径
-days:证书的有效期限,单位是day(天),默认是openssl.cnf的default_days
这样 cacert.pem 文件已生成
4 颁发证书
在需要证书的服务器上生成私钥,然后通过此私钥生成证书签署请求,最后将请求通过可靠的方式发送给根证书CA的主机。根证书CA服务器在拿到证书签署请求后,即可颁发那一服务器的证书。
4.1 在需要证书的服务器上,生成证书签署请求
(1)生成私钥,该私钥的位置可随意定
(umask 077; openssl genrsa -out test.key 2048)
(2)生成证书签署请求
openssl req -new -key test.key -out test.csr -days 365
4.2 在根证书服务器上,颁发证书
(1)颁发证书,即签名证书,生成crt文件
#颁发证书
openssl ca -in /etc/pki/CA/test.csr -out /etc/pki/CA/test.crt -days 365
#查看证书信息
openssl x509 -in /etc/pki/CA/test.crt -noout -serial -subject
(2)格式转换为pfx格式的私钥
openssl pkcs12 -export -out test.pfx -inkey /etc/pki/CA/test.key -in test.crt
注意,-inkey的值test.key是需要证书服务器上生成的私钥key文件。
(3)格式转换为cer格式的公钥
openssl x509 -inform pem -in test.crt -outform der -out test.cer
#查看cer证书信息
openssl x509 -in test.cer -text -noout
#若报错unable to load certificate,则说明你打开的证书编码是der格式,需要用以下命令
openssl x509 -in test.cer -inform der -text -noout
参数含义:
-inform pem,由于输入的test.crt文件是以pem编码的,故需要指定以pem编码来读取。
-outform der,输出的test.cer文件需要以der编码。
至此,服务器的证书颁发就完成了。