SSL证书生成
生产环境是向证书供应商进行购买,在使用工具转换
我们着使用java自带的工具进行生成,可以使用keytool –help查看具体用法
jks证书(java专用)
1 2
| keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 3650 #生成证书 keytool -list -v -keystore keystore.jks # 查看生成的信息
|
PKCS12
1 2
| keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650 #生成证书 keytool -list -v -storetype pkcs12 -keystore keystore.p12 #查看生成的信息
|
生成证书都会要求你输入密码,注意,请记住这个密码,后面springboot配置要用到。
JKS迁移成PKCS12证书
1
| keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.p12 -deststoretype pkcs12
|
证书供应商提供的证书
1
| keytool -import -alias tomcat -file myCertificate.crt -keystore keystore.p12 -storepass password
|
Spring Boot 启用https
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #访问的端口 server.port=8443 #自定义配置用于开启http端口访问 http.port=8080
#默认就是true 不用配置 server.ssl.enabled=true #这用到生成证书时的密码 server.ssl.key-password=111111 #证书地址 如果是在jar里面 使用classpath:keystore.jks server.ssl.key-store=./keystore.jks #证书alias 别名 server.ssl.key-alias=tomcat #证书格式 还有 PKCS12 server.ssl.key-store-type=jks
|
启动服务器 访问https 的 8488端口 应该就能访问了
http重定向到https
spring boot 2.x 版本代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| import org.apache.catalina.Context; import org.apache.catalina.connector.Connector; import org.apache.tomcat.util.descriptor.web.SecurityCollection; import org.apache.tomcat.util.descriptor.web.SecurityConstraint; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.servlet.server.ServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;
@Configuration
public class ConnectorConfig {
@Bean public ServletWebServerFactory servletWebServerFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() { @Override protected void postProcessContext(Context context) { SecurityConstraint securityConstraint = new SecurityConstraint(); securityConstraint.setUserConstraint("CONFIDENTIAL"); SecurityCollection securityCollection = new SecurityCollection(); securityCollection.addPattern("/*"); securityConstraint.addCollection(securityCollection); context.addConstraint(securityConstraint); } }; factory.addAdditionalTomcatConnectors(httpConnector()); return factory; }
@Value("${server.port}") private int httpsPort;
@Value("${http.port}") private int httpPort = 8080;
@Bean public Connector httpConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(httpPort); connector.setSecure(false); connector.setRedirectPort(httpsPort); return connector; } }
|
访问8080端口 会自动跳转到 https 的端口
其他(非必要操作)
获取分发给客户端的证书
1
| keytool -export -keystore keystore.jks -alias tomcat -file myCertificate.crt
|
jdk导入证书 方便java程序访问https访问时进行证书的验证
1 2
| keytool -importcert -file myCertificate.crt -alias tomcat -keystore $JDK_HOME/jre/lib/security/cacerts
|
思考❓
浏览器怎么和证书进行关联?通过别名么? 别名设置成域名?