Eureka Server 启用 https 服务指北

本贴最后更新于 1935 天前,其中的信息可能已经斗转星移

New Mac Mini

文章共 591 字,阅读大约需要 2 分钟 !


概 述

在我的前文《Eureka Server 开启 Spring Security Basic 认证》中已经给 Eureka Server 开启了最基本的鉴权措施,本文则让 HTTPS 加持于 Eureka Server,让安全措施来的更彻底一点。

注: 本文首发于 My Personal Blog:CodeSheep·程序羊,欢迎光临 小站


证书准备

这里使用 JDK 自带的 keytools 来创建证书

  • Server 端证书生成
keytool -genkeypair -alias server -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore codesheepserver.p12 -validity 3800

过程如下:

Server 端证书生成过程

  • Client 端证书生成
keytool -genkeypair -alias client -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore codesheepclient.p12 -validity 3800

过程类似,就不再截图了

  • 分别导出 server 端和 client 端的 p12 证书
keytool -export -alias server -file codesheepserver.crt --keystore codesheepserver.p12 会要求你输入密码

导出 server 端的 p12 证书

keytool -export -alias client -file codesheepclient.crt --keystore codesheepclient.p12

导出的证书在此:

导出 client 端的 p12 证书

  • 配置 Client 端信任 Server 端的证书
keytool -import -alias server -file codesheepserver.crt -keystore codesheepclient.p12

过程如下:

配置 Client 端信任 Server 端的证书

  • 配置 Server 端信任 Client 端的证书
keytool -import -alias client -file codesheepclient.crt -keystore codesheepserver.p12

过程与上面类似,也不截图展示了

证书文件准备妥当之后,接下来进行项目代码级别的配置


Eureka Server SSL 配置

我们需要在 Eureka Server 的 Spring Boot 项目中的 application.yml 配置文件里将上文中生成的证书配到项目中去,即下面这段配置中与 server.ssl 相关的部分:

server:
  port: 1111
  ssl:
    enabled: true
    key-store: classpath:codesheepserver.p12
    key-store-password: codesheep.cn
    key-store-type: PKCS12
    key-alias: server

eureka:
  instance:
    hostname: localhost
    securePort: 1111
    securePortEnabled: true
    nonSecurePortEnabled: false
  client:
    registerWithEureka: false
    fetchRegistry: false

Eureka Client SSL 配置

类似地,我们也在 Eureka Client 的 Spring Boot 项目中的 application.yml 配置文件里将上文中生成的证书配到项目中去:

server:
  port: 1112
spring:
  application:
    name: eureka-client
eureka:
  client:
    securePortEnabled: true
    serviceUrl:
      defaultZone: https://localhost:1111/eureka/
ssl:
  key-store: codesheepclient.p12
  key-store-password: codesheep.cn

但注意此处的 ssl.key-storessl.key-store-password 只是我们自定义的属性,我们需要结合自己编写的 ssl 配置类 EurekaClientHttpsCfg 来进行使用,代码如下:

@Configuration
public class EurekaClientHttpsCfg {

    @Value("${ssl.key-store}")
    String keyStoreFileName;

    @Value("${ssl.key-store-password}")
    String keyStorePassword;

    @Bean
    public DiscoveryClient.DiscoveryClientOptionalArgs discoveryClientOptionalArgs() throws CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException, KeyManagementException {
        EurekaJerseyClientImpl.EurekaJerseyClientBuilder builder = new EurekaJerseyClientImpl.EurekaJerseyClientBuilder();
        builder.withClientName("eureka-client");
        SSLContext sslContext = new SSLContextBuilder()
                .loadTrustMaterial(
                        this.getClass().getClassLoader().getResource(keyStoreFileName),keyStorePassword.toCharArray()
                )
                .build();
        builder.withCustomSSL(sslContext);

        builder.withMaxTotalConnections(10);
        builder.withMaxConnectionsPerHost(10);

        DiscoveryClient.DiscoveryClientOptionalArgs args = new DiscoveryClient.DiscoveryClientOptionalArgs();
        args.setEurekaJerseyClient(builder.build());
        return args;
    }
}

这段代码的主要意图就是通过设置一个 SSLContext 用于 Eureka Client 访问 Eureka Server。


实验验证

  • 启动 Eureka Server,由于其开启了 https 访问,因此浏览器以非 https 方式访问时就不通了

非 https 的方式是无法访问注册中心的

浏览器必须以 https 方式访问注册中心方可:

以 https 方式访问注册中心方可

  • 启动 Eureka Client 后,由于其已经加入了对 https 的配置,因此可以验证通过并且注册到 Eureka Server 注册中心:

服务已经注册上来

如此一番实践下来,微服务注册中心的安全性就更进了一步。


后 记

由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!



  • Eureka
    22 引用 • 3 回帖
  • HTTPS
    98 引用 • 271 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...