好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Spring Boot实现Undertow服务器同时支持HTTP2、HTTPS的方法

前言

如今,企业级应用程序的高性能安全加密的常见场景是同时支持http和https两种协议,这篇文章考虑如何让spring boot应用程序同时支持http和https两种协议。spring boot的web容器已经有容器可以支持http2了,这个例子中选择了undertow高性能服务器作为spring boot的web容器。

what-什么是http2

http2是http协议自1999年http1.1发布后的首个更新,主要基于spdy协议。由互联网工程任务组(ietf)的 hypertext transfer protocol bis(httpbis)工作小组进行开发。该组织于2014年12月将http/2标准提议递交至iesg进行讨论,于2015年2月17日被批准。http2标准于2015年5月以rfc7540正式发表。

why-为什么要用http2

http2是第二代的http协议,关于http2的优点这里就不阐述了,可以参考下面链接文章了解:http://ju.outofmemory.cn/entr...。

下图是akamai 公司建立的一个官方的演示,主要用来说明在性能上http/1.1和http/2在性能升的差别。同时请求 379 张图片,http/1.1加载用时4.54s,http/2加载用时1.47s,大家可以通过 https://http2.akamai测试数据/demo 来感受下http2的提速。

what-什么是https

要说https我们得先说ssl(secure sockets layer,安全套接层),这是一种为网络通信提供安全及数据完整性的一种安全协议,ssl在网络传输层对网络连接进行加密。ssl协议可以分为两层:ssl记录协议(ssl record protocol),它建立在可靠的传输协议如tcp之上,为高层协议提供数据封装、压缩、加密等基本功能支持;ssl握手协议(ssl handshake protocol),它建立在ssl记录协议之上,用于在实际数据传输开始之前,通信双方进行身份认证、协商加密算法、交换加密密钥等。在web开发中,我们是通过https来实现ssl的。https是以安全为目标的http通道,简单来说就是http的安全版,即在http下加入ssl层,所以说https的安全基础是ssl,不过这里有一个地方需要小伙伴们注意,就是我们现在市场上使用的都是tls协议(transport layer security,它来源于ssl),而不是ssl,由于ssl出现较早并且被各大浏览器支持因此成为了https的代名词。

why-为什么要用https

超文本传输协议http协议被用于在web浏览器和网站服务器之间传递信息。http协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此http协议不适合传输一些敏感信息,比如信用卡号、密码等。

为了解决http协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议https。为了数据传输的安全,https在http的基础上加入了ssl协议,ssl依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

https和http的区别主要为以下四点:

一、https协议需要到ca申请证书,一般免费证书很少,需要交费。

二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

四、http的连接很简单,是无状态的;https协议是由ssl+http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

how-如何使用https和http

如果你使用spring boot,并且想在内嵌服务器中添加https,需要如下步骤:

要有一个ssl证书,买的或者自己生成的。

在spring boot中启动https。

将http重定向到https(可选)。

一.通过云平台获取ssl证书

证书获取有两种方式,一种是自己通过jdk的keytool命令生成,一种是通过证书授权机构购买,本文为了方便采用第二种从阿里云购买证书。

去阿里云购买证书(免费版),并提交审核资料

下载ssl证书

在证书目录下执行阿里云提供的命令,密码都填 pfx-password.txt 中的内容(三次),会生成 javalsj.jks 文件。

 

复制代码 代码如下:

keytool -importkeystore -srckeystore 214533136960974.pfx -destkeystore javalsj.jks -srcstoretype pkcs12 -deststoretype jks

 

二.通过jdk自带的keytool工具进行生成

生成证书(在要生成证书的目录下,按着 shit 建同时鼠标右键出现[在此处打开命令窗口])

 

复制代码 代码如下:

keytool -genkey -alias test -keyalg rsa -keysize 1024 -keystore charleslai -validity 365

 

利用"keytool -list -v -keystore charleslai.jks"查看jks中生成的证书的详细信息

利用[keytool -alias test -exportcert -keystore test.jks -file charleslai.cer],导出证书,并可以双击打开证书查看证书信息

在spring boot中启动https和http2

将charleslai.jks复制到spring boot应用的resources目录下

在application.properties中配置证书及端口,密码填写第3步中的密码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

##################################---undertow服务器支持https服务---##############################################

 

server.http2.enabled= true

 

server.servlet.context-path=/blog

 

custom.server.http.port= 8080

 

server.port= 8443

 

server.ssl.key-store=classpath:javalsj.jks

 

server.ssl.key-store-password= 214533136960974

 

server.undertow.worker-threads= 20

 

server.undertow.buffer-size= 512

 

server.undertow.io-threads= 2

