欢迎您光临深圳塔灯网络科技有限公司!
电话图标 余先生:13699882642

网站百科

为您解码网站建设的点点滴滴

Spring Eureka 配置 SSL

发表日期:2019-01 文章编辑:小灯 浏览次数:2412

前言

在搭建Spring Cloud体系的过程中,默认是使用非ssl(http)配置,搭建起来也相当容易。也许是因为使用ssl配置要稍复杂一些,也许是因为很多人考虑到使用ssl效率的问题,或者又是因为ssl证书费用的问题,再或者是因为自己的谷歌技术不行,总之我没能在网上找到任何关于Spring Cloud SSL配置的完整示例。所以接下来,我会向大家演示一下Spring Cloud的ssl完整配置。因为我自己的能力有限,我只能保证所有的配置是我自己测试通过的,如果中间什么配置是错误不可取的,还希望各位大神向我指出。

在开始之前需要向大家说明一下,这个系列不是手把手的基础教程,就是说我不会一步一步的向你普及spring cloud的使用,这方面已经有很多很成熟的系统教程。我只是在我自己的理解的基础上,补充一些网上没有或者很少出现的一些东西。

首先我们从eureka开始。为什么从它开始,是因为几乎所有的spring cloud教程都会先教你从服务注册中心搭建开始。

创建证书

既然要使用ssl,那证书当然是必不可少的,我们需要创建两个证书,eureka-server.jks和eureka-client.jks。这里我们使用keytool来生成我们的认证证书。

keytool -genkey -alias eureka-server-storetype JKS -keyalg RSA -keysize 2048 -keystore eureka-server.jks -validity 365
keytool -genkey -alias eureka-client-storetype JKS -keyalg RSA -keysize 2048-keystore eureka-client.jks -validity 365

回车键后会让你输入密码,然后在名字与姓氏中输入你自己的ip地址。这样服务端和客户端的证书就生成好了。接下来我们需要从生成的jks中导出公钥证书。

keytool -export -alias eureka-server -keystore eureka-server.jks -rfc -file eureka-server.cer
keytool -export -alias eureka-client -keystore eureka-client.jks -rfc -file eureka-client.cer

这里会要求你输入上一步你设置的密码,执行成功后会提示 存储在文件 eureka-server.cer中的证书。然后把公钥证书导入到truststore中:

keytool -import -alias eureka-server -trust -file eureka-server.cer -keystore eureka-server-trust.jks
keytool -import -alias eureka-client -trust -file eureka-client.cer -keystore eureka-client-trust.jks

最后将服务端与客户端的公钥证书导入到彼此的truststore中:

keytool -import -alias eureka-client-file eureka-client.cer -keystore eureka-server-trust.jks
keytool -import -alias eureka-server-file eureka-server.cer -keystore eureka-client-trust.jks

至此ssl需要的证书我们就生成好了。

配置ssl服务发现中心

构建ssl服务发现中心与平常的服务发现中心没有什么区别,只是会在你的配置文件中添加几项配置。
首先将生成的eureka-server.jks与eureka-server-trust.jks主在resources目录。然后在application.yml文件中做如下配置:

server: port: ${PORT:8443} ssl: enabled: true key-store: classpath:eureka-server.jks key-store-password: 你设置的密码 trust-store: classpath:eureka-server-trust.jks trust-store-password:你设置的密码 key-alias: eureka-server eureka: instance: #根据需要,如果只使用ssl可设置为false non-secure-port-enabled: true non-secure-port: 8080 secure-port-enabled: true secure-port: ${server.port} client: register-with-eureka: false fetch-registry: false service-url: #localhost需要修改为你证书中配置的地址 defaultZone: 'https://localhost:${server.port}/eureka/' 

