HTTPS(Hyper Text Transfer Protocol Secure)是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护。
技术类型 | 作用 | 典型算法 |
---|---|---|
非对称加密 | 身份验证和密钥交换 | RSA、ECC、DH |
对称加密 | 加密实际传输数据 | AES、3DES、ChaCha20 |
哈希算法 | 保证数据完整性 | SHA-256、SHA-3 |
数字证书 | 验证服务器身份 | X.509标准 |
类型 | 验证级别 | 颁发速度 | 价格 | 适用场景 |
---|---|---|---|---|
DV证书 | 域名验证 | 分钟级 | 免费-低价 | 个人网站、测试环境 |
OV证书 | 组织验证 | 1-3天 | 中档 | 企业官网 |
EV证书 | 扩展验证 | 3-7天 | 高价 | 金融、电商等高安全需求 |
自签名证书 | 无第三方验证 | 即时 | 免费 | 内网、开发环境 |
# 使用OpenSSL生成
openssl req -x509 -newkey rsa:4096 -nodes \
-keyout server.key -out server.crt \
-days 365 -subj "/CN=yourdomain.com"
将证书(.crt或.pem)和私钥(.key)文件放入resources/ssl/
目录
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...
@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;
}
}
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.headers()
.httpStrictTransportSecurity()
.includeSubDomains(true)
.maxAgeInSeconds(31536000); // 1年
}
}
@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);
}
}
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
@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"); // 缓存大小
});
}
# 生成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;
症状:浏览器显示"证书不受信任"
解决:确保包含中间证书
cat server.crt intermediate.crt > fullchain.crt
症状:HTTPS页面加载HTTP资源
解决:
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
//example.com/resource.js
诊断命令:
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