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"
<h1>1. 安装依赖</h1><p>yum install -y epel-release certbot python3-certbot-apache httpd</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/ai/1228" title="NameGPT名称生成器"><img
src="https://img.php.cn/upload/ai_manual/000/000/000/175680125954711.png" alt="NameGPT名称生成器" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/ai/1228" title="NameGPT名称生成器">NameGPT名称生成器</a>
<p>免费AI公司名称生成器,AI在线生成企业名称,注册公司名称起名大全。</p>
</div>
<a href="/ai/1228" title="NameGPT名称生成器" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><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" << 'EOF'
<VirtualHost *:443>
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>"'/
</VirtualHost>
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
后续维护:自动续期不能少
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-*头









