解决 https 证书续签烦恼——自签证书及信任自签 CA 完整攻略
写在前面
使用自签证书,可以减少各个软件配置 acme 续签的成本,同时只要在自己的设备上信任自签 CA,再使用体验上就与常规证书无异。
文章大概如下

关于免费证书

之前一直在使用 Let's Encrypt 的免费证书,虽然能配置自动续签,但还是存在以下问题:
需要了解申请流程,部分软件做到可自动申请,但并不是所有软件都支持
如需要申请泛域名证书,还需要对接了解域名服务提供商的 API 并提供对应认证信息
虽然可做到自动续签,但毕竟依赖外部服务且每次续签都是一次变动,存在出问题几率
在下次迁移服务或平台之前,又要重新配置一次,总归是有些麻烦,于是就尝试自签证书
关于自签证书
自签证书最大问题在于不被设备系统信任,所以访问的时候会存在证书报错

但是,我想了一下自己使用到 https 证书的场景,无非就是通过域名访问 Nas 上的服务:
通常只会是自己来访问,不会也不希望其他陌生人来访问
对于自己的设备,可配置信任自签 CA 证书来获取与有效证书的使用体验
可以一次性签发非常长的时间,不用担心过期问题,不用考虑续签问题
下次迁移平台只需把证书文件拷贝过去即可,不需要重新部署申请及续签免费证书的环境
这样想想,好像还是挺香的,于是就开搞了
自签证书
最好是在 linux 平台上来自签证书,比如直接在 Nas 开一个终端来操作即可。
生成 CA 证书
通过以下命令可简单生成一个 ca 证书
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj "/C=CN/CN=My Root CA/O=MyRootCA"
我直接在 unRaid Nas 的网页终端中执行命令就可以创建 CA 证书
私钥名:ca.key
证书名:ca.crt

接下来就是用自签的 CA 证书来签发域名证书了
切记切记,CA 证书一定要保存好,避免泄漏,否则可能会导致引发个人数据、信息泄漏。
自签泛域名证书
自签名脚本,并将开头的 DOMAINS 变量修改为你的域名:

举个例子,我购买的域名为 aaa.com,然后做了一下分配:
Nas 分配了域名 nas.aaa.com
主路由 openwrt 也分配了域名 op.aaa.com
然后 nas 上运行的服务还单独分配了域名,比如:
jellyfin 分配了 jellyfin.nas.aaa.com
transmission 分配了 tr.nas.aaa.com
那我需要修改的就是 DOMAINS='nas.aaa.com op.aaa.com'

将脚本放到 nas 上与上一步的 ca 证书同个域名:
如果熟悉命令行操作,通过 vim在终端里面写入一个 gen.sh 文件
如果不熟悉的话,可先在 windows 保存在 gen.txt 文件,再把后缀修改后上传到 Nas
然后通过这个命令运行脚本来生成自签证书:bash gen.sh

执行成功后目录下会生成多个文件,其中:
mycert.crt 就是证书文件
mycert.key 就是证书 key
可以通过以下命令来查看自签证书情况:
openssl x509 -noout -text -in mycert.crt
比如证书有效期为 1825 天,也就是 5 年

同时这个命令还会输出该证书可用于什么域名:

可以看到,我们前面提到的几个域名均可使用该证书。
接下来就是将证书配置到相关的域名,比如 openwrt uhttpd、nas nginx 等服务

以 openwrt 的 uhttpd 服务为例,直接配置上证书即可,不需要考虑任何续签问题
信任自签证书
将前面第一步自签 CA 证书生成的 ca.crt 根证书文件下载到对应的电脑设备上
开始配置电脑设备信任自签 CA 证书,从而信任签发的泛域名证书
下文分别介绍 windows 及 macOS 平台的操作
windows 信任自签 CA
通过 Win + R 打开运行,并输入 mmc 打开控制台。
默认情况下,控制台只有一个根节点,没有其他任何信息,我们需要手动添加:
点击 文件 - 添加/删除管理单元

找到 证书 并点击添加

依次选择:
计算机账户
本地计算机(运行此控制台的计算机)
完成
确定
然后就可以在控制台上看到证书,进行管理

接下来就是导入自签的 CA 证书:
点击展开 证书(本地计算机) 找到 受信任的根证书颁发机构
右键,选择 所有任务 - 导入
然后选择刚才生成的 ca.crt 文件即可
点击 受信任的根证书颁发机构 下一级的 证书,在中间已经可以找到刚才导入的证书了

这样,在访问利用这个 CA 根证书签发的普通证书,就都不会报错了
比如我自签了一个云音乐的证书,在导入 ca 之后,使用体验与之前完全一致

后续有了这个根证书,对于一些 NAS 上面部署的服务,不需要给别人访问,都可以直接自签证书:
自己的设备都信任自签的 CA 证书
在自己的设备上访问部署自签证书服务的与正规证书完全没有区别
别人访问的时候会报错:NET::ERR_CERT_AUTHORITY_INVALID 也算是多一层防护
MacOS 信任自签证书
双击 ca.crt 跟证书文件打开

在钥匙串点击选择切换 iCloud 变为 系统 选项,并点击添加按钮。
然后回到 钥匙串访问,在 系统钥匙串 中找到刚才添加的根证书,双击打开,展开 信任 选项,设置使用该证书时:始终信任

这时候下方的所有选项也会自动切换到始终信任,然后点击关闭,需要输入密码进行验证,之后就完成导入。

重启浏览器,就可以看到新自签证书已经被信任
写在后面
再次强调,使用该方案一定要保护好 CA 证书文件,如果怀疑泄漏了,第一时间将个人设备取消信任该 CA,避免造成损失。
目前使用我给自己个人的站点,包括 vps 的一些站点,家里路由、Nas 外网代理等等都是配置了自签名证书。目前主要也是这两个访问场景:
通过 ipv6 直接访问家里的路由
没有 ipv6,就通过 ipv4 访问 vps 的 frp 代理再穿透回来
使用这个方案的成本是一次性的,后续基本就不用担心证书续签问题。一个缺点就是在新设备,没有导入 CA 时访问自己的站点会有证书报错,但只要忽略了就行,不会影响到后续的使用。

szsw
校验提示文案
笑苍天
校验提示文案
NFspring
校验提示文案
NGKE
校验提示文案
浩淼锋
校验提示文案
liu164775
校验提示文案
一切随缘zh
校验提示文案
Angleabs
校验提示文案
值友3297069102
校验提示文案
总冠军
校验提示文案
值友3297069102
校验提示文案
Angleabs
校验提示文案
总冠军
校验提示文案
一切随缘zh
校验提示文案
szsw
校验提示文案
liu164775
校验提示文案
浩淼锋
校验提示文案
NGKE
校验提示文案
笑苍天
校验提示文案
NFspring
校验提示文案