Home | 简体中文 | 繁体中文 | 杂文 | 知乎专栏 | Github | OSChina 博客 | 云社区 | 云栖社区 | Facebook | Linkedin | 视频教程 | 打赏(Donations) | About
知乎专栏多维度架构 微信号 netkiller-ebook | QQ群:128659835 请注明“读者”

2.8. Spring boot with HTTP2 SSL

2.8.1. 生成自签名证书

			
keytool -genkey -alias www.netkiller.cn -keyalg RSA -keystore /www/netkiller.cn/www.netkiller.cn.keystore
			
			

导入证书(Windows)

			
keytool -selfcert -alias www.netkiller.cn -keystore www.netkiller.cn.keystore
keytool -export -alias www.netkiller.cn -keystore www.netkiller.cn.keystore -storepass passw0rd -rfc -file www.netkiller.cn.cer
			
			

导入证书(JVM)

			
keytool -importcert -alias www.netkiller.cn -file www.netkiller.cn.cer -keystore /srv/java/jre/lib/security/cacerts
			
			

2.8.2. application.properties 配置文件

配置Tomcat HTTPS 端口 8443(由于JVM不能fork和setuid,所以无法向nginx,apache httpd 那样设置 80 端口,除非你使用root用户运行,但这样做是不安全的。)

			
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=/www/netkiller.cn/www.netkiller.cn.keystore
server.ssl.key-store-password=passw0rd
server.ssl.key-store-type=JKS
server.ssl.key-alias=www.netkiller.cn
			
			

keystore 文件可以放到 classpath 中,首先将证书文件放到 src/main/resources 目录中,然后配置 application.properties 如下:

				server.port=8443
				server.ssl.enabled=true
				server.ssl.key-store=classpath:www.netkiller.cn.keystore
				server.ssl.key-store-password=123456
				server.ssl.key-store-type=JKS
				server.ssl.key-alias=www.netkiller.cn
			

2.8.3. 启动 Spring boot

			
/srv/java/bin/java -server -Xms2048m -Xmx8192m -Djava.security.egd=file:/dev/./urandom -jar /www/netkiller.cn/www.netkiller.cn/www.netkiller.cn-0.0.1.war
			
			

2.8.4. restTemplate 调用实例

			
String url = "https://www.netkiller.cn:8443/public/test/version.json";
ResponseEntity<RestResponse<String>> result = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<RestResponse<String>>() {});
			
			

2.8.5. HTTP2

启用 HTTP2 必须使用 Tomcat 9 以上, Springboot 2.1

创建证书

			
keytool -genkey -alias localhost -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -dname "CN=localhost, OU=netkiller, O=netkiller.cn, L=Guangdong, ST=Shenzhen, C=CN"
			
			

配置启用 http2

			
server:
  port: 8443
  servlet:
    context-path: /
  ssl:
    enabled: true
    key-store: classpath:ssl/keystore.p12
    key-store-type: PKCS12
    key-store-password: 123456
  http2:
    enabled: true			
			
			

我的配置

			
spring.application.name=web
server.port=8443
#server.servlet.context-path=/
server.ssl.enabled: true
server.ssl.key-store: classpath:keystore.p12
server.ssl.key-store-type: PKCS12
server.ssl.key-store-password: 123456
server.http2.enabled: true
			
			

使用 curl 访问可以看到 HTTP/2 字样,表示成功

			
neo@MacBook-Pro ~ % curl -i -k https://localhost:8443/ping
HTTP/2 200 
content-type: text/plain;charset=UTF-8
content-length: 4
date: Tue, 09 Apr 2019 08:41:29 GMT

Pong%