Java应用不处理HTTPS证书,Apache负责SSL终止并反向代理至Java服务;脚本通过Certbot自动申请证书、配置Apache SSL与Proxy、重载服务,并需配置自动续期及SELinux等避坑项。

Java应用本身不直接处理HTTPS证书部署,Apache HTTP Server(通常指 httpd)才负责SSL/TLS终止。所谓“Java中Apache自动化部署HTTPS证书”,实际是指:在运行Java Web应用(如Spring Boot、Tomcat)的服务器上,用Apache作为反向代理,并通过Shell脚本自动完成Apache的SSL证书申请(如用Certbot)、配置更新与服务重载。
明确角色分工:Apache管HTTPS,Java应用管业务
常见架构是:用户 → Apache(HTTPS + 反向代理) → Tomcat/Spring Boot(HTTP,内网通信)。因此Shell脚本操作对象是Apache配置(/etc/httpd/conf.d/ssl.conf 或 /etc/apache2/sites-enabled/000-default-le-ssl.conf),不是Java代码或JVM参数。
关键点:
- Certbot会自动修改Apache虚拟主机配置,启用SSL模块并指向证书路径
- 脚本需确保Apache已启用 mod_ssl 和 mod_proxy(用于代理Java后端)
- Java应用应监听本地端口(如 8080),不暴露公网,也不自行配置keystore
核心Shell脚本:申请+部署+验证
以下为可直接运行的精简版脚本(适配CentOS/RHEL系,Debian/Ubuntu需调整包名和路径):
#!/bin/bash DOMAIN="example.com" APACHE_CONF="/etc/httpd/conf.d/ssl.conf" BACKEND_PORT="8080" <h1>1. 安装依赖</h1><p>yum install -y epel-release certbot python3-certbot-apache httpd</p><h1>2. 启动并启用Apache</h1><p>systemctl enable httpd systemctl start httpd</p><h1>3. 临时开放80端口(Certbot需要HTTP验证)</h1><p>firewall-cmd --permanent --add-port=80/tcp firewall-cmd --reload</p><h1>4. 使用Certbot自动申请并配置HTTPS(自动改Apache配置)</h1><p>certbot --apache -d "$DOMAIN" --non-interactive --agree-tos -m admin@example.com</p><h1>5. 手动补全反向代理配置(Certbot不自动加,需确保Java服务可达)</h1><p>if ! grep -q "ProxyPass / <a href="https://www.php.cn/link/3de2f5d6b216073b662a9e202fb4b556">https://www.php.cn/link/3de2f5d6b216073b662a9e202fb4b556</a>" "$APACHE_CONF"; then cat >> "$APACHE_CONF" ServerName '"$DOMAIN"' SSLEngine on SSLCertificateFile /etc/letsencrypt/live/'"$DOMAIN"'/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/'"$DOMAIN"'/privkey.pem ProxyPreserveHost On ProxyPass / <a href="https://www.php.cn/link/4a643e03578577526149a599ac6f332b">http://127.0.0.1:'"$BACKEND_PORT</a>"'/ ProxyPassReverse / <a href="https://www.php.cn/link/4a643e03578577526149a599ac6f332b">http://127.0.0.1:'"$BACKEND_PORT</a>"'/ EOF fi</p><h1>6. 重载Apache生效</h1><p>systemctl reload httpd</p><h1>7. 开放443端口</h1><p>firewall-cmd --permanent --add-port=443/tcp firewall-cmd --reload </p>
后续维护:自动续期不能少
Let’s Encrypt证书90天过期,必须配置自动续期。Certbot自带定时任务,但需验证是否启用:
- 检查定时任务:systemctl list-timers | grep certbot
- 手动测试续期:certbot renew --dry-run
- 确保续期后自动重载Apache:在 /etc/letsencrypt/renewal/example.com.conf 中添加
renew_hook = systemctl reload httpd
常见问题与避坑提示
执行失败?重点排查这几项:
- 域名DNS必须已解析到该服务器IP,否则HTTP-01验证失败
- Apache配置中不能有语法错误,运行 apachectl configtest 验证
- SELinux可能阻止代理:执行 setsebool -P httpd_can_network_connect 1
- Java应用需允许本地代理请求:如Spring Boot设置 server.forward-headers-strategy=native,并信任X-Forwarded-*头
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










