spring boot / cloud (五) 自签SSL证书以及HTTPS

spring boot / cloud (五) 自签SSL证书以及HTTPS

前言

什么是HTTPS?

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,所以加密的详细内容就须要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL代表它使用了HTTP,但HTTPS存在不一样于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器Netscape Navigator中,提供了身份验证与加密通信方法。如今它被普遍用于万维网上安全敏感的通信,例如交易支付方面。java

什么是SSL证书?

SSL证书是数字证书的一种,相似于驾驶证、护照和营业执照的电子副本。由于配置在服务器上,也称为SSL服务器证书。
SSL 证书就是遵照 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具备服务器身份验证和数据传输加密功能。
SSL证书经过在客户端浏览器和Web服务器之间创建一条SSL安全通道(Secure socket layer(SSL)安全协议是由Netscape Communication公司设计开发。该安全协议主要用来提供对用户和服务器的认证;对传送的数据进行加密和隐藏;确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准。因为SSL技术已创建到全部主要的浏览器和WEB服务器程序中,所以,仅需安装服务器证书就能够激活该功能了),即经过它能够激活SSL协议,实现数据信息在客户端和服务器之间的加密传输,能够防止数据信息的泄露。保证了双方传递信息的安全性,并且用户能够经过服务器证书验证他所访问的网站是不是真实可靠。数位签名又名数字标识、签章 (即 Digital Certificate,Digital ID ),提供了一种在网上进行身份验证的方法,是用来标志和证实网路通讯双方身份的数字信息文件,概念相似平常生活中的司机驾照或身份证类似。 数字签名主要用于发送安全电子邮件、访问安全站点、网上招标与投标、网上签约、网上订购、安全网上公文传送、网上办公、网上缴费、网上缴税以及网上购物等安全的网上电子交易活动git

思路

  • 使用自签ssl证书的方式本地搭建https服务

实现

1.使用keytool生成keystore文件,而且拷贝至项目的根目录下

注意 : 生成证书时,名称应使用域名,(本机的话,设置hosts文件)spring

keytool -genkey -alias udf_demo -keyalg RSA -keystore d:\udf_demo.keystore

2.将应用的端口号更改成8443(测试用,https默认端口号为443)

server.port=8443

3.进行ssl配置

server.ssl.enabled=true
server.ssl.key-store=udf_demo.keystore
server.ssl.key-store-password=123456
server.ssl.key-store-type=JKS
server.ssl.key-alias=udf_demo

4.启动应用,使用https://xxxx:8443访问应用

注意:正常状况下,浏览器会提示不安全,这个是由于咱们使用的是自签的证书,浏览器并不信任,这时候须要将证书导入,浏览器,重启后,浏览器就会显示当前连接是安全的了,导出证书浏览器

keytool -selfcert -alias udf_demo -keystore d:\udf_demo.keystore

keytool -export -alias udf_demo -keystore d:\udf_demo.keystore -storepass 123456 -rfc -file d:\udf_demo.cer

而后将导出的cer文件,导入到浏览器信任证书里,而且重启浏览器

5.使用restTemplate访问https服务

String url = "https://wangkang.com:8443/demo/b";
ResponseEntity<RestResponse<Date>> result = restTemplate.exchange(url, HttpMethod.GET, null,
        new ParameterizedTypeReference<RestResponse<Date>>() {
        });

不过正常状况下,以上代代码会报出以下错误安全

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: 
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target

由于在这个示例里,当前应用又作了服务方,也作了调用方,其实跟前面浏览器访问应用是同样的,调用方也会由于不信任当前所调用的这个服务,而拒绝调用,因此说,很简单,信任这个服务便可,以下代码,将前面 得到的cer证书导入jre服务器

keytool -importcert -alias udf_demo -file 
d:/udf_demo.cer -keystore D:/develop/Java/jdk1.8.0_92/jre/lib/security/cacerts

而后重启应用,再进行调用,便可正常调用框架

代码仓库 (博客配套代码)

结束

使用了keytool和spring boot的ssl配置,完成了基本的https的样例.spring-boot


想得到最快更新,请关注公众号

想得到最快更新,请关注公众号

相关文章
相关标签/搜索