我必须使用 SSL 保护微服务内部通信。我所有的微服务都是 Spring Boot 应用程序,我们使用 Zookeeper 作为发现服务器。内部服务通信通过rest模板和feign客户端进行。我们使用功能区作为客户端负载均衡器。我们在所有微服务中设置了以下属性
spring.application.name=Application1
spring.cloud.zookeeper.discovery.enabled=true
spring.cloud.zookeeper.connectString=localhost:2181
spring.cloud.zookeeper.enabled=true
server.port=7800
spring.cloud.zookeeper.discovery.instance-ssl-port=7801
server.ssl.enabled=true
server.ssl.key-store-type=JKS
server.ssl.key-store=classpath:LP-PF1HMVQU.jks
server.ssl.key-store-password=123456
server.ssl.key-alias=LP-PF1HMVQU
server.ssl.protocol=TLS
我们必须使用自签名证书,我已经生成了相同的证书并将证书导入 JRE 信任存储以使通信成为可能(SSL 握手)。这里的问题是我必须保持证书的 CN 与我的系统的主机名 (LP-PF1HMVQU) 相同。这是因为当服务注册到 Zookeeper 时,它会将机器名或主机名存储为其地址,并且在握手期间返回相同的地址。
在 zookeeper 上注册的服务
{"name":"employee-service","id":"b4c2204a-b00c-4102-b609-17d7f73f35d7","address":"LP-PF1HMVQU","port":7800,"sslPort":null,"payload":{"@class":"org.springframework.cloud.zookeeper.discovery.ZookeeperInstance","id":"application-1","name":"employee-service","metadata":{}},"registrationTimeUTC":1564658801106,"serviceType":"DYNAMIC","uriSpec":{"parts":[{"value":"scheme","variable":true},{"value":"://","variable":false},{"value":"address","variable":true},{"value":":","variable":false},{"value":"port","variable":true}]}}
现在在生产环境中,我们将为每个服务提供一个 docker 容器,并且每个服务可以有多个 docker 容器。这些 docker 容器注册到 zookeeper 并保存容器的 IP 地址。
我应该如何创建证书,CN 名称应该是什么,以便它匹配任何 IP 地址。我已经尝试使用通配符 * 作为 CN 名称,但它不起作用。
请建议如何实现这一目标。