1. 为什么内网IP也需要HTTPS加密?
很多人认为HTTPS只是公网服务的专利,内网环境天然安全不需要加密——这是个危险的误解。去年我们团队就遇到过内网监控系统被植入挖矿脚本的事故,攻击者正是通过未加密的HTTP接口完成了横向渗透。内网IP配置HTTPS至少有三个刚需场景:
- 内部管理系统:ERP、监控平台、运维工具往往部署在内网,但登录凭证和业务数据同样敏感
- 微服务通信:K8s集群内Pod间、服务间的API调用若走明文HTTP,等同于裸奔
- 开发测试环境:预发布环境常包含真实数据,却因"临时性"忽视安全配置
以192.168.1.100这个常见的内网地址为例,用OpenSSL生成自签名证书时,必须特别注意Subject Alternative Name (SAN)的配置:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/ssl/private/nginx-selfsigned.key \ -out /etc/ssl/certs/nginx-selfsigned.crt \ -subj "/CN=internal-server" \ -addext "subjectAltName=IP:192.168.1.100"关键提示:自签名证书在现代浏览器会显示警告,企业内网建议部署私有CA体系。用以下命令查看证书SAN扩展是否包含IP地址:
openssl x509 -in certificate.crt -text -noout | grep -A1 "Subject Alternative Name"
2. Nginx配置内网HTTPS全流程
2.1 证书准备与校验
在内网环境中,我们通常没有公网域名对应的证书,此时有三种方案可选:
| 方案类型 | 适用场景 | 优缺点对比 |
|---|---|---|
| 自签名证书 | 临时测试/非生产环境 | 零成本但需手动信任证书 |
| 私有CA签发 | 企业内网统一管理 | 需维护CA体系,一次配置终身受信 |
| 公网证书+IP绑定 | 有公网域名的特殊内网场景 | 需证书厂商支持IP SAN |
以自签名证书为例,生成后需要将证书部署到所有客户端设备的信任库。对于Windows设备:
Import-Certificate -FilePath "C:\certs\internal-server.crt" -CertStoreLocation Cert:\LocalMachine\Root2.2 Nginx核心配置模板
这是支持内网IP直接HTTPS访问的Nginx配置模板,重点注意listen指令和server_name的配合:
server { listen 443 ssl; server_name 192.168.1.100; # 直接使用内网IP ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; # 禁用不安全的协议和加密套件 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; location / { root /var/www/internal; index index.html; # 强制HTTPS(即使有人尝试HTTP访问) error_page 497 https://$host$request_uri; } }2.3 防火墙与SELinux策略调整
CentOS/RHEL系统需要同步处理以下安全策略:
# 放行HTTPS端口 firewall-cmd --permanent --add-service=https firewall-cmd --reload # 如果启用了SELinux setsebool -P httpd_can_network_connect 1 semanage port -a -t http_port_t -p tcp 4433. 客户端适配与疑难排查
3.1 浏览器信任证书的三种方式
当访问https://192.168.1.100出现证书警告时,不同系统的处理方式:
Windows Chrome/Edge:
- 点击警告页面任意处输入
thisisunsafe(无输入框,直接键盘输入) - 或通过
chrome://flags/#allow-insecure-localhost启用特殊策略
macOS Safari:
# 先将证书导入钥匙串 sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain internal-server.crtLinux curl测试:
curl --cacert /path/to/ca.crt https://192.168.1.1003.2 典型错误与解决方案
问题1:NET::ERR_CERT_INVALID
- 根因:证书SAN未包含IP地址或CN不匹配
- 验证:
openssl s_client -connect 192.168.1.100:443 -servername 192.168.1.100 | openssl x509 -text
问题2:ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- 检查Nginx的
ssl_protocols是否包含客户端支持的版本 - 老旧设备可能需要添加
ssl_ciphers兼容性配置
问题3:Chrome强制跳转HTTPS失败
- 地址栏输入
chrome://net-internals/#hsts - 在"Delete domain security policies"中输入内网IP删除HSTS策略
4. 进阶:私有CA体系建设
对于超过10台服务器的内网环境,建议使用OpenSSL建立私有CA:
# 生成CA根证书 openssl genrsa -aes256 -out ca.key 4096 openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt # 签发服务器证书 openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr -addext "subjectAltName=IP:192.168.1.100" openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256部署后,所有设备只需信任ca.crt根证书,后续签发的服务器证书会自动被信任。可通过以下策略管理证书生命周期:
# 查看证书有效期 openssl x509 -in server.crt -noout -dates # 吊销证书(需配置CRL) openssl ca -revoke server.crt -keyfile ca.key -cert ca.crt openssl ca -gencrl -out ca.crl -keyfile ca.key -cert ca.crt在内网DNS服务器添加A记录指向IP地址,即可实现类似https://internal.example.com的访问体验,同时保持内网通信的安全性。