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

为spring-webflux WebClient配置带有reactor netty的HostnameVerifier

华谭三
2023-03-14

我正在尝试配置带有ssl和客户端主机名验证的spring-webflux WebClient(带有reactor netty)。为我提供了javax.net.ssl.SSLContext、HostnameVerifier和一个受信任的主机名列表(作为字符串列表)。

到目前为止,我已经使用SSLContext配置了WebClient,但我找不到配置主机名验证的方法。

说明一下我的问题:我有一组受信任的服务主机名(字符串列表)和一个主机名化器(HostNameVerifier)。我想用它配置我的WebClient。

这是我目前得到的:

WebClient.builder()
  .clientConnector(
    new ReactorClientHttpConnector(
      opt -> opt.sslContext(new JdkSslContext(mySSLContext, 
                      true, ClientAuth.OPTIONAL))))
  .build();

共有1个答案

纪勇军
2023-03-14

您应该提供有效的证书颁发机构证书(TrustManager()),还可以提供带有私钥和用于授权的私钥密码的用户证书(KeyManager())。您的服务SSL证书应该由您在trustManager()中定义的同一个CA签名。

主机名将自动与服务主机名进行验证。如果不匹配java.security.cert.CertificateException:No subject alternative names present将引发异常。实际上,我找不到省略主机名验证的方法(而不省略整个SSL证书验证,方法是使用.trustManager(InsecureTrustManagerFactory.Instance))。

我已经在本地测试了这个解决方案。我的webservice正在本地计算机上运行,但它的SSL证书只包含DNS名称,而不包含IP地址。因此,为了调试的目的,我在主机文件中添加了条目,并将我的服务IP映射到正确的DNS名称。

SslContext sslContext = SslContextBuilder
        .forClient()
        .trustManager(new FileInputStream(caPath))
        .keyManager(
                new FileInputStream(userCertPath),
                new FileInputStream(userPrivateKeyPath),
                userPrivateKeyPassword
        )
        .build();

HttpClient httpClient = HttpClient.create()
        .secure(t -> t.sslContext(sslContext));

WebClient webClient = WebClient.builder()
        .clientConnector(new ReactorClientHttpConnector(httpClient))
        .build();
 类似资料:
  • 我有一个带有REST API的Spring Boot应用程序,使用Jackson进行JSON视图配置。它的工作很好,我可以得到所有的春靴好。

  • pom.xml已更新: spring.version=3.2.4.发布spring.security.version=3.1.4.发布 然后我添加了一个新的java配置类,而不是spring-security.xml null 有人能给出一个建议吗?

  • 批处理配置具有spring作业,只有一个步骤 1)读取器-从csv文件读取。处理器对文件应用一些规则。Drools请运行schema-postgresql.sql来设置数据库 WRITER使用SPRING DATA JPA写入DB Writer将此称为PersonDaoImpl:

  • 我试图用spring Cloud Config和数据库后端设置一个Spring Boot项目。我在设置中有以下内容: 我在应用程序类中有。另外,我在一个控制器中有,我试图从数据库中注入一个值。 我在DB中有一个条目。 为了刷新,我在中使用空主体执行一个POST操作,它返回成功200。但是字段的值仍然是来自属性文件的值,并且没有更新。 当我转到GET时,我会在响应中看到新值,但是字段仍然没有刷新。我