http系列---OpenSSL生成根证书CA及签发子证书

1. 前言

系统:CentOS7 32位

目标:使用OpenSSL生成一个CA根证书,并用这个根证书颁发两个子证书server和client。

先确保系统中安装了OpenSSL,若没安装,可以通过以下命令安装:

sudo yum install openssl

2. 修改OpenSSL的配置

安装好之后,定位一下OpenSSL的配置文件openssl.cnf:

locate openssl.cnf

在这里插入图片描述
如图,我这里的目录是/etc/pki/tls/openssl.cnf。

修改配置文件,修改其中的dir变量,重新设置SSL的工作目录:
在这里插入图片描述

由于配置文件中,dir变量下还有几个子文件夹需要用到,因此在自定义的文件夹下面也创建这几个文件夹或文件,它们是:

在这里插入图片描述

certs——存放已颁发的证书

newcerts——存放CA指令生成的新证书

private——存放私钥

crl——存放已吊销的证书

index.txt——OpenSSL定义的已签发证书的文本数据库文件,这个文件通常在初始化的时候是空的

serial——证书签发时使用的序列号参考文件,该文件的序列号是以16进制格式进行存放的,该文件必须提供并且包含一个有效的序列号

生成证书之前,需要先生成一个随机数:

openssl rand -out private/.rand 1000

该命令含义如下:

rand——生成随机数

-out——指定输出文件

1000——指定随机数长度

3. 生成根证书

a).生成根证书私钥(pem文件)

OpenSSL通常使用PEM(Privacy Enbanced Mail)格式来保存私钥,构建私钥的命令如下:

openssl genrsa -aes256 -out private/cakey.pem 1024

在这里插入图片描述

该命含义如下:

genrsa——使用RSA算法产生私钥

-aes256——使用256位密钥的AES算法对私钥进行加密

-out——输出文件的路径

1024——指定私钥长度

b).生成根证书签发申请文件(csr文件)

使用上一步生成的私钥(pem文件),生成证书请求文件(csr文件):

openssl req -new -key private/cakey.pem -out private/ca.csr -subj \
"/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myname"

在这里插入图片描述

该命令含义如下:

req——执行证书签发命令

-new——新证书签发请求

-key——指定私钥路径

-out——输出的csr文件的路径

-subj——证书相关的用户信息(subject的缩写)

c).自签发根证书(cer文件)

csr文件生成以后,可以将其发送给CA认证机构进行签发,当然,这里我们使用OpenSSL对该证书进行自签发:

openssl x509 -req -days 365 -sha1 -extensions v3_ca -signkey \
private/cakey.pem -in private/ca.csr -out certs/ca.cer

在这里插入图片描述

该命令的含义如下:

x509——生成x509格式证书

-req——输入csr文件

-days——证书的有效期(天)

-sha1——证书摘要采用sha1算法

-extensions——按照openssl.cnf文件中配置的v3_ca项添加扩展

-signkey——签发证书的私钥

-in——要输入的csr文件

-out——输出的cer证书文件

之后看一下certs文件夹里生成的ca.cer证书文件:

在这里插入图片描述

4. 用根证书签发server端证书

和生成根证书的步骤类似,这里就不再介绍相同的参数了。

a).生成服务端私钥

openssl genrsa -aes256 -out private/server-key.pem 1024

b).生成证书请求文件

openssl req -new -key private/server-key.pem -out private/server.csr -subj \
"/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myname"

c).使用根证书签发服务端证书

openssl x509 -req -days 365 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/cakey.pem \
-CAserial ca.srl -CAcreateserial -in private/server.csr -out certs/server.cer

这里有必要解释一下这几个参数:

-CA——指定CA证书的路径

-CAkey——指定CA证书的私钥路径

-CAserial——指定证书序列号文件的路径

-CAcreateserial——表示创建证书序列号文件(即上方提到的serial文件),创建的序列号文件默认名称为-CA,指定的证书名称后加上.srl后缀

注意:这里指定的-extensions的值为v3_req,在OpenSSL的配置中,v3_req配置的basicConstraints的值为CA:FALSE,如图:
在这里插入图片描述

而前面生成根证书时,使用的-extensions值为v3_ca,v3_ca中指定的basicConstraints的值为CA:TRUE,表示该证书是颁发给CA机构的证书,如图:
在这里插入图片描述

