# demo-ssl **Repository Path**: gitlicl/demo-ssl ## Basic Information - **Project Name**: demo-ssl - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-25 - **Last Updated**: 2025-11-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Boot HTTPS 自签名证书配置指南 > 🎯 **一站式解决方案**:从理论到实践,全面掌握Spring Boot HTTPS配置 ## 📋 目录导航 - [🚀 快速开始](#-快速开始) - [📚 证书基础知识](#-证书基础知识) - [🛠️ 证书生成与配置](#️-证书生成与配置) - [🔐 SSL Key Store详解](#-ssl-key-store详解) - [🔄 格式转换工具](#-格式转换工具) - [🚀 生产环境部署](#-生产环境部署) - [❓ 常见问题解答](#-常见问题解答) - [📖 参考资源](#-参考资源) --- ## 🚀 快速开始 ### 🎯 项目概述 这是一个配置了HTTPS自签名证书的Spring Boot应用,支持通过HTTPS协议访问HelloWorld接口。 ### ⚡ 快速启动 #### 1. 启动应用 ```bash # 使用Gradle构建并运行 ./gradlew bootRun # 或者先构建再运行 ./gradlew build java -jar build/libs/demo-0.0.1-SNAPSHOT.jar ``` #### 2. 访问接口 - **HTTPS访问**: https://localhost:8443/helloworld - **HTTP访问**: http://localhost:8080/helloworld (会自动重定向到HTTPS) #### 3. 浏览器警告处理 由于使用自签名证书,浏览器会显示"不安全"警告,这是正常的。点击"高级" → "继续访问"即可。 ### 📁 项目结构 ``` demo/ ├── src/main/java/com/example/demo/ │ ├── DemoApplication.java # 主启动类 │ ├── controller/ │ │ └── HelloWorldController.java # HelloWorld接口 │ └── config/ │ └── HttpsConfig.java # HTTPS配置类 ├── src/main/resources/ │ ├── application.properties # 应用配置 │ └── keystore/ │ ├── localhost+3.pem # 证书文件 │ └── localhost+3-key.pem # 私钥文件 ├── build.gradle # Gradle构建配置 └── README.md # 本文档 ``` --- ## 📚 证书基础知识 ### 🔐 证书可信的三个要素 ``` 🏛️ 信任三角模型 ┌─────────────────┐ │ 可信的CA机构 │ ← 必须是浏览器信任的权威机构 └─────────────────┘ ↓ 签发 ┌─────────────────┐ │ 地址匹配证书 │ ← 访问地址 = 证书认证地址 └─────────────────┘ ↓ 验证 ┌─────────────────┐ │ 证书在有效期内 │ ← 当前时间在有效期内 └─────────────────┘ ``` ### 🎯 为什么自签名证书会警告? ``` ❌ 自签名证书的信任链断裂 用户浏览器 ← ❌不信任❌ ← 自己签发 ← 网站证书 ✅ 正规证书的完整信任链 用户浏览器 ← ✅信任✅ ← 根CA ← 签发 ← 网站证书 ``` **核心原因**: 浏览器只信任预装的权威CA机构,自签名证书不在信任列表中! ### 🔐 SSL/TLS证书的核心功能 ``` 🔒 三大核心功能: ┌─────────────────┐ │ 🔐 加密通信 │ 保护数据传输安全,防止窃听 └─────────────────┘ ┌─────────────────┐ │ 🆔 身份验证 │ 确认网站真实性,防止钓鱼 └─────────────────┘ ┌─────────────────┐ │ 🤝 建立信任 │ 让用户放心访问和交易 └─────────────────┘ ``` ### 🔒 单向认证 vs 双向认证 #### 单向认证(当前项目配置) ``` 客户端 → 服务器:验证服务器证书 ✓ 服务器 ← 客户端:不验证客户端 ❌ 📋 配置要求: ┌─────────────────┐ │ server.ssl.certificate │ 服务器证书 └─────────────────┘ ┌─────────────────┐ │ server.ssl.certificate-private-key │ 服务器私钥 └─────────────────┘ 🎯 使用场景: • 普通网站(电商、新闻、博客) • 公共API服务 • 大多数Web应用 ✅ 优势: • 配置简单 • 客户端无需证书 • 用户体验好 ``` #### 双向认证(mTLS) ``` 客户端 → 服务器:验证服务器证书 ✓ 服务器 ← 客户端:验证客户端证书 ✓ 📋 配置要求: ┌─────────────────┐ │ server.ssl.certificate │ 服务器证书 └─────────────────┘ ┌─────────────────┐ │ server.ssl.certificate-private-key │ 服务器私钥 └─────────────────┘ ┌─────────────────┐ │ server.ssl.trust-certificate │ 信任的客户端证书 └─────────────────┘ ┌─────────────────┐ │ server.ssl.client-auth=need │ 要求客户端证书 └─────────────────┘ 🎯 使用场景: • 银行系统 • 企业内部API • 政府机构系统 • 高安全要求的微服务 ✅ 优势: • 双向身份验证 • 零信任架构 • 防止未授权访问 ❌ 劣势: • 配置复杂 • 客户端需要证书 • 维护成本高 ``` #### 配置对比示例 ```properties # 单向认证(当前配置) server.ssl.certificate=classpath:keystore/localhost+4.pem server.ssl.certificate-private-key=classpath:keystore/localhost+4-key.pem # server.ssl.trust-certificate=classpath:keystore/localhost+4.pem # 注释掉 # 双向认证(需要额外配置) server.ssl.certificate=classpath:keystore/localhost+4.pem server.ssl.certificate-private-key=classpath:keystore/localhost+4-key.pem server.ssl.trust-certificate=classpath:keystore/trusted-clients.pem # 必需 server.ssl.client-auth=need # 强制要求客户端证书 ``` ### 📁 证书文件格式详解 #### 1. PKCS12 (.p12/.pfx) - Java应用首选 ``` 📦 tomcat.p12 (一个文件包含所有内容) ├── 🔑 私钥 (相当于 .key 文件) ├── 📜 证书 (相当于 .crt 文件) └── 🏛️ CA证书链 (可选) ✅ 优势: • 单文件管理,配置简单 • Java原生支持 • 密码保护,安全性高 ``` #### 2. PEM格式 - Nginx/Apache常用 (本项目使用) ``` 📂 PEM文件结构 (分离式设计) ├── 📜 localhost+3.pem # 证书文件 (公钥) ├── 🔑 localhost+3-key.pem # 私钥文件 └── 🏛️ ca.crt # CA根证书文件 (可选) 🔍 文件内容解析: ┌─────────────────────────────┐ │ 📜 localhost+3.pem │ │ -----BEGIN CERTIFICATE----- │ │ MIIEdzCCAt+gAwIBAgIRAKL5... │ │ -----END CERTIFICATE----- │ │ 包含:公钥 + 证书信息 + CA签名 │ └─────────────────────────────┘ ┌─────────────────────────────┐ │ 🔑 localhost+3-key.pem │ │ -----BEGIN PRIVATE KEY----- │ │ MIIEvQIBADANBgkqhkiG9w0... │ │ -----END PRIVATE KEY----- │ │ 包含:私钥 (必须严格保密) │ └─────────────────────────────┘ ``` **🎯 PEM格式优势**: - ✅ 文本格式,可读性强,便于检查 - ✅ 分离设计,安全性更高 - ✅ Linux/Unix系统广泛支持 - ✅ 便于证书管理和更新 - ❌ 需要管理多个文件 #### 3. JKS格式 - Java传统格式 ``` 📦 keystore.jks (Java专用容器) ├── 🔑 私钥 ├── 📜 证书 └── 🏛️ 证书链 ``` **特点**: - ✅ Java专用格式,兼容性好 - ❌ 不如PKCS12通用 - ❌ 配置相对复杂 - ❌ 工具支持较少 ### 🏗️ 证书文件命名规则详解 #### 📋 常见命名模式对比 | 命名方式 | 证书文件 | 私钥文件 | 使用场景 | 优点 | 缺点 | |---------|---------|---------|---------|------|------| | **🎯 当前项目** | `localhost+3.pem` | `localhost+3-key.pem` | mkcert工具生成 | ✅ 关联清晰 | ❌ 文件名较长 | | **🔧 传统方式** | `certificate.pem` | `private-key.pem` | 手动配置 | ✅ 语义明确 | ❌ 关联不明显 | | **🌐 Web服务器** | `yourdomain.crt` | `yourdomain.key` | Nginx/Apache | ✅ 类型明确 | ❌ 需要记住扩展名 | | **☕ Java方式** | `keystore.p12` | (包含在p12中) | Spring Boot | ✅ 单文件管理 | ❌ 不易查看内容 | #### 🔍 本项目文件命名解析 ``` 📁 localhost+3.pem ├── localhost: 基础域名 ├── +3: 支持3个域名 │ ├── localhost │ ├── 127.0.0.1 │ └── ::1 (IPv6) └── .pem: 文件格式标识 📁 localhost+3-key.pem ├── localhost+3: 与证书关联 ├── -key: 明确标识私钥文件 └── .pem: 文件格式标识 ``` #### 🎨 命名最佳实践 ```bash # 开发环境推荐 (当前使用) localhost+3.pem # 证书 localhost+3-key.pem # 私钥 # 生产环境推荐 yourdomain.com.crt # 证书 yourdomain.com.key # 私钥 yourdomain.com.ca-bundle # CA证书链 # 微服务环境推荐 service-a-cert.pem # 服务A证书 service-a-key.pem # 服务A私钥 ``` ### 🏗️ 证书生态系统关系图 ``` 🌐 完整证书信任链 ┌─────────────────┐ │ 🏛️ 根CA证书 │ ← 浏览器预信任的权威机构 │ (如:GlobalSign) │ └─────────────────┘ ↓ 签发 ┌─────────────────┐ │ 📋 中间CA证书 │ ← 根CA授权的中间机构 │ (如:DigiCert) │ └─────────────────┘ ↓ 签发 ┌─────────────────┐ │ 🖥️ 服务器证书 │ ← 你的网站证书 │ (localhost+3) │ └─────────────────┘ ↓ 配对 ┌─────────────────┐ │ 🔑 私钥文件 │ ← 与证书配对的私钥 │ (localhost+3-key)│ └─────────────────┘ 🔒 安全原则: • 证书可以公开分享 • 私钥必须严格保密 • 证书链必须完整 ``` --- ## 🛠️ 证书生成与配置 ### 🔧 证书生成工具详解 #### 方法1: 使用mkcert (推荐开发环境) **🎯 优势**: 自动处理CA信任,支持多域名,配置简单 ```bash # 1. 安装mkcert # Windows: choco install mkcert # macOS: brew install mkcert # Linux: sudo apt install mkcert # 2. 创建本地CA mkcert -install # 3. 查看CA根目录 mkcert -CAROOT # 4. 生成证书 (支持多域名) mkcert localhost 127.0.0.1 ::1 # 生成文件: # localhost+3.pem # 证书 # localhost+3-key.pem # 私钥 ``` #### 方法2: 使用OpenSSL (灵活配置) ```bash # 1. 生成私钥 openssl genrsa -out localhost-key.pem 2048 # 2. 生成证书签名请求 openssl req -new -key localhost-key.pem -out localhost.csr -subj "/CN=localhost" # 3. 创建SAN配置文件 cat > san.conf << EOF [v3_req] subjectAltName = @alt_names [alt_names] DNS.1 = localhost IP.1 = 127.0.0.1 IP.2 = ::1 EOF # 4. 生成自签名证书 openssl x509 -req -days 3650 -in localhost.csr -signkey localhost-key.pem \ -out localhost.pem -extensions v3_req -extfile san.conf ``` #### 方法3: 使用keytool (Java生态) ```bash # 生成PKCS12格式证书 keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 \ -storetype PKCS12 -keystore tomcat.p12 -validity 3650 \ -dname CN=localhost -keypass changeit -storepass changeit # 生成JKS格式证书 keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 \ -storetype JKS -keystore tomcat.jks -validity 3650 \ -dname CN=localhost -keypass changeit -storepass changeit ``` ### ⚙️ Spring Boot配置详解 #### PEM格式配置 (当前项目使用) ```properties # HTTPS配置 - PEM格式 server.port=8443 server.ssl.enabled=true server.ssl.certificate=classpath:keystore/localhost+3.pem server.ssl.certificate-private-key=classpath:keystore/localhost+3-key.pem server.ssl.trust-certificate=classpath:keystore/localhost+3.pem ``` #### PKCS12格式配置 ```properties # HTTPS配置 - PKCS12格式 server.port=8443 server.ssl.enabled=true server.ssl.key-store=classpath:keystore/tomcat.p12 server.ssl.key-store-type=PKCS12 server.ssl.key-store-password=changeit server.ssl.key-alias=tomcat ``` #### JKS格式配置 ```properties # HTTPS配置 - JKS格式 server.port=8443 server.ssl.enabled=true server.ssl.key-store=classpath:keystore/tomcat.jks server.ssl.key-store-type=JKS server.ssl.key-store-password=changeit server.ssl.key-alias=tomcat ``` ### 🎯 格式选择建议 | 使用场景 | 推荐格式 | 原因 | 配置复杂度 | |---------|---------|------|-----------| | **🔧 开发环境** | PEM | 便于调试,文本格式 | ⭐⭐ | | **☕ Spring Boot应用** | PKCS12 | Java原生支持,单文件 | ⭐ | | **🌐 Web服务器** | PEM | 标准格式,兼容性好 | ⭐⭐ | | **🏢 企业内部** | JKS | Java生态兼容 | ⭐⭐ | | **🔒 高安全要求** | JCEKS | 强加密,硬件支持 | ⭐⭐⭐⭐ | --- ## 🔐 SSL Key Store详解 ### 📋 支持的 Key Store 类型 | 类型 | 扩展名 | 描述 | Java支持 | 使用场景 | |------|--------|------|----------|----------| | **PKCS12** | `.p12`, `.pfx` | RSA公钥加密标准 | ✅ 原生支持 | 🔥 **推荐** - 跨平台通用 | | **JKS** | `.jks` | Java Key Store | ✅ 原生支持 | ☕ Java传统格式 | | **JCEKS** | `.jceks` | Java Cryptography Extension | ✅ 原生支持 | 🔐 高级加密需求 | | **PKCS11** | 硬件设备 | 硬件安全模块 | ✅ 需要驱动 | 🏭 企业级安全 | | **PEM** | `.pem`, `.crt`, `.key` | 隐式支持 | ⚠️ 需要配置 | 🌐 Web服务器常用 | ### 🎯 各类型详细说明 #### 1. **PKCS12** (推荐) ```properties server.ssl.key-store-type=PKCS12 server.ssl.key-store=classpath:keystore/cert.p12 server.ssl.key-store-password=changeit ``` **特点**: - ✅ 国际标准,跨平台兼容 - ✅ 支持私钥、证书链、CA证书 - ✅ 密码保护,安全性高 - ✅ 单文件管理,部署简单 #### 2. **JKS** (Java传统) ```properties server.ssl.key-store-type=JKS server.ssl.key-store=classpath:keystore/cert.jks server.ssl.key-store-password=changeit ``` **特点**: - ✅ Java原生支持 - ❌ 仅限Java环境 - ❌ 安全性相对较低 - ⚠️ 逐渐被PKCS12取代 #### 3. **JCEKS** (高级加密) ```properties server.ssl.key-store-type=JCEKS server.ssl.key-store=classpath:keystore/cert.jceks server.ssl.key-store-password=changeit ``` **特点**: - ✅ 更强的加密算法 - ✅ 支持密钥存储加密 - ❌ 配置复杂 - 🔧 适合高安全要求场景 #### 4. **PEM** (分离式配置) ```properties # PEM不需要指定key-store-type,直接配置文件路径 server.ssl.certificate=classpath:keystore/cert.pem server.ssl.certificate-private-key=classpath:keystore/private.key server.ssl.trust-certificate=classpath:keystore/ca.crt ``` **特点**: - ✅ 文本格式,便于查看 - ✅ 分离管理,安全性高 - ✅ Nginx/Apache兼容 - ❌ 需要管理多个文件 ### 🎯 选择建议流程图 ``` 🚀 开始选择Key Store类型 ↓ 是否需要与其他系统集成? ↓ 是 🌐 使用 PEM 格式 ↓ 否 是否纯Java环境? ↓ 是 🔒 使用 PKCS12 格式 (推荐) ↓ 否 🔄 考虑使用 PKCS12 (通用性更好) ``` ### ⚠️ 配置注意事项 #### 1. **密码配置** ```properties # 不同类型的密码配置 server.ssl.key-store-password=changeit # KeyStore密码 server.ssl.key-password=changeit # 私钥密码 (JKS/PKCS12) server.ssl.trust-store-password=changeit # TrustStore密码 ``` #### 2. **别名配置** ```properties # JKS/PKCS12 需要指定别名 server.ssl.key-alias=tomcat # PEM 不需要别名,直接指定文件路径 ``` #### 3. **兼容性考虑** - **PKCS12**: Java 9+ 默认支持 - **JKS**: 所有Java版本支持 - **PEM**: Spring Boot 2.1+ 原生支持 #### 4. **性能对比** ``` 🏃 性能排序 (从快到慢): PKCS12 > JKS > PEM > JCEKS ``` ### 🔍 验证和测试工具 #### 检查KeyStore内容 ```bash # 查看PKCS12内容 keytool -list -v -keystore cert.p12 -storetype PKCS12 # 查看JKS内容 keytool -list -v -keystore cert.jks -storetype JKS # 查看PEM证书信息 openssl x509 -in cert.pem -text -noout ``` #### 测试SSL连接 ```bash # 测试HTTPS连接 openssl s_client -connect localhost:8443 -servername localhost # 查看证书详情 curl -v --insecure https://localhost:8443 # 使用Java测试 keytool -printcert -sslserver localhost:8443 ``` --- ## 🔄 格式转换工具 ### PKCS12 ↔ PEM 转换 #### PKCS12 转 PEM ```bash # 提取私钥 openssl pkcs12 -in cert.p12 -nocerts -out private.key -nodes # 提取证书 openssl pkcs12 -in cert.p12 -nokeys -out certificate.crt # 一步转换 (包含私钥和证书) openssl pkcs12 -in cert.p12 -out cert.pem -nodes ``` #### PEM 转 PKCS12 ```bash openssl pkcs12 -export -in certificate.crt -inkey private.key \ -out cert.p12 -name tomcat -password pass:changeit ``` ### JKS ↔ PKCS12 转换 #### JKS 转 PKCS12 ```bash keytool -importkeystore -srckeystore cert.jks -destkeystore cert.p12 \ -deststoretype PKCS12 -srcalias tomcat -destalias tomcat ``` #### PKCS12 转 JKS ```bash keytool -importkeystore -srckeystore cert.p12 -destkeystore cert.jks \ -deststoretype JKS -srcalias tomcat -destalias tomcat ``` ### 🔧 实用转换脚本 #### 批量转换脚本 ```bash #!/bin/bash # convert_cert.sh - 证书格式转换脚本 # PKCS12 转 PEM p12_to_pem() { local input=$1 local output=${2:-${input%.*}.pem} openssl pkcs12 -in "$input" -out "$output" -nodes echo "转换完成: $input -> $output" } # PEM 转 PKCS12 pem_to_p12() { local cert=$1 local key=$2 local output=${3:-cert.p12} openssl pkcs12 -export -in "$cert" -inkey "$key" -out "$output" echo "转换完成: $cert + $key -> $output" } # 使用示例 # p12_to_pem tomcat.p12 # pem_to_p12 certificate.crt private.key tomcat.p12 ``` --- ## 🚀 生产环境部署 ### 1. 使用正规CA证书 #### 免费CA证书选项 ```bash # 推荐的免费CA - Let's Encrypt (免费,自动化) - Cloudflare SSL (免费) - 阿里云/腾讯云SSL证书 (免费版) - ZeroSSL (免费) ``` #### Let's Encrypt自动化部署 ```bash # 使用Certbot获取证书 sudo apt install certbot sudo certbot certonly --standalone -d yourdomain.com # 证书位置 # /etc/letsencrypt/live/yourdomain.com/fullchain.pem # /etc/letsencrypt/live/yourdomain.com/privkey.pem ``` ### 2. 生产环境安全配置 #### 高级SSL配置 ```properties # 生产环境安全配置 server.port=443 server.ssl.enabled=true server.ssl.key-store=classpath:keystore/production.p12 server.ssl.key-store-type=PKCS12 server.ssl.key-store-password=${SSL_PASSWORD} server.ssl.key-alias=${SSL_ALIAS} # 启用强加密协议 server.ssl.enabled-protocols=TLSv1.2,TLSv1.3 # 配置强加密套件 server.ssl.cipher-suites=\ TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,\ TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,\ TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 # 启用HSTS (HTTP Strict Transport Security) server.ssl.hsts=MAX-AGE=31536000; INCLUDE_SUBDOMAINS # 双向认证 (可选) server.ssl.client-auth=need server.ssl.trust-store=classpath:keystore/truststore.p12 server.ssl.trust-store-password=${TRUSTSTORE_PASSWORD} ``` #### HTTP重定向配置 ```java @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(80); connector.setSecure(false); connector.setRedirectPort(443); return connector; } } ``` ### 3. 证书管理最佳实践 #### 证书生命周期管理 ```bash # 证书管理检查清单 ✅ 定期更新证书 (设置提醒) ✅ 安全存储私钥文件 ✅ 建立证书管理流程 ✅ 自动化证书续期 ✅ 监控证书过期时间 ✅ 备份证书和私钥 ``` #### 自动化续期脚本 ```bash #!/bin/bash # cert_renewal.sh - 证书自动续期脚本 DOMAIN="yourdomain.com" EMAIL="admin@yourdomain.com" DAYS_BEFORE_EXPIRY=30 # 检查证书过期时间 check_expiry() { local cert_file="/etc/letsencrypt/live/$DOMAIN/fullchain.pem" local expiry_date=$(openssl x509 -in "$cert_file" -noout -enddate | cut -d= -f2) local expiry_timestamp=$(date -d "$expiry_date" +%s) local current_timestamp=$(date +%s) local days_until_expiry=$(( (expiry_timestamp - current_timestamp) / 86400 )) if [ $days_until_expiry -le $DAYS_BEFORE_EXPIRY ]; then echo "证书将在 $days_until_expiry 天后过期,开始续期..." renew_certificate else echo "证书有效期充足,还有 $days_until_expiry 天" fi } # 续期证书 renew_certificate() { certbot renew --quiet systemctl reload nginx echo "证书续期完成" } # 执行检查 check_expiry ``` --- ## ❓ 常见问题解答 ### Q1: 浏览器显示"不安全"怎么办? **A**: 这是正常的,自签名证书不被浏览器信任。 **解决方案**: - 开发环境:点击"高级" → "继续访问" - 生产环境:购买正规CA证书 - 企业环境:将企业CA证书添加到浏览器信任列表 ### Q2: 如何修改证书密码? **A**: 使用keytool命令修改: ```bash # 修改KeyStore密码 keytool -storepasswd -new newpassword -keystore cert.p12 -storepass oldpassword # 修改私钥密码 keytool -keypasswd -alias tomcat -new newpassword -keystore cert.p12 -keypass oldpassword ``` ### Q3: 证书过期了怎么办? **A**: 重新生成证书或延长有效期: ```bash # 重新生成证书 keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 \ -storetype PKCS12 -keystore new_cert.p12 -validity 3650 \ -dname CN=localhost -keypass changeit -storepass changeit # 延长现有证书有效期 (仅适用于自签名) keytool -selfcert -alias tomcat -validity 3650 -keystore cert.p12 ``` ### Q4: 如何配置多个域名? **A**: 生成时使用subject alternative names (SAN): **🔧 使用keytool**: ```bash keytool -genkeypair -alias tomcat -ext SAN=dns:localhost,dns:127.0.0.1,dns:example.com \ -keystore cert.p12 -validity 3650 -dname CN=localhost ``` **🛠️ 使用OpenSSL**: ```bash # 创建配置文件 cat > san.conf << EOF [v3_req] subjectAltName = @alt_names [alt_names] DNS.1 = localhost DNS.2 = 127.0.0.1 DNS.3 = example.com IP.1 = 192.168.1.100 EOF # 生成证书 openssl x509 -req -days 3650 -in localhost.csr -signkey localhost-key.pem \ -out localhost.pem -extensions v3_req -extfile san.conf ``` **🎯 使用mkcert (最简单)**: ```bash # 自动支持多个域名 mkcert localhost 127.0.0.1 ::1 example.com ``` ### Q5: PEM文件中的内容是什么意思? **A**: PEM文件包含Base64编码的证书信息: ``` 📜 证书文件结构: -----BEGIN CERTIFICATE----- MIIEdzCCAt+gAwIBAgIRAKL5PPCgPZTw7m41z2w7Ju4wDQYJKoZIhvcNAQELBQAw gZExHjAcBgNVBAoTFW1rY2VydCBkZXZlbG9wbWVudCBDQTEzMDEGA1UECwwqTEFQ ... (Base64编码的证书数据) ... BH8AAAGHEAAAAAAAAAAAAAAAAAAAAAGHBMCoH6kwDQYJKoZIhvcNAQELBQAD -----END CERTIFICATE----- 🔑 私钥文件结构: -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDHygkxWhUC+u1H ... (Base64编码的私钥数据) ... KlA2e6n3evJI62WVjtaU1v4= -----END PRIVATE KEY----- ``` **🔍 解码查看证书信息**: ```bash # 查看证书详细信息 openssl x509 -in localhost+3.pem -text -noout # 查看证书有效期 openssl x509 -in localhost+3.pem -noout -dates # 查看证书主题 openssl x509 -in localhost+3.pem -noout -subject # 查看证书序列号 openssl x509 -in localhost+3.pem -noout -serial ``` ### Q6: Spring Boot启动时SSL配置错误怎么办? **A**: 常见错误及解决方案: **错误1: Cannot find certificate file** ```properties # 检查文件路径是否正确 server.ssl.certificate=classpath:keystore/localhost+3.pem # ✅ 正确 server.ssl.certificate=file:/path/to/cert.pem # ✅ 绝对路径 server.ssl.certificate=keystore/cert.pem # ❌ 相对路径可能有问题 ``` **错误2: Invalid password** ```bash # 验证密码是否正确 keytool -list -keystore cert.p12 -storepass yourpassword ``` **错误3: Invalid alias** ```bash # 查看正确的别名 keytool -list -keystore cert.p12 -v | grep "Alias name" ``` ### Q7: 如何在Docker中配置HTTPS? **A**: Docker容器中的HTTPS配置: ```dockerfile # Dockerfile FROM openjdk:17-jre-slim COPY target/demo-0.0.1-SNAPSHOT.jar app.jar COPY src/main/resources/keystore /app/keystore EXPOSE 8443 ENTRYPOINT ["java", "-jar", "/app/app.jar"] ``` ```yaml # docker-compose.yml version: '3.8' services: app: build: . ports: - "8443:8443" environment: - SERVER_SSL_KEY_STORE_PASSWORD=changeit - SERVER_SSL_KEY_ALIAS=tomcat volumes: - ./keystore:/app/keystore:ro ``` --- ## 📖 参考资源 ### 📚 官方文档 - [Spring Boot SSL配置官方文档](https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties.server.ssl) - [OpenSSL官方文档](https://www.openssl.org/docs/) - [Java KeyTool文档](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html) ### 🌐 免费证书服务 - [Let's Encrypt免费证书](https://letsencrypt.org/) - [Cloudflare SSL](https://www.cloudflare.com/ssl/) - [ZeroSSL](https://zerossl.com/) ### 🛠️ 实用工具 - [mkcert - 本地开发证书工具](https://github.com/FiloSottile/mkcert) - [SSL Labs SSL Test - 证书安全检测](https://www.ssllabs.com/ssltest/) - [Online Certificate Decoder - 在线证书解码器](https://www.sslshopper.com/certificate-decoder.html) ### 📖 学习资源 - [SSL/TLS协议详解](https://github.com/chenyukang/ssl-tls) - [SSL/TLS协议详解](https://www.ibm.com/docs/zh/was/8.5.5?topic=communications-secure-using-ssl) - [Spring Security官方指南](https://spring.io/guides/gs/securing-web/) - [HTTPS最佳实践指南](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Transport_Layer_Protection_Cheat_Sheet.md) - [mkcert 使用](https://cloud.tencent.com/developer/article/2191830) - [SSL/TLS协议详解](https://github.com/chenyukang/ssl-tls) --- ## 🎉 总结 现在你已经掌握了Spring Boot HTTPS配置的完整知识体系: ✅ **理论基础**: 理解SSL/TLS证书的工作原理和信任机制 ✅ **实践技能**: 掌握多种证书生成和配置方法 ✅ **格式精通**: 熟悉PKCS12、PEM、JKS等格式的使用 ✅ **生产部署**: 了解企业级HTTPS配置和最佳实践 ✅ **问题解决**: 具备常见SSL问题的排查和解决能力 🚀 **开始你的HTTPS之旅吧!** --- > 💡 **提示**: 如果遇到问题,请参考常见问题解答部分,或查看官方文档获取最新信息。