侧边栏壁纸
博主头像
Blog

行动起来,活在当下

  • 累计撰写 35 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

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

Administrator
2025-03-20 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

反正网站只有自己会打开来看,爬虫更是不屑一顾 (其实是写了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

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

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

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

0

评论区