调试javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚点
我正在尝试(在Android上)通过安全wss连接到NGINX代理 我有两台服务器,一台在内部网,另一台在AWS 尝试连接到本地服务器时,连接失败,出现调试javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚点,java,android,ssl,nginx,websocket,Java,Android,Ssl,Nginx,Websocket,我正在尝试(在Android上)通过安全wss连接到NGINX代理 我有两台服务器,一台在内部网,另一台在AWS 尝试连接到本地服务器时,连接失败,出现javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚点。 当连接到AWS上的服务器时,我得到一个com.neovisionires.ws.client.OpeningHandshakeException:开始握手响
javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚点。
当连接到AWS上的服务器时,我得到一个com.neovisionires.ws.client.OpeningHandshakeException:开始握手响应的状态代码不是“101交换协议”。状态行为:HTTP/1.1 404未找到
,这是预期的,因为AWS上的NGINX实例尚未配置为切换协议并连接到上游websocket服务器。这是在本地服务器上开发的。但这表明TLS/SSL正在AWS上工作,这对我来说已经足够了
另外,连接到wss://echo.websocket.org
成功,消息将被回显
现在,有一件奇怪的事情:AWS上运行在docker容器中的NGINX实例与本地计算机上的实例具有相同的代码库。两者都是在docker容器中运行的NGinx,卷的装载方式相同,配置文件非常相似。唯一不同的是域名和相关的SSL证书
这些是来自Comodo(正SSL)的DV证书。我还尝试了LetsEncrypt证书,得到了相同的结果
我不明白为什么这两个容器的行为如此不同,我也找不到理由去责怪托管docker服务的服务器(都是Ubuntu 14.04)
因此,我想剖析Android客户端应用程序中的证书(及其链)
如何打印证书链的内容?
Chrome浏览器JavaScript wss与本地服务器的连接可以工作,无论是从Android设备还是从PC
~~~~~更新~~~~请不要回答下面的问题,因为我将把它分成一个单独的问题
好的,在@commonware的帮助下,我进步了。下面是一些新问题,它们开始变得有趣起来
intranet中的服务器承载自签名证书作为catchall https响应。其背后的逻辑是,如果有人从internet访问该intranet的公共IP的IP地址(通过)
多个具有不同证书的域名指向该IP地址,因此为此IP提供了多个SSL证书
在NGINX中,它将是:
server {
listen 443;
server_name _;
ssl on;
ssl_certificate /etc/nginx/self-signed-dummy.pem;
ssl_certificate_key /etc/nginx/self-signed-dummy.key;
location / {
return 404;
}
}
server {
listen 443;
server_name intranet.example.com;
ssl on;
ssl_certificate /etc/nginx/intranet.example.com.pem;
ssl_certificate_key /etc/nginx/intranet.example.com.key;
location / {
...
}
}
server {
listen 443;
server_name testing.intranet.example.com;
ssl on;
ssl_certificate /etc/nginx/testing.intranet.example.com.pem;
ssl_certificate_key /etc/nginx/testing.intranet.example.com.key;
location / {
...
}
}
这与AWS上的服务器不同,AWS上没有自签名证书
你知道为什么客户可以得到虚拟证书吗
此外,我如何在没有异常的情况下转储证书,例如为了分析AWS服务器返回的证书(+链)
将普通的HttpURLConnection
与https一起使用不会出现问题。SSLHandshakeException
上的getCause()
可能会返回一个CertPathValidatorException
,给出错误文本。它有一个getCertPath()
方法,该方法返回一个CertPath
,该方法有一个getCertificates()
方法表示链。如果需要,这些证书应该能够强制转换为X509Certificate
对象,从而提供有关证书的各种详细信息
“互联网Widgits私人有限公司”,我想知道为什么会有这样的服务
我不知道,但对该字符串进行Internet搜索听起来不太有希望。SSLHandshakeException
上的getCause()
可能会返回一个CertPathValidatorException
,给出错误文本。它有一个getCertPath()
方法,该方法返回一个CertPath
,该方法有一个getCertificates()
方法表示链。如果需要,这些证书应该能够强制转换为X509Certificate
对象,从而提供有关证书的各种详细信息
“互联网Widgits私人有限公司”,我想知道为什么会有这样的服务
我不知道,但在该字符串上进行Internet搜索听起来不太可能。
SSLHandshakeException
上的getCause()
可能会返回一个CertPathValidatorException
。它有一个getCertPath()
方法,该方法返回一个CertPath
,该方法有一个getCertificates()
方法表示链。是的,谢谢!“互联网Widgits私人有限公司”,我想知道为什么会有这样的服务。你帮了我。输入答案,我会接受。SSLHandshakeException
上的getCause()
可能会返回一个CertPathValidatorException
。它有一个getCertPath()
方法,该方法返回一个CertPath
,该方法有一个getCertificates()
方法表示链。是的,谢谢!“互联网Widgits私人有限公司”,我想知道为什么会有这样的服务。你帮了我。输入答案,我会接受。我已经更新了问题。intranet上的我的NGINX服务器为所有与特定域不匹配的默认命中提供虚拟证书。就是那个证书。@DanielF:“知道为什么客户机可以得到虚拟证书吗?”——如果服务器除了WebSocket之外还提供普通页面,请查看普通HTTPS请求的行为(例如,使用OkHttp3或HttpURLConnection
)。如果成功了,也许您需要为WebSocket设置做一些不同的事情。“如何在没有异常的情况下转储证书”--我知道的唯一方法是实现您自己的X509TrustManager
,这样您就可以获得证书链进行验证,但这很痛苦。谢谢。