Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调试javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚点_Java_Android_Ssl_Nginx_Websocket - Fatal编程技术网

调试javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚点

调试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:开始握手响

我正在尝试(在Android上)通过安全wss连接到NGINX代理

我有两台服务器,一台在内部网,另一台在AWS

尝试连接到本地服务器时,连接失败,出现
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
,这样您就可以获得证书链进行验证,但这很痛苦。谢谢。