解决 https 证书续签烦恼——自签证书及信任自签 CA 完整攻略
解决 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 时访问自己的站点会有证书报错,但只要忽略了就行,不会影响到后续的使用。