希望在生成 SSL/TLS 证书之前,您已经安装有 openssl 以及对 SSL/TLS 有了初步的了解。
概述
本文主要讲述CA的私钥和x509自签名证书的生成,服务器/客户端的私钥和CSR的生成,以及CA对服务器/客户端的CSR签名操作。初始文件包括server-ext.cnf、client-ext.cnf以及gen.sh,相关内容如下:
server-ext.cnf
subjectAltName=DNS:*.study.com,DNS:*.study.org,IP:0.0.0.0
client-ext.cnf
subjectAltName=DNS:*.client.com,DNS:*.client.org,IP:0.0.0.0
gen.sh
rm *.pem
# 1.生成CA的私钥和自签名证书
openssl req -x509 -newkey rsa:4096 -days 365 -nodes -keyout ca-key.pem -out ca-cert.pem -subj "/C=CH/ST=SiChuan/L=ChengDu/O=Study/OU=Go/CN=Tony/emailAddress=Tony@email.com"
echo "CA's self-signed certificate"
openssl x509 -in ca-cert.pem -noout -text
# 2.生成服务器的私钥和证书签名请求(CSR)
openssl req -newkey rsa:4096 -nodes -keyout server-key.pem -out server-req.pem -subj "/C=CH/ST=GuangDong/L=GuangZhou/O=Computer/OU=Go/CN=Harry/emailAddress=Harry@email.com"
# 3.使用CA的私钥签署服务器的CSR并生成签名证书
openssl x509 -req -in server-req.pem -days 60 -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile server-ext.cnf
echo "Server's certificate signed by CA"
openssl x509 -in server-cert.pem -noout -text
echo "Verify ca-cert.pem server-cert.pem"
openssl verify -CAfile ca-cert.pem server-cert.pem
# 4.生成客户端的私钥和证书签名请求(CSR)
openssl req -newkey rsa:4096 -nodes -keyout client-key.pem -out client-req.pem -subj "/C=CH/ST=FuJian/L=XiaMen/O=Client/OU=Gopher/CN=Alice/emailAddress=Alice@email.com"
# 5.用CA的私钥签署客户端的CSR并生成签名证书
openssl x509 -req -in client-req.pem -days 60 -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -extfile client-ext.cnf
echo "client's certificate signed by CA"
openssl x509 -in client-cert.pem -noout -text
echo "Verify ca-cert.pem client-cert.pem"
openssl verify -CAfile ca-cert.pem client-cert.pem
运行结果
- ca-key.pem:CA的私钥
- ca-cert.pem:CA的证书文件。
- ca-cert.srl:保存证书的唯一序列号。
- client-ext.cnf:客户端证书扩展信息。
- client-req.pem:客户端的证书签名请求(CSR)文件。
- client-key.pem:客户端的私钥。
- client-cert.pem:客户端的证书。
- server-ext.cnf:服务器证书扩展信息。
- server-req.pem:服务器的证书签名请求(CSR)文件。
- server-key.pem:服务器的私钥。
- server-cert.pem:服务器的证书。
后面将逐个讲解gen.sh中的相关命令。
一. 生成CA的私钥和自签名证书
openssl req -x509 -newkey rsa:4096 -days 365 -nodes -keyout ca-key.pem -out ca-cert.pem -subj "/C=CH/ST=SiChuan/L=ChengDu/O=Study/OU=Go/CN=Tony/emailAddress=Tony@email.com"
- req -x509:输出X509格式的自签名证书。
- -newkey rsa:4096:输出4096位的RSA格式的私钥。
- -days 365:证书有效期为365天。
- -nodes:不进行对私钥的加密。
- -keyout ca-key.pem:将私钥写入ca-key.pem文件中。
- -out ca-cert.pem:将签名证书写入ca-cert.pem文件中。
- -subj:身份信息。
-nodes 与 -subj
为了便于理解,这里将 -nodes、-subj 选项去除后得到命令:
openssl req -x509 -newkey rsa:4096 -days 365 -keyout ca-key.pem -out ca-cert.pem
运行结果:
(如上图所示)在我们运行命令之后,因为没有 -nodes 选项,所以我们需要在A处填写私钥的密码,防止黑客盗取私钥后,若无密码则无法直接使用私钥,而需再次对私钥解密;因为没有 -subj 选项,所以我们需要在B处填写相关的身份信息,包括国家、公司等信息。
使用命令 openssl x509 -in ca-cert.pem -noout -text
查看证书信息:
因为这是自签名证书,所以 Issuer 和 Subject 的信息是相同的,Issuer为证书颁发者信息,Subject为证书拥有者信息。在后面 server 的证书中我们将会看到,这两个信息不是相同的。
若在测试环境下不想对私钥进行加密,则加上 -nodes 选项。
若不想每次都输入身份信息,则可以在首次生成证书后,将 Subject 后的信息copy下来,然后使用 -subj 选项直接带上身份信息,这里需要注意:每条信息之间需要用 “/” 间隔,以及删除 “=” 前后的空格。
在添加上 -nodes 与 -subj 选项后就得到了示例中完整的命令。
二. 生成服务器的私钥和CSR
openssl req -newkey rsa:4096 -nodes -keyout server-key.pem -out server-req.pem -subj "/C=CH/ST=GuangDong/L=GuangZhou/O=Computer/OU=Go/CN=Harry/emailAddress=Harry@email.com"
因为这里服务器只生成CSR,所以去除 -x509 与 -days 选项,最后还需要更改下相关身份信息,运行如下:
server-key.pem:服务器的私钥。
server-req.pem:服务器证书签名请求(CSR)。
三. 使用CA 的私钥签署服务器的CSR
openssl x509 -req -in server-req.pem -days 60 -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile server-ext.cnf
- x509:x509格式的签名。
- -req -in server-req.pem:传入CSR文件server-req.pem。
- -CA ca-cert.pem:传入CA的证书文件ca-cert.pem。
- -CAkey ca-key.pem:传入CA的私钥文件ca-key.pem。
- -CAcreateserial:确保CA签署的每个证书都带有唯一的序列号,换句话说,只要是该CA签署的证书都具有唯一序号,该序号保存在 srl 文件中,若 srl 文件不存在,首次将自动生成。
- -out server-cert.pem:将CA签名后的证书内容写入server-cert.pem文件中。
- -extfile server-ext.cnf:服务器的扩展文件,其中包括DNS、IP以及Email的信息。若是需要在本地测试,则需要在 server-ext.cnf 中添加 IP:0.0.0.0,同时在客户端扩展文件(例如:client-ext.cnf)中也需要添加 IP:0.0.0.0。
运行结果:
运行后将会生成ca-cert.srl和server-cert.pem,ca-cert.crl 中保存的是该CA的唯一序列号,凡是CA所签署的证书,其 Serial Number 值将等同于 ca-cert.crl 中保留的值,如A和B的值。C 处是CA的身份信息,D 处为服务器的身份信息,E 处为证书有效期。
注意:如果我们使用的是CA加密后的私钥,则在执行上述命令时,需要输入CA私钥的密码才能对CSR进行签名。
我们可以使用 -extfile 选项,添加拓展信息,我们可以从证书文件中看到相关的拓展信息,如下:
注意:为了本地开发方便,需要在服务器的扩展文件 server-ext.cnf 中添加 IP:0.0.0.0 ,并且需要在客户端的扩展文件(例如:client-ext.cnf)中添加IP:0.0.0.0。
四. 生成客户端的私钥和CSR
openssl req -newkey rsa:4096 -nodes -keyout client-key.pem -out client-req.pem -subj "/C=CH/ST=FuJian/L=XiaMen/O=Client/OU=Gopher/CN=Alice/emailAddress=Alice@email.com"
同二。
五. 使用CA 的私钥签署客户端的CSR
openssl x509 -req -in client-req.pem -days 60 -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -extfile client-ext.cnf
同三。