Spring Eureka 配置 SSL

前言

在搭建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来生成我们的认证证书。


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

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

把公钥证书导入到truststore中

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

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

配置ssl服务发现中心

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

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

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

配置ssl客户端

首先构建一个正常的Spring Cloud客户端应用。也需要和配置服务发现中心一样,导入证书密钥库。但这一步不太容易。因为Spring  Cloud 并没提供将证书密钥库传递给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设置它。

配置application.yml:

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

总结

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据