gpt4 book ai didi

使用多个证书连接到服务器时出现 java.security.cert.CertificateException

转载 作者:太空宇宙 更新时间:2023-11-03 14:14:10 25 4
gpt4 key购买 nike

我正在尝试创建到网站 ( https://www.otten-markenshop.de/ ) 的 SSL 连接,并使用浏览器或 curl 它可以工作,但 wget 和 Java 都无法连接。我最感兴趣的是为什么 Java 代码会失败。以下是错误详细信息:

使用 WGET:

wget https://www.otten-markenshop.de/

结果

Resolving www.otten-markenshop.de... 217.24.213.167
Connecting to www.otten-markenshop.de|217.24.213.167|:443... connected.
ERROR: certificate common name “www.plentymarkets.eu” doesn’t match requested
host name “www.otten-markenshop.de”.

使用Java:

public static void main(String[] args) throws IOException
{
URL url = new URL("https://www.otten-markenshop.de");
URLConnection connection = url.openConnection();
connection.getInputStream();
}

结果:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: 
java.security.cert.CertificateException: No subject alternative DNS
name matching www.otten-markenshop.de found.

我还注意到,我在浏览器中收到的证书与我在运行 Java 程序时收到的证书不同:

在浏览器中:

Common Name (CN): 
www.otten-markenshop.de
Subject Alternative Name:
DNS Name=www.otten-markenshop.de
DNS Name=otten-markenshop.de

在 Java 中:

Common Name (CN): 
www.plentymarkets.eu
Subject Alternative Name:

如果我尝试通过 IP 地址访问主机,我在 Java 中获得的证书与我在浏览器中收到的证书相同:https://217.24.213.167因此,服务器似乎安装了多个证书,并使用虚拟主机来检测应使用哪个证书。但由于某些原因,当客户端是 Java 或 wget 时,此检测不起作用。

知道为什么会这样吗?

附言我无权访问目标服务器以查看其配置方式。

附言我更感兴趣的是理解为什么简单的 Java 代码不起作用,而不是通过例如禁用 SSL 验证来使其起作用。毕竟我可以毫无问题地通过 HTTP 连接到上述 URL。

最佳答案

在同一 IP 地址和端口上拥有多个证书依赖于服务器名称指示。

您的服务器支持它,但您的客户端也需要支持它。

客户端对 SNI 的支持仅在 Java 7 的 Java 中引入(参见 release notes )(*)。我猜您使用的是 Java 6 或更低版本,否则您使用 URLConnection 的简单示例应该像这样开箱即用。

(如果您使用的是其他客户端库,例如 Apache HTTP 客户端,则可能还需要其他设置,具体取决于版本。)

(*) 这是在服务器端引入的 Java 8 ,但这并不是你真正的问题。

关于使用多个证书连接到服务器时出现 java.security.cert.CertificateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24061279/

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