在生产环境下,一般来说都是 https 协议访问,现在的 http 协议访问可能会出现问题,在 Eureka Server、Client 中开启 Https 访问。
HTTP Basic 基于 base64 编码,容易被抓包,如果暴露在公网会非常不安全,可以通过开启 https 达到保护数据的目的。
Server 证书生成
1
| keytool -genkeypair -alias server -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore server.p12 -validity 3650
|
密码为:123456
在当前目录生成了一个 server.p12 文件
Client 证书生成
1
| keytool -genkeypair -alias client -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore client.p12 -validity 3650
|
密码为:654321
在当前目录生成了一个 client.p12 文件
导出 p12 文件
1 2
| keytool -export -alias server -file server.crt --keystore server.p12 keytool -export -alias client -file client.crt --keystore client.p12
|
信任证书
Client 信任 Server 证书
将 server.crt 导入 client.p12
1
| keytool -import -alias server -file server.crt -keystore client.p12
|
秘钥口令是 client.p12 的口令
Server 信任 Client 证书
将 client.crt 导入 server.p12
1
| keytool -import -alias client -file client.crt -keystore server.p12
|
秘钥口令是 server.p12 的口令
Eureka Server
源码:https://gitee.com/laiyy0728/spring-cloud/tree/master/spring-cloud-eureka/spring-cloud-eureka-server-https
将生成的最后的 server.p12 文件放在 resources 下
application.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| server: port: 8761 ssl: enabled: true key-store-type: PKCS12 key-alias: server key-store: classpath:server.p12 key-store-password: 123456
eureka: instance: hostname: localhost secure-port: ${server.port} secure-port-enabled: true non-secure-port-enabled: false home-page-url: https://${eureka.instance.hostname}:${server.port} status-page-url: https://${eureka.instance.hostname}:${server.port} client: register-with-eureka: false fetch-registry: false service-url: defaultZone: https://${eureka.instance.hostname}:${server.port}/eureka/
|
验证 Eureka Server
访问 http://localhost:8761
访问 https://localhost:8761
Eureka Client
源码:https://gitee.com/laiyy0728/spring-cloud/tree/master/spring-cloud-eureka/spring-cloud-eureka-client-https
Client 只在连接 Eureka Server 的时候使用 https 协议,如果要全局都使用 https,则和 Server 的 https 配置一致,只需要将配置换成 client.p12 的配置即可。
application.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| server: port: 8081
spring: application: name: client1
eureka: client: securePortEnabled: true ssl: key-store: client.p12 key-store-password: 654321 serviceUrl: defaultZone: https://localhost:8761/eureka/
|
Https 连接配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| @Configuration public class EurekaHttpsClientConfiguration {
@Value("${eureka.client.ssl.key-store}") private String ketStoreFileName;
@Value("${eureka.client.ssl.key-store-password}") private String ketStorePassword;
@Bean public DiscoveryClient.DiscoveryClientOptionalArgs discoveryClientOptionalArgs() throws CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException, KeyManagementException { EurekaJerseyClientImpl.EurekaJerseyClientBuilder builder = new EurekaJerseyClientImpl.EurekaJerseyClientBuilder(); builder.withClientName("eureka-https-client"); URL url = this.getClass().getClassLoader().getResource(ketStoreFileName); SSLContext sslContext = new SSLContextBuilder() .loadTrustMaterial(url, ketStorePassword.toCharArray()).build(); builder.withCustomSSL(sslContext); builder.withMaxTotalConnections(10); builder.withMaxConnectionsPerHost(10);
DiscoveryClient.DiscoveryClientOptionalArgs optionalArgs = new DiscoveryClient.DiscoveryClientOptionalArgs(); optionalArgs.setEurekaJerseyClient(builder.build());
return optionalArgs; }
}
|
验证 Client
访问 https://localhost:8761
使用 http 注册