为域名或IP生成自签名TLS证书

我们这里用OpenSSL为域名或IP生成自签名TLS证书,linux上一般都预装了OpenSSL

一、生成公私钥对

1
openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048

genkeyopenssl的子命令,用于生成公私密钥对

-algorithm RSA指定公钥算法为RSA

-out private.key指定输出文件名称,这里生成的private.key里面包含公钥和私

-pkeyopt rsa_keygen_bits:2048指定RSA的模数n为2048bit,此数越大越安全

生成的private.key是PEM格式的

 

想要查看private.key中的公钥指数、私钥指数、模数等其它RSA相关参数,输入以下命令

1
openssl rsa -in private.key -text -noout

这里有一个图片

二、生成证书签名请求文件

先创建一个SAN.cnf配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[ req ]
prompt = no
default_md = sha256 # 指定生成摘要的哈希算法
req_extensions = req_ext
distinguished_name = dn

# [ dn ]部分可自由发挥
[ dn ]
C = CN # Country,国家,两个字符
ST = Shanghai # Sate or Province,省份
L = Shanghai # Locality,城市
O = Pasiphae Corporation # Organization,组织
OU = security # Organizational Unit,组织内的某个部门
CN = Pasiphae Corporation # Common Name,通用名
emailAddress = pasiphae321@gmail.com # 邮箱

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
# 如果你是为域名创建证书,则取消注释掉下面的部分
# DNS.1 = 你的域名
# DNS.2 = 你的另一个域名
IP.1 = 192.168.163.105
# IP.2 = 另一个IP输入以下命令生成证书签名请求文件

 

输入以下命令生成证书签名请求文件

1
openssl req -new -key private.key -out server.csr -config SAN.cnf

reqopenssl的子命令,用于生成证书签名请求文件,即Certificate Signing Request

-new声明要创建新的证书签名请求

-key private.key提供包含在证书签名请求文件中的公钥

-out server.csr指定输出文件名称

-config SAN.cnf指定此命令的配置文件

 

生成的server.csr也是PEM格式,想要以人类可读的方式显示它,输入以下命令

1
openssl req -in server.csr -text -noout

这里有一个图片

三、生成自签名证书

X.509证书的结构如下

这里有一个图片

 

输入以下命令生成自签名证书

1
openssl x509 -req -in server.csr -signkey private.key -out server.crt -days 365 -extfile SAN.cnf -extensions req_ext

x509声明要生成x509证书

-req指定输入为证书签名请求文件

-in server.csr指定输入文件

-signkey private.key指定用于签名的私钥,因为是自签名,这里的私钥就是第一步生成的私钥

-out server.crt指定输出文件名称

-days 365指定证书365天后过期

-extfile SAN.cnf -extensions req_ext指定配置文件

最终生成的证书文件也是PEM格式的

 

我们输入以下命令,以人类可读的方式显示它

1
openssl x509 -in server.crt -text -noout

这里有一个图片

我们可以看到,因为是自签名证书,issuer(证书颁发者)和subject(证书颁发对象)部分是完全一样的,其与前面的X.509证书结构相吻合

 

我们深入了解下生成证书这个命令实际都干了什么呢?

其会先根据server.csr中的信息生成预证书(这是我起的名字,也就是证书中除了最后的签名的部分),并对预证书进行哈希(哈希算法可指定,默认为sha256)生成摘要,并用私钥对摘要进行加密生成的密文即为数字签名,最后将其添加在预证书的末尾形成真正的证书

四、验证自签名证书

我们将证书server.crt和私钥private.key部署到192.168.163.105上的nginx,并在192.168.163.1的浏览器访问https://192.168.163.105/hello.html

因为是自签名证书,Chrome会如下发出警告

这里有一个图片

 

我们查看下证书,其与我们的证书server.crt中的信息是一致的

这里有一个图片

 

点击高级坚持访问网站,此时虽然浏览器的URL栏显示不安全https,但其实数据传输是处于TLS加密下的,只是浏览器无法信任该证书

这里有一个图片

这里有一个图片

五、让浏览器信任自签名证书

操作系统会预置很多根证书颁发机构的根证书,浏览器信任的根证书都是从操作系统读取的

我们可以直接将自签名证书导入到操作系统的根证书列表里,这样电脑上的所有浏览器都会信任你的自签名证书,Chrome的URL栏的不安全https就会消失

这里我以windows为例,将自签名证书导入操作系统根证书列表

win + r打开运行,输入certmgr.msc并回车,我们能看到所有的根证书

这里有一个图片

 

我们右击证书,左击导入,然后根据指示导入server.crt

这里有一个图片

 

导入成功后,能够在列表中找到你的自签名证书,其颁发给颁发者都是你在SAN.cnf中填入的Common Name

这里有一个图片

 

此时我们重启Chrome,再次访问https://192.168.163.105/hello.html

这里有一个图片

可以看到,URL栏的不安全https消失了


为域名或IP生成自签名TLS证书
https://www.pasiphae.top/2024/10/21/为域名或IP生成自签名TLS证书/
作者
pasiphae
发布于
2024年10月21日
许可协议