自签内网 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.1DNS.1openssl.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 -text

Nginx 配置 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 图形化工具
notion image
双击左侧侧边栏受信任的证书颁发机构→证书右键点击右侧工作区选择所有任务→导入,进入证书导入向导。
点击下一步,选择 rootCA.crt 然后下一步,完成,导入完成
  • JDK
path 为根证书路径
cd $JAVA_HOME/lib/security
keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias rootCA -file <path>

Reference

 

© chobit blog 2025