为域名或IP生成自签名TLS证书
我们这里用OpenSSL为域名或IP生成自签名TLS证书,linux上一般都预装了OpenSSL
一、生成公私钥对
1 | |
genkeyopenssl的子命令,用于生成公私密钥对
-algorithm RSA指定公钥算法为RSA
-out private.key指定输出文件名称,这里生成的private.key里面包含公钥和私
-pkeyopt rsa_keygen_bits:2048指定RSA的模数n为2048bit,此数越大越安全
生成的private.key是PEM格式的

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

二、生成证书签名请求文件
先创建一个SAN.cnf配置文件
1 | |
输入以下命令生成证书签名请求文件
1 | |
reqopenssl的子命令,用于生成证书签名请求文件,即Certificate Signing Request
-new声明要创建新的证书签名请求
-key private.key提供包含在证书签名请求文件中的公钥
-out server.csr指定输出文件名称
-config SAN.cnf指定此命令的配置文件
生成的server.csr也是PEM格式,想要以人类可读的方式显示它,输入以下命令
1 | |

三、生成自签名证书
X.509证书的结构如下

输入以下命令生成自签名证书
1 | |
x509声明要生成x509证书
-req指定输入为证书签名请求文件
-in server.csr指定输入文件
-signkey private.key指定用于签名的私钥,因为是自签名,这里的私钥就是第一步生成的私钥
-out server.crt指定输出文件名称
-days 365指定证书365天后过期
-extfile SAN.cnf -extensions req_ext指定配置文件
最终生成的证书文件也是PEM格式的
我们输入以下命令,以人类可读的方式显示它
1 | |

我们可以看到,因为是自签名证书,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消失了