如果你和我一样,启用了non-secure-port-enabled=true,即服务注册中心可以同时支持http与https注册,那还需要将non-secure-port添加到端口监听:

 @Value("${eureka.instance.non-secure-port}") privateStringnoSecurePort; @Bean publicIntegerport(){ return Integer.parseInt(noSecurePort); } @Bean publicEmbeddedServletContainerFactory servletContainer(){ TomcatEmbeddedServletContainerFactory tomcat=newTomcatEmbeddedServletContainerFactory(); tomcat.addAdditionalTomcatConnectors(createStandardConnector()); return tomcat; } privateConnector createStandardConnector(){ Connector connector=newConnector("org.apache.coyote.http11.Http11NioProtocol"); connector.setPort(port()); return connector; }

现在一个支持ssl的服务发现中心就配置好了,我的这个服务发现中心还同时支持http注册。在浏览器中访问一下服务发现中心的两个端口,都可以正常访问。

配置ssl客户端

首先构建一个正常的Spring Cloud客户端应用。也需要和配置服务发现中心一样,导入证书密钥库。但这一步不太容易。因为SpringCloud 并没提供将证书密钥库传递给Eureka Client的方法。好在Eureka是使用Jersey实现服务端与客户端之间的建立,并不是Spring RestTemplate。Spring Cloud Eureka是建立在Netflix OSS Eureka客户端之上的,它不使用Spring库。所以我们可以像配置Jersey SSL的方式来配置密钥库。但我们发现,即使我们这样配置好,在连接到服务注册中心的SSL端口时,Eureka Client同样没有使用ssl协议。这是因为,对于像配置ssl这样的一些高级配置,直接靠配置文件是无法配置的,我们需要创建一个DiscoveryClientOptionalArgs的Bean来配置。我将通过以下代码片断为大家演示如何为发现客户端启用SSL连接。

首先,我们使用javax.net.ssl.* Java系统属性设置密钥库和信任库文件的位置。然后,我们基于Java SSL设置提供Jersey客户端的自定义实现,并为DiscoveryClientOptionalArgs bean设置它。

@Configuration publicclassEurekaSslConfig{ @Value("${eureka.client.service-url.defaultZone}") privateStringdefaultZone; @Bean publicDiscoveryClient.DiscoveryClientOptionalArgs discoveryClientOptionalArgs(){ DiscoveryClient.DiscoveryClientOptionalArgs args=newDiscoveryClient.DiscoveryClientOptionalArgs(); System.setProperty("javax.net.ssl.keyStore","src/main/resources/eureka-client.jks"); System.setProperty("javax.net.ssl.keyStorePassword","你的密码"); System.setProperty("javax.net.ssl.trustStore","src/main/resources/eureka-client-trust.jks"); System.setProperty("javax.net.ssl.trustStorePassword","你的密码"); EurekaJerseyClientImpl.EurekaJerseyClientBuilder builder=newEurekaJerseyClientImpl.EurekaJerseyClientBuilder(); builder.withClientName("eureka-client"); if(defaultZone.startsWith("https://")){ builder.withSystemSSLConfiguration(); } builder.withMaxTotalConnections(10); builder.withMaxConnectionsPerHost(10); args.setEurekaJerseyClient(builder.build()); return args; } } 

配置application.yml:

eureka: client: service-url: defaultZone:'https://localhost:8443/eureka/' 

启动服务端与客户端,查看发现中心页面,一切正常。将defaultZone配置成http端口的访问,也同样正常注册到服务发现中心。

总结

配置Eureka的SSL主要是在客户端配置密钥库那一步,通过正常的Spring Cloud的配置方式无法配置密钥库。


本页内容由塔灯网络科技有限公司通过网络收集编辑所得,所有资料仅供用户学习参考,本站不拥有所有权,如您认为本网页中由涉嫌抄袭的内容,请及时与我们联系,并提供相关证据,工作人员会在5工作日内联系您,一经查实,本站立刻删除侵权内容。本文链接:https://dengtar.com/20422.html
相关开发语言
 八年  行业经验

多一份参考,总有益处

联系深圳网站公司塔灯网络,免费获得网站建设方案及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:余经理:13699882642

Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.