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需调整包名和路径):
立即学习
“
Java免费学习笔记(深入)
”;
#!/bin/bash
DOMAIN="example.com"
APACHE_CONF="/etc/httpd/conf.d/ssl.conf"
BACKEND_PORT="8080"
1. 安装依赖
yum install -y epel-release certbot python3-certbot-apache httpd
2. 启动并启用Apache
systemctl enable httpd
systemctl start httpd
3. 临时开放80端口(Certbot需要HTTP验证)
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
4. 使用Certbot自动申请并配置HTTPS(自动改Apache配置)
certbot --apache -d "$DOMAIN" --non-interactive --agree-tos -m admin@example.com
5. 手动补全反向代理配置(Certbot不自动加,需确保Java服务可达)
if ! grep -q "ProxyPass / https://www.php.cn/link/3de2f5d6b216073b662a9e202fb4b556" "$APACHE_CONF"; then
cat >> "$APACHE_CONF" << 'EOF'
ServerName '"$DOMAIN"'
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/'"$DOMAIN"'/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/'"$DOMAIN"'/privkey.pem
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:'"$BACKEND_PORT"'/
ProxyPassReverse / http://127.0.0.1:'"$BACKEND_PORT"'/
EOF
fi
6. 重载Apache生效
systemctl reload httpd
7. 开放443端口
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload
后续维护:自动续期不能少
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-*头