使用OpenSSL创建SSL证书链

之前在单位从事一些HTTPS服务器配置的工作,在网上也查过很多资料,现在将这些资料加上自己的见解正确的写出来,有谬误之处,还请指出来,大家共勉。

创建根证书

简介
根证书是干嘛的?
根证书就是CA证书,那么CA又是干嘛的,CA就是Certificate Authority,证书颁发机构。是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
那为什么要有这么一个机构?
举个通俗易解的例子,假如有一个客户想要买东西,恰好这边有个商人在卖这种东西,但是呢,客户担心这个商人是骗子,所以找了个担保人,这个担保人呢,很受商人和这个客户的信任,在这个担保人的见证下,他们签各种合同,写条款等等,那么这个客户就会很放心的和商人进行交易了。
客户就是客户端,商人就是服务器,担保人就是CA,合同就是一系列的证书。
所以,CA根证书就是就是第三方的信任凭证。

创建步骤
为了方便管理,我们按服务器划分,给不同的服务器创建不同的目录,然后把这个服务器的证书链放到这个目录下。

mkdir my_service  # 目录名称
# 进入该目录下
mkdir certs  crl  demoCA  # 创建子目录,存放公钥,私钥,日志记录等
# 进入demoCA目录下
mkdir newcerts private  # 创建CA的公钥、私钥的子目录
touch index.txt serial  # 创建CA证书的日志记录和编号记录
echo 01 >> serial  # 首个证书,给编号文件里写入记录
openssl genrsa -des3 -out demoCA/private/ca.key 2048  # 生成CA私钥,输入最少6位密码
openssl req -new -x509 -days 365 -key demoCA/private/ca.key -out demoCA/newcerts/ca.pem  # 生成CA公钥

CA公钥生成步骤注意:
Country Name: 国家英文简写
State or Province Name: 州或者省份
Locality Name: 地级市或者省会
Organization Name: 签证的第三方机构
Organizational NameUnit Name: 部门名称(可以不填)
Common Name: 操作者名字或者机构主页(这个必要重要,在下面的做服务器和客户端证书的时候要用到)
Email Address: 申请者Email地址(可以不填)
至此,CA根证书已经全部创建完成。

创建服务器证书

简介
服务器证书,就是通过某CA机构签发认证的凭证,签发之后就可以被同样信任该CA机构的客户端所信任,也是配置HTTPS服务的必需文件之一!

创建步骤

# 进入刚刚的 my_service目录下
openssl genrsa -out service.key 2048  # 生成服务器私钥,输入最少6位密码
openssl req -new -key service.key -out service.csr  # 生成向CA申请签发认证的文件
# 将CA的公钥签发服务器的申请认证文件,生成认证后服务器的crt证书文
openssl ca -in service.csr -cert demoCA/newcerts/ca.pem -keyfile demoCA/private/ca.key -out service.crt -days 365

服务器csr文件生成步骤注意:
前四项参数信息必须与CA公钥证书信息一致,Common Name必须是服务器的域名,或者是服务器的IP。
至此,服务器的证书制作完成。

创建客户端证书

简介
客户端证书,就是通过某CA机构签发认证的凭证,签发之后就可以被同样信任该CA机构的服务器所信任,信任之后,方能访问该服务器,否则会被拒绝。

创建步骤

# 进入刚刚的 my_service目录下
openssl genrsa -out client.key 2048  # 生成客户端私钥,输入最少6位密码
openssl req -new -key client.key -out client.csr  # 生成向CA申请签发认证的文件
# 将CA的公钥签发服务器的申请认证文件,生成认证后客户端的crt证书文
openssl ca -in client.csr -cert demoCA/newcerts/ca.pem -keyfile demoCA/private/ca.key -out client.crt -days 365

服务器csr文件生成步骤注意:
前四项参数信息必须与CA公钥证书信息一致,Common Name随便填,其他照常填写。
至此,客户端的证书制作完成。

补充

如果要配置HTTPS单向服务器,则不需要生成客户端证书,(公网里,99%的HTTPS服务器都不是双向),当要配置双向服务器时,才需要生成客户端证书。
至于什么是单向和双向请参考我的另一篇科普文章。

HTTPS通信原理与实例分析