欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Eureka启用HTTPS

程序员文章站 2024-02-07 15:16:16
1. 为Eureka Client生成证书 Eureka Client证书的密码设置的是:client 2. 为Eureka Serveer生成证书 Eureka Client证书的密码设置的是:server 经过上面两个操作之后,当前目录下会生成两个.p12文件,分别是client.p12和ser ......
  1. 为eureka client生成证书

    client:keytool -genkeypair -alias client -storetype pkcs12 -keyalg rsa -keysize 2048 -keystore client.p12 -validity 3650
    输入密钥库口令:
    再次输入新口令:
    您的名字与姓氏是什么?
      [unknown]:
    您的组织单位名称是什么?
      [unknown]:
    您的组织名称是什么?
      [unknown]:
    您所在的城市或区域名称是什么?
      [unknown]:
    您所在的省/市/自治区名称是什么?
      [unknown]:
    该单位的双字母国家/地区代码是什么?
      [unknown]:
    cn=unknown, ou=unknown, o=unknown, l=unknown, st=unknown, c=unknown是否正确?
      [否]:  y

    eureka client证书的密码设置的是:client

  2. 为eureka serveer生成证书

    keytool -genkeypair -alias server -storetype pkcs12 -keyalg rsa -keysize 2048 -keystore server.p12 -validity 3650
    输入密钥库口令:
    再次输入新口令:
    您的名字与姓氏是什么?
      [unknown]:
    您的组织单位名称是什么?
      [unknown]:
    您的组织名称是什么?
      [unknown]:
    您所在的城市或区域名称是什么?
      [unknown]:
    您所在的省/市/自治区名称是什么?
      [unknown]:
    该单位的双字母国家/地区代码是什么?
      [unknown]:
    cn=unknown, ou=unknown, o=unknown, l=unknown, st=unknown, c=unknown是否正确?
      [否]:  y

    eureka client证书的密码设置的是:server

    经过上面两个操作之后,当前目录下会生成两个.p12文件,分别是client.p12和server.p12。

  3. 下面分别导出两个p12证书,如下:

    keytool -export -alias client -file client.crt --keystore client.p12
    输入密钥库口令:
    存储在文件 <client.crt> 中的证书
    keytool -export -alias server -file server.crt --keystore server.p12
    输入密钥库口令:
    存储在文件 <server.crt> 中的证书
  4. 接下来,将server.crt文件导入client.p12中,使client端信任server的证书

    keytool -import -alias server -file server.crt -keystore client.p12
    输入密钥库口令:
    所有者: cn=unknown, ou=unknown, o=unknown, l=unknown, st=unknown, c=unknown
    发布者: cn=unknown, ou=unknown, o=unknown, l=unknown, st=unknown, c=unknown
    序列号: 1835fea4
    有效期开始日期: wed aug 21 11:37:51 cst 2019, 截止日期: sat aug 18 11:37:51 cst 2029
    
    证书指纹:
             md5: 6e:4b:26:19:44:dd:1a:f2:de:f8:b8:25:a0:17:28:da
             sha1: 87:5c:4f:84:6b:d6:e5:6d:4e:1c:61:b6:87:99:1e:ad:85:6f:31:75
             sha256: e4:47:2b:f5:d2:73:0e:81:64:b7:0f:a1:0a:99:b4:41:8f:d9:a3:5a:e4:15:7c:58:36:00:b5:e9:af:8f:81:23
             签名算法名称: sha256withrsa
             版本: 3
    
    扩展:
    
    #1: objectid: 2.5.29.14 criticality=false
    subjectkeyidentifier [
    keyidentifier [
    0000: 19 48 c8 13 bb 25 de ff   9b 72 9f ec b0 d4 6c 91  .h...%...r....l.
    0010: 2f f5 b2 14                                        /...
    ]
    ]
    
    是否信任此证书? [否]:  y
    证书已添加到密钥库中

    这里输入client.p12的密码:client。

    将client.crt文件导入server.p12中,使server端信任client的证书

    keytool -import -alias client -file client.crt -keystore server.p12
    输入密钥库口令:
    所有者: cn=unknown, ou=unknown, o=unknown, l=unknown, st=unknown, c=unknown
    发布者: cn=unknown, ou=unknown, o=unknown, l=unknown, st=unknown, c=unknown
    序列号: 6e0b1e14
    有效期开始日期: wed aug 21 11:39:23 cst 2019, 截止日期: sat aug 18 11:39:23 cst 2029
    
    证书指纹:
             md5: c3:75:bc:d1:01:21:e0:e1:ea:c7:88:d0:bd:2c:3b:d3
             sha1: 7e:58:1c:86:5f:28:b0:6f:69:a2:47:e6:32:3d:b6:8a:32:20:34:4e
             sha256: c2:97:d0:68:df:32:e2:cc:c0:7d:23:74:89:e3:37:ec:92:db:41:6b:ee:13:c0:d7:5a:d0:c9:45:f1:86:cb:c1
             签名算法名称: sha256withrsa
             版本: 3
    
    扩展:
    
    #1: objectid: 2.5.29.14 criticality=false
    subjectkeyidentifier [
    keyidentifier [
    0000: e8 48 cb cb 3a e9 96 b4   03 50 b7 fa 53 8a e3 71  .h..:....p..s..q
    0010: fd c3 eb 74                                        ...t
    ]
    ]
    
    是否信任此证书? [否]:  y
    证书已添加到密钥库中

    这里输入server.p12的密码:server。

  5. 创建eureka-server工程,将server.p12文件放到resources目录下,并在application.yml下配置如下信息。

    server:
      port: 8761
      ssl:
        enabled: true
        key-store: classpath:server.p12
        key-alias: server
        key-store-type: pkcs12
        key-store-password: server
    eureka:
      instance:
        hostname: localhost
        secure-port: 443
        secure-port-enabled: true
        non-secure-port-enabled: false  #该实例应该接收通信的非安全端口是否启用,默认为true
        home-page-url: https://${eureka.instance.hostname}:${server.port}/
        status-page-url: https://${eureka.instance.hostname}:${server.port}/
      client:
        fetch-registry: false
        register-with-eureka: false
        service-url:
          defaultzone: https://${eureka.instance.hostname}:${server.port}/eureka
      server:
        wait-time-in-ms-when-sync-empty: 0
        enable-self-preservation: false
    

    启动eureka-server,访问https://localhost:8761/发现可以使用https进行访问。

    创建eureka-client工程,将client.p12文件放到resources目录下,并在application.yml下配置如下信息。

    server:
      port: 8080
    eureka:
      client:
        secureportenabled: true
        ssl:
          key-store: client.p12
          key-store-password: client
        service-url:
          defaultzone: https://localhost:8761/eureka
    spring:
      application:
        name: eureka-client

    我们这里没有指定整个应用实例启用https,仅仅是开启访问eureka-server的https配置。通过自定义配置eureka.client.ssl.key-store和eureka.client.ssl.key-store-password两个属性,指定eureka-client访问eureka-server的sslcontext配置。这里需要在代码里指定discoveryclient.discoveryclientoptionalargs。

    在eureka-client项目下新增一个配置类eurekahttpsclientconfig,代码如下。

    @configuration
    public class eurekahttpsclientconfig {
    
        @value("${eureka.client.ssl.key-store}")
        string keystorefilename;
    
        @value("${eureka.client.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-https-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;
        }
    }

    上面的代码还需要httpclient的依赖

    <dependency>
        <groupid>org.apache.httpcomponents</groupid>
        <artifactid>httpclient</artifactid>
        <version>4.5.5</version>
    </dependency>

    启动eureka-client,发现eureka-client已经成功注册到eureka-server上了。