Spring Cloud 微服务(6) --- Eureka(四)
Https

在生产环境下,一般来说都是 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

GenKey Server

在当前目录生成了一个 server.p12 文件

Client 证书生成

1
keytool -genkeypair -alias client -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore client.p12 -validity 3650

密码为:654321

GenKey Client

在当前目录生成了一个 client.p12 文件

P12 文件

导出 p12 文件

1
2
keytool -export -alias server -file server.crt --keystore server.p12
keytool -export -alias client -file client.crt --keystore client.p12

Export p12
crt file

信任证书

Client 信任 Server 证书

将 server.crt 导入 client.p12

1
keytool -import -alias server -file server.crt -keystore client.p12

秘钥口令是 client.p12 的口令

client 信任 server

Server 信任 Client 证书

将 client.crt 导入 server.p12

1
keytool -import -alias client -file client.crt -keystore server.p12

秘钥口令是 server.p12 的口令

Server 信任 Client

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 # type 与 keytool 的 storetype 一致
key-alias: server # 与 keytool 的 alias 一致
key-store: classpath:server.p12 # p12 文件地址
key-store-password: 123456 # server.p12 口令

eureka:
instance:
hostname: localhost
secure-port: ${server.port} # https 端口
secure-port-enabled: true # 是否开启 https port
non-secure-port-enabled: false
home-page-url: https://${eureka.instance.hostname}:${server.port} # https 协议
status-page-url: https://${eureka.instance.hostname}:${server.port} # https 协议
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: https://${eureka.instance.hostname}:${server.port}/eureka/ # https 协议

验证 Eureka Server

访问 http://localhost:8761

Http 协议

访问 https://localhost:8761

Https 协议

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

验证 client

使用 http 注册

Client 使用 Http 访问 Server


-------------本文结束 感谢您的阅读-------------
0%