其他分类 · 30 5 月, 2025 0

HTTPS使用自签名证书+浏览器“不安全”标识应对方法

背景

之前介绍过如何用OpenSSL创建自签名证书。但在给HTTP服务器(这里使用的是Nginx)配置证书时还是遇到了些问题,因此在这里总结一下配置过程以及问题的解决方法。

1. 生成网站使用的自签名证书

首先确保你的OpenSSL版本在1.1.1以上(用openssl version命令查看)。Nginx配置TLS时同时需要私钥证书。这里以henchat.net的自签名证书为例,介绍所需文件的制作过程:

1)生成私钥文件

openssl genrsa -out _.henchat.net.key 2048

2)用私钥文件生成证书文件

openssl req -new -x509 -days 3650 -key _.henchat.net.key -out _.henchat.net.crt \
> -subj "/C=国家/ST=城市/O=公司名/OU=部门/CN=*.henchat.net" \
> -addext "subjectAltName=DNS:*.henchat.net,DNS:henchat.net"
# 说明:这里生成的是通配符证书,即证书可以用于henchat.net和它的二级域名,如api.henchat.net。
# subjectAltName中必须同时包含主域名和通配符域名。

🤔可以使用OpenSSL 1.0.x吗?

似乎也不是不行,但1.0.x无法用上述方法设置subjectAltName属性,而缺乏了该属性的证书即使添加到系统信任证书列表中,浏览器仍会将网站标记为“不安全”。(当然你不在乎的话这属性有没有自然是无所谓了。毕竟又不是不能用hh)

至于如何用OpenSSL 1.0.x生成带有subjectAltName属性的的证书,实在懒得找了自己去查吧。。(摆烂)

🤔如何升级OpenSSL?

至于如何升级OpenSSL,此事在介绍CentOS 7编译安装Python3.10的文章中亦有记载。升级后需要把上述命令中的openssl替换为openssl11

2. NGINX配置

在Nginx的设置文件中为网站henchat.net创建一个新的server:

server {
  server_name  henchat.net;
  listen 443 ssl;
  ssl_certificate /存储位置/_.henchat.net.crt;
  ssl_certificate_key /存储位置/_.henchat.net.key;
  # 其它设置项
}

nginx -t检查设置无误后,nginx -s reload重载服务器设置。

3. 本地计算机配置(Windows)

现在,用https://henchat.net应该就能访问到你的页面了。但是有一个问题:每次访问浏览器都会弹出安全警告,左上角的“不安全”图标也格外刺眼。如果你介意这个,那么请通过以下步骤将证书导入到系统的信任证书列表。

  • 将.crt证书文件传输到本地。
  • 双击.crt文件,选择“安装证书”。
  • 选择“本地计算机” → “将所有证书放入以下存储” → “受信任的根证书颁发机构”。

之后再用浏览器访问网站就不会显示“不安全”了。当然这只对导入了证书的设备生效,其他用户还是会被安全警告页面硬控几秒钟(然后默默点×)。