https(hyper text transfer protocol secure)是http的安全版本,通过ssl/tls协议为通讯提供加密、身份验证和数据完整性保护。
一、https核心原理
1.加密流程概述
- 客户端发起https请求(连接到服务器443端口)
- 服务器返回数字证书(包含公钥)
- 客户端验证证书(检查颁发机构、有效期等)
- 密钥交换(对过非对称加密协商对称密钥)
- 加密通信(使用对称密钥加密数据传输)
2.加密技术组合
技术类型 | 作用 | 典型算法 |
---|---|---|
非对称加密 | 身份验证和密钥交换 | rsa、ecc、dh |
对称加密 | 加密实际传输数据 | aes、3des、chacha20 |
哈希算法 | 保证数据完整性 | sha-256、sha-3 |
数字证书 | 验证服务器身份 | x.509标准 |
二、证书体系详解
1、证书类型对比
类型 | 验证级别 | 颁发速度 | 价格 | 适用场景 |
---|---|---|---|---|
dv证书 | 域名验证 | 分钟级 | 免费-低价 | 个人网站、测试环境 |
ov证书 | 组织验证 | 1-3天 | 中档 | 企业官网 |
ev证书 | 扩展验证 | 3-7天 | 高价 | 金融、电商等高安全需求 |
自签名证书 | 无第三方验证 | 即时 | 免费 | 内网、开发环境 |
2. 证书获取方式
- 购买商业证书(推荐生产环境使用)
- 主流ca机构:digicert、sectigo、globalsign
- 云服务商提供:aws acm、阿里云ssl证书
- 免费证书(适合中小项目)
- let’s encrypt(90天有效期,需自动续期)
- cloudflare提供的边缘证书
- 自签名证书(开发测试用)
# 使用openssl生成 openssl req -x509 -newkey rsa:4096 -nodes \ -keyout server.key -out server.crt \ -days 365 -subj "/cn=yourdomain.com"
三、spring boot配置https
1. 基础配置步骤
1.1 准备证书文件
将证书(.crt或.pem)和私钥(.key)文件放入resources/ssl/
目录
1.2 配置application.yml
server: port: 443 ssl: enabled: true key-store: classpath:ssl/keystore.p12 key-store-password: yourpassword key-store-type: pkcs12 key-alias: tomcat protocol: tls enabled-protocols: tlsv1.2,tlsv1.3 ciphers: tls_aes_256_gcm_sha384,tls_chacha20_poly1305_sha256...
1.3 强制http跳转https(可选)
@configuration public class httpsconfig { @bean public servletwebserverfactory servletcontainer() { tomcatservletwebserverfactory tomcat = new tomcatservletwebserverfactory() { @override protected void postprocesscontext(context context) { securityconstraint securityconstraint = new securityconstraint(); securityconstraint.setuserconstraint("confidential"); securitycollection collection = new securitycollection(); collection.addpattern("/*"); securityconstraint.addcollection(collection); context.addconstraint(securityconstraint); } }; tomcat.addadditionaltomcatconnectors(redirectconnector()); return tomcat; } private connector redirectconnector() { connector connector = new connector("org.apache.coyote.http11.http11nioprotocol"); connector.setscheme("http"); connector.setport(8080); connector.setsecure(false); connector.setredirectport(443); return connector; } }
2. 高级安全配置
2.1 启用hsts
@configuration public class securityconfig extends websecurityconfigureradapter { @override protected void configure(httpsecurity http) throws exception { http .headers() .httpstricttransportsecurity() .includesubdomains(true) .maxageinseconds(31536000); // 1年 } }
2.2 证书自动续期(let’s encrypt)
@scheduled(cron = "0 0 3 * * ?") // 每天凌晨3点检查 public void renewcertificate() { try { process process = runtime.getruntime().exec("certbot renew --quiet"); int exitcode = process.waitfor(); if (exitcode == 0) { logger.info("证书续期成功"); // 重新加载证书 ((tomcatwebserver) webserver).gettomcat().getconnector().reload(); } } catch (exception e) { logger.error("证书续期失败", e); } }
四、https性能优化
1. 协议与算法选择
server: ssl: enabled-protocols: tlsv1.3 # 优先使用tls 1.3 ciphers: - tls_aes_256_gcm_sha384 # tls 1.3 - tls_chacha20_poly1305_sha256 # 移动设备优化 - tls_ecdhe_ecdsa_with_aes_256_gcm_sha384 - tls_ecdhe_rsa_with_aes_256_gcm_sha384
2. 会话恢复技术
@bean public webserverfactorycustomizer<tomcatservletwebserverfactory> tomcatcustomizer() { return factory -> factory.addconnectorcustomizers(connector -> { connector.setproperty("sslenabledprotocols", "tlsv1.2,tlsv1.3"); connector.setproperty("sslsessiontimeout", "3600"); // 1小时会话缓存 connector.setproperty("sslsessioncachesize", "20480"); // 缓存大小 }); }
3. ocsp stapling配置
# 生成ocsp响应文件 openssl ocsp -issuer chain.pem -cert server.crt \ -url http://ocsp.digicert.com -respout ocsp.der # nginx配置示例(spring boot需通过前置代理实现) ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /path/to/chain.pem;
五、常见问题排查
1. 证书链不完整
症状:浏览器显示"证书不受信任"
解决:确保包含中间证书
cat server.crt intermediate.crt > fullchain.crt
2. 混合内容警告
症状:https页面加载http资源
解决:
使用内容安全策略(csp)
<meta http-equiv="content-security-policy" content="upgrade-insecure-requests">
或使用协议相对url://example.com/resource.js
3. ssl握手失败
诊断命令:
openssl s_client -connect example.com:443 -servername example.com -tlsextdebug -showcerts
六、安全加固建议
禁用弱协议和算法
server: ssl: enabled-protocols: tlsv1.2,tlsv1.3 ciphers: "high:!anull:!enull:!export:!des:!rc4:!md5:!psk"
启用证书透明度(ct)
@bean public webserverfactorycustomizer<tomcatservletwebserverfactory> ctenforcer() { return factory -> factory.addcontextcustomizers(context -> { context.addparameter("certificatetransparency", "true"); }); }
定期轮换密钥
# 生成新密钥对 openssl ecparam -genkey -name prime256v1 -out newkey.pem
到此这篇关于在spring boot中实现https加密通信的文章就介绍到这了,更多相关springboot https加密通信内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论