V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hansonwang99
V2EX  ›  Blogger

Eureka Server 启用 https 服务指北

  •  
  •   hansonwang99 · 2018-12-10 21:48:34 +08:00 · 1996 次点击
    这是一个创建于 2158 天前的主题,其中的信息可能已经有所发展或是发生改变。

    New Mac Mini

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


    概 述

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


    证书准备

    这里使用 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 注册中心:

    服务已经注册上来

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


    后 记

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



    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3107 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:07 · PVG 21:07 · LAX 05:07 · JFK 08:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.