1. 为什么你的SpringBoot应用需要HTTPS?
最近有个做小程序的朋友找我帮忙,他的后端服务突然被微信平台警告"必须使用HTTPS协议"。这让我想起五年前第一次给网站配置SSL证书时的手忙脚乱——当时连HTTPS和HTTP的区别都搞不清楚。现在回头看,HTTPS早已从"加分项"变成了"必选项"。
简单来说,HTTPS就是在HTTP基础上加了一层SSL/TLS加密层。想象一下,HTTP就像用明信片写信,所有内容邮递员都能看到;而HTTPS则是把信装进保险箱,只有收件人有钥匙。特别是当你的应用涉及用户登录、支付等敏感操作时,没有HTTPS就像让用户裸奔上网。
在阿里云ECS上部署SpringBoot应用时,我强烈建议直接配置HTTPS,原因有三:
- 安全合规:各大应用商店、小程序平台都强制要求HTTPS
- SEO优势:Google等搜索引擎会给HTTPS网站排名加权
- 用户体验:现代浏览器会对HTTP网站显示"不安全"警告
2. 阿里云免费SSL证书申请实战
2.1 证书申请全流程
首先登录阿里云控制台,搜索"SSL证书",进入数字证书管理服务。点击左侧"免费证书",你会看到一个让人安心的提示——每个阿里云账号可以申请20张单域名DV证书,有效期1年。
点击"创建证书"后,需要填写域名信息。这里有个坑我踩过:如果你要用www.example.com访问,就填带www的;如果要用根域名example.com访问,就别带www。填错会导致浏览器警告"证书与域名不匹配"。
提交申请后,通常10分钟内就能收到审核通过的短信。记得检查域名解析是否正确——我有次因为DNS缓存等了半小时才生效。下载证书时选择"Tomcat"类型(虽然我们用SpringBoot,但内置的就是Tomcat容器),会得到一个包含.pfx文件和密码文本的压缩包。
2.2 证书安全存储方案
新手最容易犯的错误就是把证书直接放在项目的resources目录下。千万别这么做!这样证书会被打包进JAR文件,万一JAR泄露,攻击者能直接拿到你的私钥。
正确的做法是在ECS上创建专用目录:
sudo mkdir -p /etc/ssl/your_app sudo chmod 700 /etc/ssl/your_app然后用SFTP工具上传证书文件,设置严格的权限:
sudo chown root:root /etc/ssl/your_app/* sudo chmod 600 /etc/ssl/your_app/*3. SpringBoot配置HTTPS核心步骤
3.1 application.yml安全配置
先看一个生产级配置模板(YAML格式):
server: port: 443 ssl: key-store: file:/etc/ssl/your_app/domain.pfx key-store-type: PKCS12 key-store-password: ${SSL_KEYSTORE_PASSWORD} key-alias: your_alias enabled-protocols: TLSv1.2,TLSv1.3 ciphers: - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 - TLS_AES_128_GCM_SHA256 http2: enabled: true几个关键点:
- 使用
file:前缀指定绝对路径,不要用classpath: - 密码通过环境变量注入,避免硬编码
- 只启用TLS 1.2/1.3,禁用不安全的旧协议
- 配置强加密套件,防止降级攻击
3.2 环境变量安全管理
在~/.bashrc中添加:
export SSL_KEYSTORE_PASSWORD="你的证书密码" export SSL_KEY_PASSWORD="你的私钥密码" # 如果与上面不同然后执行source ~/.bashrc使配置生效。更安全的方式是使用阿里云KMS服务,但免费方案用环境变量已经比写在配置文件中安全多了。
4. 阿里云ECS安全加固指南
4.1 防火墙与安全组配置
首先检查443端口是否开放:
sudo netstat -tulnp | grep 443如果没有输出,需要配置安全组:
- 进入ECS控制台 -> 安全组 -> 配置规则
- 添加入方向规则:协议类型TCP,端口范围443,源0.0.0.0/0
对于系统防火墙,根据你的Linux发行版选择对应命令:
- CentOS/RHEL:
sudo firewall-cmd --permanent --add-port=443/tcp sudo firewall-cmd --reload - Ubuntu:
sudo ufw allow 443/tcp
4.2 HTTP自动跳转HTTPS
在SpringBoot启动类中添加:
@Bean public TomcatServletWebServerFactory tomcatFactory() { return new TomcatServletWebServerFactory() { @Override protected void postProcessContext(Context context) { SecurityConstraint constraint = new SecurityConstraint(); constraint.setUserConstraint("CONFIDENTIAL"); SecurityCollection collection = new SecurityCollection(); collection.addPattern("/*"); constraint.addCollection(collection); context.addConstraint(constraint); } }; } @Bean public Connector httpConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(8080); // HTTP端口 connector.setSecure(false); connector.setRedirectPort(443); // 重定向到HTTPS端口 return connector; }5. 高级安全与性能优化
5.1 使用SLB/Nginx做SSL卸载
虽然SpringBoot内置Tomcat可以直接处理HTTPS,但在生产环境更推荐使用反向代理做SSL卸载:
- 性能更好:专门的Web服务器处理SSL加解密效率更高
- 更安全:后端服务不需要暴露公网IP
- 灵活性:证书更新只需在代理层操作
Nginx配置示例:
server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /etc/nginx/ssl/yourdomain.pem; ssl_certificate_key /etc/nginx/ssl/yourdomain.key; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }5.2 证书自动续期方案
免费证书有效期只有1年,手动更新太麻烦。可以用阿里云证书服务的自动推送功能配合脚本实现半自动续期:
- 在证书控制台开启自动续期
- 创建续期检查脚本
/etc/ssl/renew_cert.sh:
#!/bin/bash CERT_DIR="/etc/ssl/your_app" NEW_CERT="/path/to/new/cert.pfx" if [ -f "$NEW_CERT" ]; then systemctl stop your_app cp $NEW_CERT $CERT_DIR/domain.pfx systemctl start your_app rm $NEW_CERT fi- 设置crontab每月检查:
0 3 1 * * /etc/ssl/renew_cert.sh6. 常见问题排查手册
问题1:启动时报错"Keystore was tampered with"
- ✅ 检查证书密码是否正确(注意.txt文件中的换行符)
- ✅ 确认证书路径有读取权限
- ✅ 验证证书类型是否匹配(PFX对应PKCS12)
问题2:浏览器提示"不安全连接"
- 🔍 用在线工具检查证书链:https://www.ssllabs.com/ssltest
- 🔍 确认域名没有拼写错误
- 🔍 清除浏览器缓存或尝试无痕模式
问题3:性能明显下降
- ⚡ 考虑启用HTTP/2(SpringBoot 2.3+默认支持)
- ⚡ 检查SSL会话复用是否开启
- ⚡ 使用JMeter压测找出瓶颈
我在实际项目中发现,约80%的HTTPS问题都是由于证书路径或密码错误导致的。建议首次配置时,先用curl -v https://yourdomain.com命令查看详细握手过程,比浏览器报错信息更有参考价值。