我正在使用自定义专用CA,并且想要在两个服务之间进行通信,两者都使用自定义证书。但是,我收到一个我不理解的错误
因此,在这两种服务上,我都使用私有CA设置了一个信任库,并使用其自身标识为的证书建立了一个单独的密钥库。在浏览器中转到简单的/ hello路由表明连接是安全的(即已知发行者,并且公用名有效)。当我curl -iv https://{address}
时,这是相同的,它表示握手通过并说“ SSL证书验证正常”,并且域与证书上的通配符名称匹配。
但是,当我尝试以完全相同的方式从单独的服务中执行一个简单的GET请求时,出现了标题中列出的错误。问题是它说我要联系的服务的证书无法将其证书中的任何主题替代名称与它所注册的域相匹配。但这绝对是不正确的,唯一的区别是它使用通配符。这可以通过浏览器和curl命令来调试握手。只是不是来自单独的微服务上的Java / Spring Boot代码。
Java是否在更严格的方式上有所不同,这意味着它不喜欢使用通配符证书联系服务器?
编辑:添加以下所示的行可解决此问题,因此它无法在Java中验证主机名(但不能在浏览器上或使用curl进行调试)。这是不安全的,因此不是解决方案。
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(truststore,null).build();
HostnameVerifier hostnameVerifier = new NoopHostnameVerifier(); // I added this line,but it's advised against as it's insecure
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext,hostnameVerifier);