内网环境部署 HTTPS(SSL 证书)方案
关键点:内网没有公网域名,无法申请公共 CA(Let’s Encrypt、阿里云 DV 等)的免费证书,公网 CA 证书要求域名必须公网可解析、可验证。内网 HTTPS 主要两种路线:自建 CA 签发内网证书、使用商业内网证书。
方案一:自建私有 CA(最常用,零成本)
自己搭建根 CA,然后给内网各服务签发证书,所有内网设备必须导入根 CA 证书,否则浏览器报不安全风险。
- 使用 OpenSSL 自建 CA(Linux/macOS/WSL)
① 创建 CA 根证书(只做一次)
bash创建CA目录
mkdir -p ./ca/{certs,newcerts,private,crldb}
cd ./ca
touch index.txt
echo 1000 > serial
生成CA私钥(保护好,不要泄露)
openssl genrsa -out private/ca.key 4096
生成CA根证书,有效期建议10年
openssl req -new -x509 -days 3650 -key private/ca.key -out certs/ca.crt
填写信息,Common Name 写你的内网 CA 名称,不要填业务域名。
输出两个关键文件:
private/ca.key:CA 私钥,严格保密
certs/ca.crt:CA 根证书,分发到所有客户端设备
② 为内网服务签发证书(例如内网地址 app.local、192.168.1.100)
⚠️ 内网证书一定要配置 Subject Alternative Name(SAN),支持域名 + IP,现代浏览器只认 SAN,忽略 CN 字段。
创建服务私钥
bash
openssl genrsa -out app.key 2048
创建证书请求 csr
bash
openssl req -new -key app.key -out app.csr
创建extfile.cnf扩展配置,重点 SAN 配置
ini
subjectAltName = DNS:app.local,DNS:*.app.local,IP:192.168.1.100
extendedKeyUsage = serverAuth
CA 签发证书
bash
openssl ca -in app.csr -out app.crt -days 365 -extfile extfile.cnf
得到:app.crt(证书) + app.key(私钥),给到 Nginx/Apache/IIS 等 web 服务。
- 客户端全部导入根证书 ca.crt
Windows:双击 crt → 安装证书 → 本地计算机 → 受信任的根证书颁发机构
Linux:复制到系统 ca 信任目录更新 ca‑certificates
Chrome/Edge/Firefox:Firefox 有独立证书库,需要手动导入根证书;chromium 系读取系统证书库
如果客户端不导入根 CA:浏览器访问 HTTPS 会提示证书不受信任,NET::ERR_CERT_AUTHORITY_INVALID。 - Web 服务配置 HTTPS 示例(Nginx)
nginx
server {
listen 443 ssl;
server_name app.local;
ssl_certificate ./app.crt;
ssl_certificate_key ./app.key;
}
配置完成后内网机器 hosts 解析 192.168.1.100 app.local,访问 https://app.local。
方案二:使用 mkcert 快速自建 CA(推荐新手,封装 OpenSSL)
mkcert 工具一键生成本地 CA,自动把根证书安装本机系统信任库,适合测试环境。
项目:github.com/FiloSottile/mkcert
bash初始化本地CA(仅一次)
mkcert -install签发证书,支持域名、通配符、IP
mkcert app.local ".app.local" 192.168.1.100
输出 app.local+3.pem 和 app.local+3-key.pem,直接丢给 web 服务。
⚠️ mkcert 生成的根证书只在执行 mkcert 的本机信任;其他内网电脑需要手动拷贝根 CA 证书导入信任库。用mkcert -CAROOT查看 CA 根证书存放路径。
方案三:商业内网证书(企业正式环境)
购买支持内网 IP / 内网域名的企业证书(私有 CA 商业产品,如 Digicert、Sectigo 私有 CA)
企业内部部署 PKI/AD‑CS(Windows 活动目录证书服务)
Windows AD‑CS:域环境最优方案,域内电脑自动信任企业根 CA,无需手动逐个导入证书,适合大规模内网。
非域环境依旧需要手动分发根证书。
❌ 不能做的事情
不能用 Let’s Encrypt 申请内网 IP / 内网域名证书:Let’s Encrypt DV 证书必须公网可访问校验,不支持 RFC1918 内网 IP、私有域名。
不要使用浏览器 “高级继续访问” 绕过证书警告:只是忽略报错,通信依然加密,但存在中间人风险,不适合业务系统。
常见坑总结
只填 CN 不写 SAN:新版 Chrome、Edge 直接报证书错误,证书必须配置 SAN 字段,IP 地址必须写在 SAN。
只给服务器装证书,客户端没有导入根 CA:浏览器报不安全。
证书有效期不要设置过长;生产环境建议 1 年以内。
通配符证书 .xxx.local 只能匹配子域名,不能匹配 IP 地址,IP 必须单独写进 SAN。
内网 DNS/hosts 需要正确解析域名到内网服务 IP。
选型建议
测试、少量设备:mkcert,上手最快
Linux 无图形、自建小环境:原生 OpenSSL 自建 CA
Windows 域控企业内网:AD‑CS,域机器自动信任,大规模首选
高安全合规企业:采购商用私有 CA