反正网站只有自己会打开来看,爬虫更是不屑一顾 (其实是写了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
现在就可以打开网站查看自签证书的效果如何了
密钥文件注意妥善保管,生成证书会用到
弄丢了也没关系,重新自签就行
评论区