在x509指令中,有多种方式可以指定一个将要生成证书的序列号,可以使用set_serial选项来直接指定证书的序列号,也可以使用-CAserial选项来指定一个包含序列号的文件。所谓的序列号是一个包含一个十六进制正整数的文件,在默认情况下,该文件的名称为输入的证书名称加上.srl后缀,比如输入的证书文件为ca.cer,那么指令会试图从ca.srl文件中获取序列号,可以自己创建一个ca.srl文件,也可以通过-CAcreateserial选项来生成一个序列号文件。

5. 用根证书签发client端证书

和签发server端的证书的过程类似,只是稍微改下参数而已。

a).生成客户端私钥

openssl genrsa -aes256 -out private/client-key.pem 1024

b).生成证书请求文件

openssl req -new -key private/client-key.pem -out private/client.csr -subj \
"/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myname"

c).使用根证书签发客户端证书

openssl x509 -req -days 365 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/cakey.pem \
-CAserial ca.srl -in private/client.csr -out certs/client.cer

需要注意的是,上方签发服务端证书时已经使用-CAcreateserial生成过ca.srl文件,因此这里不需要带上这个参数了。

至此,我们已经使用OpenSSL自签发了一个CA证书ca.cer,并用这个CA证书签发了server.cer和client.cer两个子证书了:
在这里插入图片描述

6. 导出证书

a).导出客户端证书

openssl pkcs12 -export -clcerts -name myclient -inkey \
private/client-key.pem -in certs/client.cer -out certs/client.keystore

参数含义如下:

pkcs12——用来处理pkcs#12格式的证书

-export——执行的是导出操作

-clcerts——导出的是客户端证书,-cacerts则表示导出的是ca证书

-name——导出的证书别名

-inkey——证书的私钥路径

-in——要导出的证书的路径

-out——输出的密钥库文件的路径

b).导出服务端证书

openssl pkcs12 -export -clcerts -name myserver -inkey \
private/server-key.pem -in certs/server.cer -out certs/server.keystore

c).信任证书的导出

keytool -importcert -trustcacerts -alias www.mydomain.com \
-file certs/ca.cer -keystore certs/ca-trust.keystore

7. 附项目证书目录

在这里插入图片描述
create.ca.sh

#!/bin/sh

# 生成私钥 key 文件
openssl genrsa -out private/ca.key 2048

# 生成证书请求 csr 文件
openssl req -new -key private/ca.key -out private/ca.csr -extensions v3_req -config "./conf/openssl.conf"

# 生成凭证 crt 文件
openssl x509 -req -days 3650 -in private/ca.csr -signkey private/ca.key -out private/ca.crt

# 为我们的 key 设置起始序列号和创建 CA 键库
echo '01' > serial   # 可以是任意四个字符
touch index.txt

# 为 "用户证书" 的移除创建一个证书撤销列表
openssl ca -gencrl -out ./private/ca.crl -crldays 7 -config "./conf/openssl.conf"

craete_certificates.sh

#!/bin/sh

# 查看KEY信息
# openssl rsa -noout -text -in users/client.key
# 查看CSR信息
# openssl req -noout -text -in users/client.csr
# 查看证书信息
# openssl x509 -noout -text -in users/client.crt


########## CA证书 ##########

# 生成私钥 key 文件
openssl genrsa -out private/ca.key 2048

# 生成证书请求 csr 文件
openssl req -new -key private/ca.key -out private/ca.csr -extensions v3_req -config "./conf/openssl.conf"

# 生成凭证 crt 文件
openssl x509 -req -days 365 -extensions v3_req -in private/ca.csr -signkey private/ca.key -out private/ca.crt

# 为我们的 key 设置起始序列号和创建 CA 键库
echo FACE > serial   # 可以是任意四个字符
touch index.txt

# 为 "用户证书" 的移除创建一个证书撤销列表
openssl ca -gencrl -out ./private/ca.crl -crldays 7 -config "./conf/openssl.conf"

########## 服务器证书 ##########

# 创建一个 key
openssl genrsa -out server/server.key 2048

# 为我们的 key 创建一个证书签名请求 csr 文件
openssl req -new -key server/server.key -out server/server.csr -extensions v3_req -config "./conf/openssl.conf"

