最近部署服务,因为客户要求,需要使用https访问,所以就需要签发一个局域网IP的证书。
本篇使用OpenSSL进行签发
IP 证书必须包含 subjectAltName (SAN) 扩展字段,否则 Chrome/Edge 等现代浏览器会提示 NET::ERR_CERT_COMMON_NAME_INVALID。
创建根 CA (Root CA)#
# 生成 CA 私钥
openssl genrsa -out rootCA.key 4096
# 生成根证书 (有效期 10 年)
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.pem \
-subj "/CN=Internal-Local-CA/O=MyLocalOrg/C=CN"配置文件 ip.ext#
创建一个名为 ip.ext 的文件,写入目标 IP 信息:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 10.10.20.100
# 如果有多个 IP 或域名可继续追加:
# IP.2 = 10.0.0.1
# DNS.1 = mylocal.lan生成服务端私钥与 CSR,并用 CA 签发#
# 1. 生成 IP 的私钥
openssl genrsa -out server.key 2048
# 2. 生成证书签名请求 (CSR)
openssl req -new -key server.key -out server.csr \
-subj "/CN=10.10.20.100/O=MyLocalOrg/C=CN"
# 3. 签发证书 (有效期 825 天,符合 iOS/macOS 对自签证书的最长限制要求)
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key \
-CAcreateserial -out server.crt -days 825 -sha256 -extfile ip.ext信任根证书#
将生成的 rootCA.pem 分发并导入到终端设备的根证书信任库中:
Windows: 双击
rootCA.pem-> 安装证书 -> 本地计算机 -> 放置于“受信任的根证书颁发机构”。macOS: 双击导入 Keychain,找到该证书并设置为“始终信任”。
Linux (Ubuntu/Debian): 复制到
/usr/local/share/ca-certificates/rootCA.crt并运行sudo update-ca-certificates。iOS / Android: 传输文件至手机安装,并在“设置 -> 关于本机 -> 证书信任设置”中开启完全信任。
PS: 对于Windows7,需要将rootCA.pem的后缀修改为.crt或者cer,这样才能导入。
Nginx配置证书#
server {
listen 443 ssl;
server_name _;
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8080;
}
}