自签内网 IP 证书
date
Jul 2, 2024
slug
self-host-https
status
Published
tags
HTTPS
summary
本文介绍使用
OpenSSL 为内网服务颁发 HTTPS 证书的方法type
Post
Language
本文介绍使用同一个的 CA 根证书,使用
OpenSSL 自签内网服务器证书的方法;利用根证书信任链,达到客户端系统只需安装一次根证书,后续可持续信任被根证书签发的证书。使用场景
- 通过
HTTPS实现TLS数据传输加密
- 客户只需安装一次根证书,后续的所有使用根证书自签的证书都会被系统信任
前置条件
rootCA.crt,CA 根证书公钥
rootCA.key,CA 根证书私钥
签发 CA 根证书(可选)
- 创建根证书密钥
sudo openssl ecparam -out rootCA.key -name prime256v1 -genkey- 创建根证书
sudo openssl req -new -sha256 -key rootCA.key -out rootCA.csr- 生成根证书,签发 10 年
sudo openssl x509 -req -sha256 -days 3650 -in rootCA.csr -signkey rootCA.key -out rootCA.crt签发服务器证书
创建
openssl.cnf 文件修改
organizationalUnitName organizationalUnitName_default commonName 为系统名称修改
IP.1 为被签名的 IP,或修改 DNS.1 为被签名的域;根据序号可签发多个 IP 或域[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
[req_distinguished_name]
countryName = CN
countryName_default = CN
stateOrProvinceName = sichuan
stateOrProvinceName_default = sichuan
localityName = chengdu
localityName_default = chengdu
organizationalUnitName = system
organizationalUnitName_default = system
commonName = system
commonName_max = 64
[ v3_req ]
basicConstraints = CA:TRUE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = domain
IP.1 = 192.168.0.1创建
v3.ext 文件,IP.1 和 DNS.1 与 openssl.cnf 配置保持一致authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName=@alt_names
[alt_names]
DNS.1 = domain
IP.1 = 192.168.0.1生成服务器私钥
sudo openssl genrsa -out private.key 2048生成服务器公钥,签发 10 年
sudo openssl req -new -days 3650 -key private.key -out server.csr -config openssl.cnf使用 CA 根证书生成服务器签名,签发 10 年
sudo openssl x509 -days 3650 -req -sha256 -extfile v3.ext -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -in server.csr -out public.crt查看证书信息
sudo openssl x509 -in public.crt -noout -textNginx 配置 HTTPS
server {
listen *:443 ssl;
server_name 192.168.0.1;
ssl_certificate /etc/nginx/cert/public.crt;
ssl_certificate_key /etc/nginx/cert/private.key;
...
}安装 CA 根证书
确保程序能够正常请求对应自签证书服务链接,可以参考以下方法导入 CA 证书到服务器或 docker 镜像
- Debian\Ubuntu
apt-get install ca-certificates
mkdir /usr/share/ca-certificates/selfCA
cp rootCA.crt /usr/share/ca-certificates/selfCA/
echo "selfCA/rootCA.crt" >>/etc/ca-certificates.conf
update-ca-certificates- CentOS
yum install -y ca-certificates
cp rootCA.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust- Windows
Win + R 键打开运行,输入
certmgr.msc ,打开 certmgr 图形化工具
双击左侧侧边栏受信任的证书颁发机构→证书右键点击右侧工作区选择所有任务→导入,进入证书导入向导。
点击下一步,选择
rootCA.crt 然后下一步,完成,导入完成- JDK
path 为根证书路径
cd $JAVA_HOME/lib/security
keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias rootCA -file <path>