问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

解决 https 证书续签烦恼——自签证书及信任自签 CA 完整攻略

创作时间:
作者:
@小白创作中心

解决 https 证书续签烦恼——自签证书及信任自签 CA 完整攻略

引用
什么值得买
1.
https://post.smzdm.com/p/admdzd9d/

使用自签证书,可以减少各个软件配置 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 打开控制台。

默认情况下,控制台只有一个根节点,没有其他任何信息,我们需要手动添加:

点击文件 - 添加/删除管理单元

找到证书 并点击添加

依次选择:

  1. 计算机账户
  2. 本地计算机(运行此控制台的计算机)
  3. 完成
  4. 确定

然后就可以在控制台上看到证书,进行管理

接下来就是导入自签的 CA 证书:

  1. 点击展开证书(本地计算机)找到受信任的根证书颁发机构
  2. 右键,选择所有任务-导入
  3. 然后选择刚才生成的 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 时访问自己的站点会有证书报错,但只要忽略了就行,不会影响到后续的使用。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号