使用openssl创建并签署SSL/TLS证书

希望在生成 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

运行结果
gen.sh 运行结果

  • 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

运行结果:
生成CA的私钥和自签名证书
(如上图所示)在我们运行命令之后,因为没有 -nodes 选项,所以我们需要在A处填写私钥的密码,防止黑客盗取私钥后,若无密码则无法直接使用私钥,而需再次对私钥解密;因为没有 -subj 选项,所以我们需要在B处填写相关的身份信息,包括国家、公司等信息。

使用命令 openssl x509 -in ca-cert.pem -noout -text 查看证书信息:
ca-cert.pem
因为这是自签名证书,所以 IssuerSubject 的信息是相同的,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 选项,最后还需要更改下相关身份信息,运行如下:
生成服务器的私钥和CSR
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 的私钥对服务器的CSR签名
运行后将会生成ca-cert.srlserver-cert.pemca-cert.crl 中保存的是该CA的唯一序列号,凡是CA所签署的证书,其 Serial Number 值将等同于 ca-cert.crl 中保留的值,如AB的值。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

同三。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值