告别浏览器安全警告!手把手教你用自签名证书实现HTTPS自由

2026-05-14 13:51:38 2点赞 4收藏 1评论

私人服务器总被浏览器提示“不安全”?免费SSL证书三个月就过期?这篇文章教你一招,一次配置,永久生效。

先说说痛点

有 NAS 的小伙伴应该都遇到过这个烦心事:在 NAS 上搭了好多服务,结果浏览器一打开,地址栏旁边一个大大的“不安全”红叉,看着就糟心。

内网 https 访问 Web,总是有烦人的安全提示内网 https 访问 Web,总是有烦人的安全提示

去申请免费的 SSL 证书吧,像 Let's Encrypt 这些,有效期只有3个月。三个月一到就忘了续,然后服务又变回不安全状态了。虽说有诸如 httpsok 这样的自动续期的工具,但总归多了一层维护成本。(我上一篇有写过 httpsok)

有没有一种方法,一劳永逸?

有的。自签名证书。

什么是自签名证书?

简单说就是:自己当证书颁发机构(CA),给自己签发证书

就像你自己刻一个公章,然后给你的所有文件盖章。只要别人认你这个章,知道这个章是你刻的,你盖的所有文件都有效。

这种方法有个前提:你掌控所有的服务器和客户端。其实就是局域网内网环境——家里的 NAS、NAS 上安装的 Docker 应用等,这些都在你的控制范围内。

整体思路

整个过程分三步:

  1. 随便找台电脑,生成一个“根证书”(这就是你的公章)

  2. 把根证书分发到所有客户端(让所有电脑认你这个章)

  3. 用这个根证书为所有服务器签发证书(给你所有的服务盖上章)

完事儿之后,不管是你的 NAS 后台、还是内网的 Web 服务,浏览器访问一律绿锁,干干净净。

一、生成根证书

我手里有台群晖,它自带 OpenSSL 工具,就拿它来演示。你用 Windows、Mac、Linux,甚至树莓派都可以,命令是一样的。

打开群晖的 SSH 功能,连接进去,输入下面的命令。

1. 生成私钥

openssl genrsa -out RootCA.key 2048

这条命令会生成一个叫 RootCA.key 的文件。

这个私钥就是你根证书的命根子,丢了就废了,所有用这个根签发的证书都得重新做。所以:

  • 备份:拷到安全的地方存起来,可以打个包加个密

  • 保密:绝对不要发给任何人

  • 权限:在 Linux 上可以执行 chmod 400 RootCA.key ,只让 root 能读

2. 生成根证书

openssl req -x509 -new -nodes -key RootCA.key -sha256 -days 36500 -out RootCA.crt -subj "/C=CN/ST=Shandong/L=Zaozhuang/O=MyHome/CN=RootCA"

看着长,拆开看就明白了。-days 36500 我这里是设置了100年有效期,一张证书传三代,人走它还在,一劳永逸。-subj 后面是你的身份信息,按自己情况改就行:

参数 含义 示例值:

/C= 国家 CN /ST= 省份 Shandong /L= 城市 Zaozhuang /O= 组织 MyHome /CN= 根证书名称 RootCA

执行完,当前目录下会多出一个 RootCA.crt 文件。这个文件可以随便分发,所有人都能看。

二、为每台服务器签发证书

现在有根证书了,接下来要给每个服务器单独签发证书。比如你有两台服务器,IP分别是192.168.0.26192.168.0.27

# 为第一台服务器生成私钥和证书 openssl genrsa -out server1.key 2048 openssl req -new -key server1.key -out server1.csr -subj "/CN=192.168.0.26" openssl x509 -req -in server1.csr -CA RootCA.crt -CAkey RootCA.key -CAcreateserial -out server1.crt -days 365 -extfile <(echo subjectAltName=IP:192.168.0.26) # 为第二台服务器生成私钥和证书 openssl genrsa -out server2.key 2048 openssl req -new -key server2.key -out server2.csr -subj "/CN=192.168.0.27" openssl x509 -req -in server2.csr -CA RootCA.crt -CAkey RootCA.key -CAcreateserial -out server2.crt -days 365 -extfile <(echo subjectAltName=IP:192.168.0.27)

每个服务器会得到一对文件:.key(私钥,服务器自己保管)和 .crt(证书,可以理解成公钥,可以公开)。

然后把 .crt.key 配置到提供 Web 服务的 Nginx、Apache、IIS、东方通,或者群晖 Web Station 里就行。

对于个别非 Web 场景,比如微软的 WSUS 更新服务器,它是需要 .pfx 证书文件。.pfx 可以理解成公钥和私钥的“打包组合”。如果有这个需求,可以自行百度如何通过 OpenSSL 打包成 .pfx

三、把根证书导入客户端

这是最关键的一步。只有客户端(主要是电脑、手机、平板)信任了这个根证书,它签发的所有证书才会被信任。

Windows系统下,双击 RootCA.crt 文件:

  1. 点击“安装证书”

  2. 选择“本地计算机”,点下一步

  3. 选择“将所有的证书都放入下列存储”,点击“浏览”

  4. 选择“受信任的根证书颁发机构”,确定,下一步,完成

导入根证书到受信任的根证书颁发机构中导入根证书到受信任的根证书颁发机构中

做完这一步,就能实现“网站安全”了。如果还有对软件进行签名的需求,还可以再执行一次操作,把同一个根证书,导入到“受信任的发布者”。比如我在内网部署了微软的 WSUS 更新服务,还搭配了 WSUS Package Publisher 对第三方软件提供更新服务,如果没有导入根证书到“受信任的发布者”,就无法通过 WPP 进行第三方补丁的安装。当然了,还有一个必选动作就是要通过根证书为 WPP 服务器签发证书。

导入完成后,重启浏览器,再访问你的服务器,安全警告应该就消失了。

如果是Mac系统,双击证书文件后,在钥匙串的证书栏,找到这个证书,右键显示简介,在“信任”处,将“使用此证书时”修改为“始终信任”。

告别浏览器安全警告!手把手教你用自签名证书实现HTTPS自由

常见问题

Q:我把根证书装到手机上行不行?
A:完全可以。iPhone 和 Android 都有导入证书的功能,导进去之后手机上访问内网服务也不会报安全警告。

Q:根证书丢了怎么办?
A:所有签发的证书都会失效。要么找回备份,要么重新生成根证书、重新签发所有服务器证书、重新在所有客户端安装——很麻烦,所以一定要备份好。

Q:为什么我用群晖自带的证书功能不行?
A:群晖自带的是向 Let's Encrypt 申请的证书,三个月到期,和你手动申请免费证书没区别。自签名是另一条路。

Q:能用在公网上吗?
A:不能。公网上的访客不可能安装你的根证书。自签名证书只适合内网环境。

最后说几句

这套方案适合家庭局域网环境,尤其是自己NAS服务比较多的用户。一次性投入,长期受益。我自己的群晖、绿联、飞牛、威联通,以及上面部署的 Docker、Zabbix、VitePress、WSUS、WPP,都用这种方式,再也没见过浏览器那烦人的红叉。

同样,这个方案也适合纯内网办公的企业场景,安全是永远绕不开的底线,系统管理员们抓紧升级吧。

如果你有域控,还可以通过组策略把根证书推送到所有域内电脑,连手动导入的步骤都省了,真正的一劳永逸。

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
1评论

  • 精彩
  • 最新
  • 二哥666 [高兴]

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
4
扫一下,分享更方便,购买更轻松