1. 证书生成
如果对 HTTPS 不太了解, 可以自行搜索资料, 这里重点不在说 https.
使用 SSL 需要我们先生成一个证书, 这个证书我们可以自己生成, 也可以从 SSL 证书授权中心获得, 自己生成的不被客户端认可, 从授权中心获得的可以被客户端认可, 提供 SSL 授权证书的服务商有很多, 小伙伴们有兴趣可以自行查找, 我这里以自己生成的证书为例.
生成方式也很简单, 直接使用 java 自带的命令 keytool 来生成, 生成命令如下:
-storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
这里涉及到几个参数的含义我简单说一下:
1.-storetype 指定密钥仓库类型
2.-keyalg 生证书的算法名称, RSA 是一种非对称加密算法
3.-keysize 证书大小
4.-keystore 生成的证书文件的存储路径
5.-validity 证书的有效期
执行完上面一行命令后, 按照提示进行操作, 创建完成后, 可在用户根目录查看生成的 keystore 文件.
2. 生成的 keystone 文件复制到我们 springboot 项目的根目录
生成证书后, 我们将 keystone 文件拷贝到我们项目的根目录下, 然后修改 application.properties 文件, 添加 HTTPS 支持. 在 application.properties 中添加如下代码:
- server.ssl.key-store=keystore.p12
- server.ssl.key-store-password=123456
- server.ssl.key-store-type=PKCS12
- server.ssl.key-alias=tomcat
第一行指定签名文件, 第二行指定签名密码, 第三行指定密钥仓库类型, 第四个是别名. OK, 这样配置完成之后我们就可以通过 HTTPS 来访问我们的 web 了.
3.HTTP 自动转向 HTTPS
光有 HTTPS 肯定还不够, 很多用户可能并不知道, 用户有可能继续使用 HTTP 来访问你的网站, 这个时候我们需要添加 HTTP 自动转向 HTTPS 的功能, 当用户使用 HTTP 来进行访问的时候自动转为 HTTPS 的方式. 这个配置很简单, 在入口类中添加相应的转向 Bean 就行了.
在 springboot1.x 这样配置
- @Bean
- public Connector connector(){Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
- connector.setScheme("http");
- connector.setPort(8080);
- connector.setSecure(false);
- connector.setRedirectPort(8033);
- return connector;
- }
- @Bean
- public EmbeddedServletContainerFactory servletContainer() {
- TomcatEmbeddedServletContainerFactory tomca t= new TomcatEmbeddedServletContainerFactory() {
- @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);
- }
- };
- tomcat.addAdditionalTomcatConnectors( connector ());
- return tomcat;
- }
这个时候当我们访问 http://localhost:8080 的时候系统会自动重定向到 https://localhost:8033 这个地址上.
首先 这里需要使用 EmbeddedServletContainerFactory 这个类, 但是在 springboot2.x 版本已经找不到这个类了. 但是在网上大部分还都是根据 1.x 来实现的, 这也是我为什么写这篇文章的初衷, 所以需要下边代码实现 springboot2.x 版本 HTTP 自动转向 HTTPS.
在 springboot2.x 这样配置
- @Bean
- public Connector connector(){
- Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
- connector.setScheme("http");
- connector.setPort(8080);
- connector.setSecure(false);
- connector.setRedirectPort(8033);
- return connector;
- }
- @Bean
- public TomcatServletWebServerFactory tomcatServletWebServerFactory(){
- 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(connector());
- return tomcat;
- }
到这, 我们在 springboot2.x 项目中, 当我们访问 http://localhost:8080 的时候系统会自动重定向到 https://localhost:8033 这个地址上.
区别就是 EmbeddedServletContainerFactory 换成了 TomcatServletWebServerFactory;
来源: http://www.jianshu.com/p/3a81277a053c