自签10年泛域名证书自己做 CA 免去证书续期苦恼

反正网站只有自己会打开来看,爬虫更是不屑一顾 (其实是写了robots.txt)

去申请个免费的 Let's Encrypt 证书也会在 crt.sh 留有记录,每2个月就有一条,一年就是6条,小秘密都被看光光

还不如自己做 CA 自签证书,签个10年的泛域名,懒得折腾这么多

不过其他人打开这种自签证书的网站一般就是红色警告劝退

下面开始

准备工具

使用 openssl 来签发,Linux 系统一般都自带了,Windows 可以在这里下载,选最新的 Light MSI 安装包下载就行,安装很简单,略过

后面的命令都是直接在 Windows 下的 CMD 操作

生成CA根证书

在 Windows 系统生成 CA 根证书,毕竟要用个10年,证书肯定要上炫一点的算法,加密采用 ECDSA 384 位算法,生成和验证采用 SHA-384 哈希算法,命令如下

openssl ecparam -name secp384r1 -genkey -out root-ca.key
openssl req -x509 -sha384 -new -key root-ca.key -out root-ca.cer -days 3650 -subj ""/"CN=Geek Force Group Inc. Root CA"

第一条命令生成密钥,第二条命令生成证书

root-ca 是文件名字前缀,可以自己随便写

-days 后面是天数

-subj 后面是一些基本信息,填个 Common Name 就行,也是可以自己随便写

因为是 CMD,所以 / 加了个双引号作转义

查看生成的证书

openssl x509 -in root-ca.cer -text

生成中间证书

这一步不是很有必要,但本着根证书只用来签发中间证书的目的,所以就签个吧

openssl ecparam -name secp384r1 -genkey -out intermedia-ca.key
openssl req -x509 -sha384 -new -key intermedia-ca.key -CAkey root-ca.key -CA root-ca.cer -out intermedia-ca.cer -days 3650 -subj "/CN=GFG Inc. CA Class A"

跟上一步基本一样,不同点主要是需要指定上级证书,即 -CAkey -CA

生成最终用户证书

命令也是差不多,主要注意是个泛域名证书,还有限制是非 CA 证书

openssl ecparam -name secp384r1 -genkey -out wildcard.key
openssl req -x509 -sha384 -new -key wildcard.key -CAkey intermedia-ca.key -CA intermedia-ca.cer -out wildcard.cer -days 3650 -subj "/CN=geekforce.group" -addext "basicConstraints=CA:false" -addext "subjectAltName = DNS:*.geekforce.group, DNS:geekforce.group"

这里的上一级证书就是中间证书

通过 basicConstraints=CA:false 限制为非 CA 证书,火狐系浏览器会验证这个

通过 subjectAltName 设置 SAN,作用就是泛域名,如果写上其他不同的域名,那就是多个域名的泛证书了 (从 Let's Encrypt 泛证书抄来的)

生成好需要的证书后就可以导入了

生成证书链

这一步不是必须,但是火狐系浏览器不采用系统的证书设置,需要另外导入,所以做一个证书链就不用去分开导入根证书和中间证书了

证书链很简单,格式就是

中间证书
根证书

用文本编辑器打开根证书和中间证书然后复制、粘贴、保存成其他文件如 chain-ca.cer 就行,示例

-----BEGIN CERTIFICATE-----
MIIB
……
Qo0=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB
……
9ew==
-----END CERTIFICATE-----

也可以直接把最终用户证书也加上,最上面的是用户证书,这样的好处是只需要导入这一个完整的证书链就行,但不适合有多个网站的情况

导入证书

也很简单,只需要导入根证书和中间证书就行,最终用户证书是部署到服务器的

双击 root-ca.cer intermedia-ca.cer 就可以导入了

root-ca.cer 要导入到受信任的根证书颁发机构

intermedia-ca.cer 要导入到中级证书颁发机构

也可以通过运行 certmgr.msc 打开证书管理器来导入,找到对应位置然后右击证书文件夹,依次选择其他任务 > 导入,选择对应的证书完成导入

Linux 系统一般就是 /etc/ssl/certs /usr/share/ca-certificates/ /usr/local/share/ca-certificates/ 这3个位置,任选一个,这个是作为客户端才需要导入,服务器不用导入

Mac 系统不清楚怎么导入,略过

火狐系浏览器导入证书

前面提到火狐系浏览器是自己内部有另外的证书系统,所以需要另外导入

打开设置页面,左边点选隐私和安全,右边下滑到安全 > 证书,有一个「查看证书」,打开后切换到最后面的机构选项页,然后点击下方的导入即可

这里导入证书链就无需导入2次,如果没有证书链就分别导入根证书和中间证书

安卓系统导入证书

复制 root-ca.cer intermedia-ca.cer 到安卓手机,然后点击,选择使用证书安装程序来打开即可完成导入

也可以选择复制证书链文件,好处也是无需导入2次

不同手机略有差异,一般也可以在设置的高级页下的选择从手机存储或 SD 卡存储来导入,但有些手机阉割了这个功能

iOS 系统不清楚怎么导入,略过

部署最终用户证书

我用 Caddy v2 部署的,突出一个简单好写

首先把最终用户证书的 wildcard.key 复制到 /etc/ssl/private/

然后把 wildcard.cer 复制到 /etc/ssl/certs,这里可以改后缀名成 .pem,不重要,只是美观好看

接着修改 Caddyfile,示例

moonay.geekforce.group:443 {
	tls /etc/ssl/certs/wildcard.pem /etc/ssl/private/wildcard.key {
		protocols tls1.3
	}
	encode zstd gzip
	root * /var/www/html
	file_server
}

域名后面加上端口强制 https,tls 指定证书和密钥位置,后面强制指定协议是 tls1.3,接下来的配置自定义

然后重新加载 caddy

sudo systemctl reload caddy

现在就可以打开网站查看自签证书的效果如何了

密钥文件注意妥善保管,生成证书会用到

弄丢了也没关系,重新自签就行

点赞
  1. 她说是晒黑的说道:

    保守了,这种应该签个100年

  2. hi2hi说道:

    我更喜欢套个cf的免费方案

  3. 2269400447说道:

发表回复

电子邮件地址不会被公开。必填项已用 * 标注

×
订阅图标按钮