# 使用我们私有的 CA key 为刚才的 key 签名
openssl ca -extensions v3_req -in server/server.csr -cert private/ca.crt -keyfile private/ca.key -out server/server.crt -config "./conf/openssl.conf"

########## 客户端证书 ##########

# 为用户创建一个 key
openssl genrsa -des3 -out ./users/client.key 2048

# 为 key 创建一个证书签名请求 csr 文件
openssl req -new -key ./users/client.key -out ./users/client.csr -extensions v3_req -config "./conf/openssl.conf"

# 使用我们私有的 CA key 为刚才的 key 签名
openssl ca -extensions v3_req -in ./users/client.csr -cert ./private/ca.crt -keyfile ./private/ca.key -out ./users/client.crt -config "./conf/openssl.conf"

# 将证书转换为大多数浏览器都能识别的 PKCS12 文件
openssl pkcs12 -export -clcerts -in ./users/client.crt -inkey ./users/client.key -out ./users/client.p12

create_client.sh

#!/bin/sh


# 为用户创建一个 key
openssl genrsa -des3 -out ./users/client.key 2048

# 为 key 创建一个证书签名请求 csr 文件
openssl req -new -key ./users/client.key -out ./users/client.csr -extensions v3_req -config "./conf/openssl.conf"

# 使用我们私有的 CA key 为刚才的 key 签名
openssl ca -extensions v3_req -in ./users/client.csr -cert ./private/ca.crt -keyfile ./private/ca.key -out ./users/client.crt -config "./conf/openssl.conf"

# 将证书转换为大多数浏览器都能识别的 PKCS12 文件
openssl pkcs12 -export -clcerts -in ./users/client.crt -inkey ./users/client.key -out ./users/client.p12

create_server.sh

#!/bin/sh


# 创建一个 key
openssl genrsa -out server/server.key 2048

# 为我们的 key 创建一个证书签名请求 csr 文件
openssl req -new -key server/server.key -out server/server.csr -extensions v3_req -config "./conf/openssl.conf"

# 使用我们私有的 CA key 为刚才的 key 签名
openssl ca -extensions v3_req -in server/server.csr -cert private/ca.crt -keyfile private/ca.key -out server/server.crt -config "./conf/openssl.conf"

  • 11
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
在 CentOS 系统下,可以使用 OpenSSL 工具来生成 CA 证书、服务器证书和客户端证书。下面是生成证书的详细步骤: 1. 安装 OpenSSL 工具: ```bash sudo yum install openssl ``` 2. 生成证书: ```bash # 生成私钥 openssl genrsa -out ca.key 2048 # 生成证书 openssl req -new -key ca.key -out ca.csr openssl x509 -req -days 3650 -extensions v3_ca -signkey ca.key -in ca.csr -out ca.crt ``` 3. 生成服务器证书: ```bash # 生成私钥 openssl genrsa -out server.key 2048 # 生成证书签名请求 openssl req -new -key server.key -out server.csr # 生成服务器证书 openssl x509 -req -days 3650 -extensions v3_req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt ``` 4. 生成客户端证书: ```bash # 生成私钥 openssl genrsa -out client.key 2048 # 生成证书签名请求 openssl req -new -key client.key -out client.csr # 生成客户端证书 openssl x509 -req -days 3650 -extensions v3_req -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt ``` 以上步骤中,需要根据实际情况填写证书信息。在生成证书的过程中,需要注意以下几点: - 在生成证书时,使用 `-extensions v3_ca` 参数指定证书类型为根证书。 - 在生成服务器证书和客户端证书时,使用 `-extensions v3_req` 参数指定证书类型为服务器证书或客户端证书。 - 在生成服务器证书和客户端证书时,使用 `-CA` 参数指定签名证书为根证书,使用 `-CAkey` 参数指定签名证书的私钥为根证书的私钥,使用 `-CAcreateserial` 参数生成序列号。 生成证书之后,需要将根证书 `ca.crt` 分发给需要验证证书的客户端。服务器证书 `server.crt` 和私钥 `server.key` 需要配置在 Nginx 服务器中,用于 HTTPS 通信。客户端证书 `client.crt` 和私钥 `client.key` 用于客户端身份验证。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lipviolet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值