文章目录
- 一、背景说明
- 二、整体架构
- 三、前置条件
- [四、生成支持 IP 的自签名证书(关键步骤)](#四、生成支持 IP 的自签名证书(关键步骤))
- [五、Java 服务配置(无需 HTTPS)](#五、Java 服务配置(无需 HTTPS))
- [六、Nginx HTTPS 反向代理配置](#六、Nginx HTTPS 反向代理配置)
- 七、访问测试
- [八、(可选)HTTP 自动跳转 HTTPS](#八、(可选)HTTP 自动跳转 HTTPS)
- [九、为什么推荐用 Nginx 实现 HTTPS?](#九、为什么推荐用 Nginx 实现 HTTPS?)
- 十、结语
一、背景说明
在内网环境中,我们经常会遇到这样的情况:
-
Java 服务已经运行在内网
texthttp://192.168.0.122:8999 -
希望支持 HTTPS 访问
-
不想改 Java 代码
-
不想在 Java 里配置 SSL、证书、Keystore
最佳实践就是:使用 Nginx 终止 HTTPS,由 Nginx 负责证书和加密通信。
二、整体架构
本文采用的架构如下:
浏览器
↓ HTTPS
Nginx(SSL)
↓ HTTP
Java 服务
- Java:只提供 HTTP
- Nginx:负责 HTTPS + 反向代理
最终访问地址:
text
https://192.168.0.122:8999
三、前置条件
- Linux 服务器(Ubuntu / CentOS 均可)
- 已安装 Nginx
- Java 服务可通过 HTTP 访问
- 仅内网使用(使用自签名证书)
四、生成支持 IP 的自签名证书(关键步骤)
⚠️ 注意:
浏览器强制要求证书必须包含 SAN(Subject Alternative Name)否则会被直接拒绝访问。
1️⃣ 创建证书目录
bash
mkdir -p /etc/nginx/ssl
cd /etc/nginx/ssl
2️⃣ 生成证书和私钥
bash
openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 \
-keyout server.key \
-out server.crt \
-subj "/CN=192.168.0.122" \
-addext "subjectAltName = IP:192.168.0.122"
生成文件说明:
server.key:私钥server.crt:证书

五、Java 服务配置(无需 HTTPS)
Java 服务保持 HTTP 即可,例如:
text
http://127.0.0.1:8998
推荐只监听
127.0.0.1,避免被外部直接访问
六、Nginx HTTPS 反向代理配置
在 nginx.conf 或 conf.d/https.conf 中新增配置:
nginx
server {
listen 8100 ssl;
server_name 192.168.0.122;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8999;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
重载 Nginx 配置
bash
nginx -t
nginx -s reload
七、访问测试
浏览器访问:
text
https://192.168.0.122:8100
关于"不安全提示"
-
这是 自签名证书的正常现象
-
内网环境可接受
-
可选择:
- 浏览器 → 高级 → 继续访问
- 或将
server.crt导入系统信任证书
八、(可选)HTTP 自动跳转 HTTPS
如果你仍保留 HTTP 访问入口:
nginx
server {
listen 8100;
server_name 192.168.0.122;
return 301 https://$host:8999$request_uri;
}
九、为什么推荐用 Nginx 实现 HTTPS?
| 对比项 | Java 直配 HTTPS | Nginx HTTPS |
|---|---|---|
| 配置复杂度 | 高 | ✅ 低 |
| 证书管理 | 麻烦 | ✅ 集中管理 |
| 性能 | 一般 | ✅ 更优 |
| 证书热更新 | 需重启 | ✅ reload |
| 后续上公网 | 困难 | ✅ 直接支持 |
十、结语
通过 Nginx + 自签名证书,我们可以:
- 不改 Java 代码
- 快速为内网服务加 HTTPS
- 符合生产级架构设计
- 为将来接入公网或 Let's Encrypt 打好基础
👉 Nginx 终止 HTTPS,是最推荐的做法。