使用 Nginx 为内网 Java 服务实现 HTTPS

文章目录

  • 一、背景说明
  • 二、整体架构
  • 三、前置条件
  • [四、生成支持 IP 的自签名证书(关键步骤)](#四、生成支持 IP 的自签名证书(关键步骤))
  • [五、Java 服务配置(无需 HTTPS)](#五、Java 服务配置(无需 HTTPS))
  • [六、Nginx HTTPS 反向代理配置](#六、Nginx HTTPS 反向代理配置)
  • 七、访问测试
  • [八、(可选)HTTP 自动跳转 HTTPS](#八、(可选)HTTP 自动跳转 HTTPS)
  • [九、为什么推荐用 Nginx 实现 HTTPS?](#九、为什么推荐用 Nginx 实现 HTTPS?)
  • 十、结语

一、背景说明

在内网环境中,我们经常会遇到这样的情况:

  • Java 服务已经运行在内网

    text 复制代码
    http://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.confconf.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,是最推荐的做法。


相关推荐
FQNmxDG4S3 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全4 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje4 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv74 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫4 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287924 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本4 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211235 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯7 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户60648767188967 小时前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java