解决HTTPS证书续签烦恼——自签证书及信任自签CA完整攻略
解决HTTPS证书续签烦恼——自签证书及信任自签CA完整攻略
使用自签证书可以有效减少软件配置ACME续签的成本,同时在自己的设备上信任自签CA后,使用体验与常规证书无异。本文将详细介绍如何生成自签证书及在不同设备上信任自签CA的完整过程。
关于免费证书
之前一直在使用Let's Encrypt的免费证书,虽然能配置自动续签,但还是存在以下问题:
- 需要了解申请流程,部分软件做到可自动申请,但并不是所有软件都支持
- 如需要申请泛域名证书,还需要对接了解域名服务提供商的API并提供对应认证信息
- 虽然可做到自动续签,但毕竟依赖外部服务且每次续签都是一次变动,存在出问题几率
在下次迁移服务或平台之前,又要重新配置一次,总归是有些麻烦,于是就尝试自签证书。
关于自签证书
自签证书最大问题在于不被设备系统信任,所以访问的时候会存在证书报错。但是,如果只在自己的设备上使用,可以通过以下方式来解决:
- 通常只会是自己来访问,不会也不希望其他陌生人来访问
- 对于自己的设备,可配置信任自签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时访问自己的站点会有证书报错,但只要忽略了就行,不会影响到后续的使用。