gpt4 book ai didi

java - 从 Tomcat 运行时不在 CertificateRequest 中发送证书,但在从主类运行时发送证书

转载 作者:行者123 更新时间:2023-11-28 22:23:57 25 4
gpt4 key购买 nike

我们有一个运行 restful 网络服务的目标网络应用程序。此应用程序在 Tomcat 8.5 中运行,并启用了 TLS 和双向身份验证。

我们的应用程序也是一个在 Tomcat 9 上运行的 Web 应用程序。

我为其中一项功能调用的目标端点是 SSE 端点。为了使用这个端点,我正在使用 Jersey 客户端。

下面是调用的代码片段:

public static void main(String[] args)
{
SSLContext sslContext = createSslContext();

Client client = ClientBuilder.newBuilder().sslContext(sslContext).build();

try
{
callEndpoint(client);
}
catch (Exception e)
{
if (client != null)
{
client.close();
}
}
}

private static SSLContext createSslContext()
{
SslConfigurator sslConfig = SslConfigurator.newInstance()
.trustStoreFile("C:\\truststore")
.trustStorePassword(password)
.keyStoreFile("C:\\keystore")
.keyStoreType("JKS")
.keyStorePassword(password)
.keyPassword(password);

SSLContext sslContext = sslConfig.createSSLContext();
return sslContext;
}

private static void callEndpoint(Client client)
{
client.register(new ClientRequestFilter()
{
public void filter(ClientRequestContext requestContext) throws IOException
{
requestContext.getHeaders().add("auditUser", "user");
requestContext.getHeaders().add("auditClientIp", "hostname);
}
});

WebTarget target = client.target(url);

EventInput eventInput = target.request().header("Content-Type", "application/fhir").get(EventInput.class);

while (!eventInput.isClosed())
{
eventInput.setChunkType(MediaType.WILDCARD_TYPE);
InboundEvent inboundEvent = eventInput.read();

if (inboundEvent != null)
{
System.out.println(inboundEvent.getName() + "; " + inboundEvent.readData(String.class));
}
}
}

以上代码在通过独立的主类运行时有效。

但是,当它从 Web 应用程序中运行时,调用失败并显示 javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate

在比较两种情况下的 SSL 调试日志时,我注意到在 Web 应用程序的情况下,应用程序不会在证书请求中发送任何证书。

以下是两个日志的摘录:

主类:

*** CertificateRequest
Cert Types: RSA, DSS, ECDSA
Supported Signature Algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA224withECDSA, SHA224withRSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA
Cert Authorities:
<CN=AddTrust External CA Root, OU=AddTrust External TTP Network, O=AddTrust AB, C=SE>
<CN=MYHOSTNAME>
[read] MD5 and SHA1 hashes: len = 179
...
...
*** ServerHelloDone
[read] MD5 and SHA1 hashes: len = 4
0000: 0E 00 00 00 ....
matching alias: le-c979850e-fd8d-4a61-87da-8c25eef1dea1
*** Certificate chain
chain [0] = [
...

网络应用:

*** CertificateRequest
Cert Types: RSA, DSS, ECDSA
Supported Signature Algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA224withECDSA, SHA224withRSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA
Cert Authorities:
<CN=AddTrust External CA Root, OU=AddTrust External TTP Network, O=AddTrust AB, C=SE>
<CN=MYHOSTNAME>
[read] MD5 and SHA1 hashes: len = 179
...
...
*** ServerHelloDone
[read] MD5 and SHA1 hashes: len = 4
0000: 0E 00 00 00 ....
Warning: no suitable certificate found - continuing without client authentication
*** Certificate chain
<Empty>

两种情况下使用的 keystore 和信任库都指向相同的文件。 Tomcat 是否以任何方式干扰导致客户端证书未发送?

注意:Jersey 客户端使用的 keystore 和信任库的路径是通过配置读取的,而不是为 Tomcat 配置的路径。

Tomcat 应用程序中的所有 SSL 调用都必须使用为 Tomcat 配置的那个吗?可以不使用不同的 keystore 吗?如果没有,是否在任何地方记录了它?

最佳答案

它是 2 路 SSL,可能是客户端的 (Tomcat 9) 公钥 (x.509) 不在 Tomcat 8.5 应用程序信任库中。要验证,请运行 SSLPoke在 Tomcat 8.5 服务器上编程并设置应用程序信任库路径。

java -Djavax.net.ssl.trustStore=</path/to/jks> SSLPoke <IP> <PORT>

确保 Tomcat 9 公钥安装在 Tomcat 8.5 信任库中。

关于java - 从 Tomcat 运行时不在 CertificateRequest 中发送证书,但在从主类运行时发送证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57614527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com