此配置会使undertow容器监听8443端口,那么只有在域名前添加 https://才能访问网站内容,添加http://则不行,所以需要让undertow容器监听8080端口,并将8080端口的所有请求重定向到8443端口,即完成http到https的跳转。

将http重定向到https(可选)

工程使用gradle集成轻量级高性能非阻塞服务器undertow所需要的jar包:

compile group: 'org.springframework.boot', name: 'spring-boot-starter-undertow'

然后编写代码如下:

?

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

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

package com.javalsj.blog.configuration;

 

import org.springframework.beans.factory.annotation.value;

 

import org.springframework.boot.web.embedded.undertow.undertowservletwebserverfactory;

 

import org.springframework.boot.web.servlet.server.servletwebserverfactory;

 

import org.springframework.context.annotation.bean;

 

import org.springframework.context.annotation.configuration;

 

import io.undertow.undertow;

 

import io.undertow.servlet.api.securityconstraint;

 

import io.undertow.servlet.api.securityinfo;

 

import io.undertow.servlet.api.transportguaranteetype;

 

import io.undertow.servlet.api.webresourcecollection;

 

/**

 

* @description 采用undertow作为服务器,支持https服务配置

 

* @author wangjihong

 

* @date 2018年3月7日 下午8:34:18

 

* @copyright 版权所有 (c) HdhCmsTestjavalsj测试数据

 

* @memo 备注信息

 

*/

 

@configuration

 

public class webserverconfiguration {

 

/**

 

* http服务端口

 

*/

 

@value ( "${custom.server.http.port}" )

 

private integer httpport;

 

/**

 

* https服务端口

 

*/

 

@value ( "${server.port}" )

 

private integer httpsport;

 

/**

 

* 采用undertow作为服务器。

 

* undertow是一个用java编写的、灵活的、高性能的web服务器,提供基于nio的阻塞和非阻塞api,特点:

 

* 非常轻量级,undertow核心瓶子在1mb以下。它在运行时也是轻量级的,有一个简单的嵌入式服务器使用少于4mb的堆空间。

 

* 支持http升级,允许多个协议通过http端口进行多路复用。

 

* 提供对web套接字的全面支持,包括jsr-356支持。

 

* 提供对servlet 3.1的支持,包括对嵌入式servlet的支持。还可以在同一部署中混合servlet和本机undertow非阻塞处理程序。

 

* 可以嵌入在应用程序中或独立运行,只需几行代码。

 

* 通过将处理程序链接在一起来配置undertow服务器。它可以对各种功能进行配置,方便灵活。

 

*/

 

@bean

 

public servletwebserverfactory undertowfactory() {

 

undertowservletwebserverfactory undertowfactory = new undertowservletwebserverfactory();

 

undertowfactory.addbuildercustomizers((undertow.builder builder) -> {

 

builder.addhttplistener(httpport, "0.0.0.0" );

 

// 开启http2

 

builder.setserveroption(undertowoptions.enable_http2, true );

 

});

 

undertowfactory.adddeploymentinfocustomizers(deploymentinfo -> {

 

// 开启http自动跳转至https

 

deploymentinfo.addsecurityconstraint( new securityconstraint()

 

.addwebresourcecollection( new webresourcecollection().addurlpattern( "/*" ))

 

.settransportguaranteetype(transportguaranteetype.confidential)

 

.setemptyrolesemantic(securityinfo.emptyrolesemantic.permit))

 

.setconfidentialportmanager(exchange -> httpsport);

 

});

 

return undertowfactory;

 

}

 

}

验证https和http2开启成功

重启服务,即完成了http到https的升级,且能自动跳转https,让网站更安全。输入http://localhost:8080/blog/swagger-ui.html后回车地址栏自动跳转至https://localhost:8443/blog/swagger-ui.html,如图:

使用chrome浏览器的console控制台,输入脚本后回车查看http2是否开启,脚本如下:

?

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

(function(){

 

// 保证这个方法只在支持loadtimes的chrome浏览器下执行

 

if (window.chrome && typeof chrome.loadtimes === 'function' ) {

 

var loadtimes = window.chrome.loadtimes();

 

var spdy = loadtimes.wasfetchedviaspdy;

 

var info = loadtimes.npnnegotiatedprotocol || loadtimes.connectioninfo;

 

// 就以 「h2」作为判断标识

 

if (spdy && /^h2/i.test(info)) {

 

return console.info( '本站点使用了http/2' );

 

}

 

}

 

console.warn( '本站点没有使用http/2' );

 

})();

总结

本文只是介绍了undertow服务器的https支持,spring boot支持jetty,tomcat等服务器,不同的服务器实现可以查资料了解,嘿嘿

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:http://server.51cto测试数据/sOS-588962.htm

查看更多关于Spring Boot实现Undertow服务器同时支持HTTP2、HTTPS的方法的详细内容...

  阅读:22次