当前位置: 首页 > 知识库问答 >
问题:

如何使用HTTPS连接“Spring boot application(2.3.4.Release)”和elasticsearch 7.9.2

翟理
2023-03-14

xpack.security.transport.ssl.enabled:true

xpack.security.transport.ssl.verification_mode:证书

xpack.security.transport.ssl.keystore.path:ellastic-certificates.p12

xpack.security.http.ssl.client_authentication:可选

xpack.security.authc.realms.pki.pki1.order:1

我已经生成了CA和客户端证书,由生成的CA根据此链接签名

private static final Logger LOG = LoggerFactory.getLogger(RestClientConfig.class);

private static final String CERT_FILE = "client.p12";
private static final String CERT_PASSWORD = "";
private static final String USER_NAME = "elastic";
private static final String USER_PASS = "pwd";

@Override
@Bean
public RestHighLevelClient elasticsearchClient() {

    final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
            .connectedTo("localhost:9200")  // set the address of the Elasticsearch cluster
            .usingSsl(createSSLContext())  // use the SSLContext with the client cert
            .withBasicAuth(USER_NAME, USER_PASS)   // use the headers for authentication
            .build();
    return RestClients.create(clientConfiguration).rest();
}

private SSLContext createSSLContext() {
    try {
        SSLContext sslContext = SSLContext.getInstance("TLS");
        KeyManager[] keyManagers = getKeyManagers();
        sslContext.init(keyManagers, null, null);
        return sslContext;
    } catch (Exception e) {
        LOG.error("cannot create SSLContext", e);
    }
    return null;
}

private KeyManager[] getKeyManagers()
        throws KeyStoreException, NoSuchAlgorithmException, IOException, CertificateException, UnrecoverableKeyException {
    try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(CERT_FILE)) {
        KeyStore clientKeyStore = KeyStore.getInstance("PKCS12");
        clientKeyStore.load(inputStream, CERT_PASSWORD.toCharArray());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(clientKeyStore, CERT_PASSWORD.toCharArray());
        return kmf.getKeyManagers();
    }
}

我的客户端证书“client.p12”包含在spring-boot应用程序的resources文件夹中。在elasticsearch方面,一切似乎都很好。但是当我运行spring-boot应用程序时,它会发出警告&异常

无法创建索引:主机名“LocalHost”与对等方提供的证书主题不匹配(CN=Instance);嵌套异常是java.lang.runtimeException:主机名“localhost”与对等方提供的证书主题不匹配(CN=instance)

java.io.ioException:主机名“localhost”与对等方提供的证书主题不匹配(CN=instance)

bin/elasticsearch-certutil cert--ca
config/elastic-stack-ca.p12
-name“cn=something,ou=consulting Team,dc=mydomain,dc=com”ENTER client.p12 ENTER ENTER

在internet上搜索此错误时,我发现我的客户端证书有问题。它与具有弹性节点的SAN名称有关。但我对这些证书的东西知之甚少。所以对我来说真的很困惑。如果有人能给我详细的解释为什么会发生这种情况和解决办法,我真的很感激。一个适当的链接也会有帮助。这个问题已经在如何将“Spring Boot2.1 with elasticsearch 6.6”与集群节点“https”连接起来?但我运气不好。

共有1个答案

吕亮
2023-03-14

您的问题与另一个问题类似,请参见此处: 的证书与任何主题替代名称都不匹配

因此,我假设,如果将SAN扩展localhost作为DNS添加到elasticsearch证书中,并将localhost的ip地址添加到elasticsearch证书中,它应该可以工作。因此添加以下附加参数:--DNS localhost--IP 127.0。0.1。你能试一下下面的命令并在这里分享你的结果吗?

bin/elasticsearch-certutil cert --ca config/elastic-stack-ca.p12 -name "CN=something,OU=Consulting Team,DC=mydomain,DC=com" --dns localhost --ip 127.0. 0.1

您已经将Elasticsearch配置为可选地请求客户端证书,但未标记为必需,请参见:xpack.security.http.ssl.client_authentication:optional。因此,它不是必需的,因此,创建KeyManager并从中构造sslcontext是没有意义的。但我认为您需要导出Elasticsearch证书的公共证书,并通过将其转换为TrustManager并从中创建sslcontext将其提供给http客户机。我这里有一个工作示例:ElasticSearch RestHighLevelClient SSL示例。

 类似资料:
  • 我正在尝试使用JaxWsProxyFactoryBean连接到TLS1。2通过代理使用Spring Boot和java配置的https服务。我找不到任何示例,也找不到有关如何配置的信息。我使用wsdl2java构建最终从JaxWsProxyFactoryBean返回的所有对象。任何帮助都将不胜感激。我目前拥有: 和 我目前收到一个错误: 任何帮助都将不胜感激。 谢谢,布莱恩

  • 问题内容: 我有一个使用“安全” cookie的应用程序,并且想要测试其功能而无需设置复杂的启用SSL的开发服务器。有什么方法可以像我可以使用来测试未加密的请求那样简单吗? 问题答案: 它不像内置的开发服务器那么简单,但是使用stunnel作为浏览器和开发服务器之间的SSLifying中间人来达成某种目标并非难事。使用Stunnel,你可以在计算机上设置轻量级服务器,该服务器可以在配置的端口上接受

  • 问题内容: 我这里有代码,可让我连接到https服务器并传输数据。它工作正常,但是我想知道我是否以正确的方式进行操作,并且实际上是在建立安全连接。请检查我的工作。谢谢。 我像这样使用此代码: 然后,我从那里阅读响应。再次感谢。 问题答案: 查看Apache HttpClient 的官方Custom SSL上下文教程。 正如Stephen C所提到的,您不需要为https上下文注册端口80。将其注册

  • 问题内容: 我有2个应用程序,一个是Servlet / Tomcat服务器,另一个是Android应用程序。 我想使用HttpURLConnection在两者之间发送和接收XML。 码: 现在,我需要使用SSL来发送XML以确保安全。 首先,我使用Java Keytool生成.keystore文件。 然后我将XML代码放在Tomcat的server.xml文件中以使用SSL 然后,将其更改为Htt

  • 问题内容: 我有一个令人尴尬的并行任务,我使用Spark来分配计算。这些计算是在Python中进行的,我使用PySpark读取和预处理数据。我任务的输入数据存储在HBase中。不幸的是,我还没有找到一种令人满意的(即易于使用且可扩展)的方式,可以使用Python从/向Spark读取/写入HBase数据。 我之前探讨过的内容: 使用从我的Python进程内部进行连接。该软件包允许使用HBase的Th

  • 问题内容: 我正在尝试验证目标是否公开了https Web服务。我有通过HTTP连接的代码,但不确定如何通过HTTPS连接。我已经阅读过您使用SSL,但我也阅读过它不支持证书错误。我得到的代码来自python docs: 有谁知道如何连接到HTTPS? 我已经尝试过HTTPSConenction,但是它以错误代码响应,声称httplib没有属性HTTPSConnection。我也没有socket.