带有自定义CA的自签名SSL创建与使用
最近在本地测试网站的时候因为某些原因需要用到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.key
和rootCA.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.key
和example.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证书。