您的位置:首页 > 理论基础 > 计算机网络

Springboot配置https访问

2017-09-21 17:00 411 查看

1. 购买或本地生成ssl证书

要使用https,首先需要ssl证书,获取SSL证书有两种方式:

自己通过keytool生成

通过证书授权机构购买

作为演示,我们使用keytool生成:

C:\Users\xxx>keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]:  xxx
您的组织单位名称是什么?
[Unknown]:  xxx
您的组织名称是什么?
[Unknown]:  xxx
您所在的城市或区域名称是什么?
[Unknown]:  beijing
您所在的省/市/自治区名称是什么?
[Unknown]:  beijing
该单位的双字母国家/地区代码是什么?
[Unknown]:  china
CN=xxx, OU=xxx, O=xxx, L=beijing, ST=beijing, C=china是否正确?
[否]:  y


会在当前目录下生成一个证书:keystore.p12,同时记住你在生成证书时候输入的密钥库口令。

2. 创建一个Springboot项目

我习惯使用maven创建,在pom.xml中引入:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>


在src/main/java下创建一个包,如果不创建包,直接在src/main/java建立项目,那么spring扫描不到,会导致项目无法启动。



3. Https相关配置

application.properties

server.port: 7443
server.ssl.key-store: classpath:keystore.p12
server.ssl.key-store-password: 生成证书时候输入的密钥库口令
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat


App.java

package cn.ac.iie;

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.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class App {

/**
* Spring application main function
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
SpringApplication.run(App.class, args);
}

/**
* 配置一个TomcatEmbeddedServletContainerFactory bean
* @return
*/
@Bean
public EmbeddedServletContainerFactory servletContainer() {

TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {

@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(initiateHttpConnector());
return tomcat;
}

/**
* 让我们的应用支持HTTP是个好想法,但是需要重定向到HTTPS,
* 但是不能同时在application.properties中同时配置两个connector,
* 所以要以编程的方式配置HTTP connector,然后重定向到HTTPS connector
* @return Connector
*/
private Connector initiateHttpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080); // http端口
connector.setSecure(false);
connector.setRedirectPort(7443); // application.properties中配置的https端口
return connector;
}
}


3. 测试

编写测试类:

package cn.ac.iie.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController {
@RequestMapping("/")
@ResponseBody
String home() {
return "Hello World!";
}
}


浏览器访问测试成功,但是因为是自己生产的证书,所以在chrome中显示连接不安全。忽略即可。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: