跳转至主要内容

Frank的技术笔记

带有自定义CA的自签名SSL创建与使用

头像 梦叶
发表于 2024年6月1日

最近在本地测试网站的时候因为某些原因需要用到HTTPS,所以很自然的想到自签名SSL。用自定义CA主要是因为我本地跑的测试站比较多,有CA的话可以直接把CA证书添加到信任链里面,而不用一个个添加每个网站的SSL证书。

创建自定义CA密钥

openssl genrsa -des3 -out rootCA.key 4096

这一步创建我们的自定义CA密钥,如果不需要密码保护把-des3去掉即可。4096是指4096位加密。

创建自定义CA证书

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt

这一步创建一个证书。-days后面跟证书生效时间,如3650就是10年。

上面两步好了之后会得到两个文件,rootCA.keyrootCA.crt。其中rootCA.crt是后面要反复用到的。

创建自签名SSL

openssl genrsa -out example.com.key 2048
openssl req -new -key example.com.key -out example.com.csr

每一个域名都需要创建一次。2048是指2048-bits加密。第一步创建密钥,第二步则是创建CSR(证书签名请求)。

创建CSR的时候就可以把SAN数据附加上去了。(没有SAN数据的话浏览器会报安全错误。)当然在创建证书的时候也可以附加SAN数据,我一般是在创建证书的时候附加。

openssl req -new -sha256 \
    -key example.com.key \
    -subj "/C=US/ST=CA/O=MyOrg, Inc./CN=example.com" \
    -reqexts SAN \
    -config <(cat /etc/ssl/openssl.cnf \
        <(printf "\n[SAN]\nsubjectAltName=DNS:example.com,DNS:*.example.com")) \
    -out example.com.csr

创建的时候会问你一堆有的没的的问题,包括国家和地区,公司,通用名等。其中通用名填你要用的域名,其他的爱怎么填怎么填。也可以像上面这个例子一样,提前把这些数据写在-subj参数后面。(CN就是通用名。不是中国的意思!)

得到example.com.keyexample.com.csr

然后拿着CSR去生成证书。

openssl x509 -req -in example.com.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out example.com.crt -days 365 -sha256

同样-days是证书的有效日期。

也可以在这一步的时候附加SAN数据,首先新建一个名为example.com.ext的文件:

vim example.com.ext

然后写入以下内容:

subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer:always
basicConstraints       = CA:FALSE
keyUsage               = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign
subjectAltName         = DNS:example.com, DNS:*.example.com
issuerAltName          = issuer:copy

其中subjectAltName就是SAN数据,一般有DNS:IP:两种,其中DNS:后跟域名,IP:后跟IP地址,不同SAN数据之间用逗号隔开。

最后把-extfile example.com.ext这个参数加到命令后方:

openssl x509 -req -in example.com.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out example.com.crt -days 365 -sha256 -extfile example.com.ext

就得到了带有SAN数据的证书。(如果在生成CSR的时候就附带了SAN数据那么可以无视这一步。)

把自定义CA加入信任链

这里以Debian 12系统为例:

sudo cp rootCA.crt /usr/local/share/ca-certificates
sudo update-ca-certificates

某些浏览器(例如Chromium)有自己的信任链,这种情况下需要手动去浏览器设置里添加刚才创建的CA证书。

延伸阅读

梦叶
梦叶

原名Frank419,网站站长。不定期更新?

分类:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注