我正在尝试执行对网站的get调用https://www.facebookbrand.com/在这样做的过程中,我收到了错误(SSLException)接收到致命警报:protocol\u version。该网站正在使用TLSv1。2如果我将ConnectionFactory设置为专门支持此协议,那么它可以正常工作,但我需要它适用于每个网站,并且从我的理解来看,它需要硬编码到TLSv1。2将使其不适用于其他不使用TLSv1的https网站。2、我还尝试包括一个协议列表(“TLSv1.2”、“TLSv1.1”、“TLSv1”、“SSLv3”、“SSLv2Hello”),但随后我得到了无法识别的错误SSL消息,纯文本连接。我不在乎它有多安全,我只需要能够从本质上连接到每个网站,并试图找到最好的方法来做到这一点。下面是我的代码。
下面是我设置httpClient等的代码:
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslBuilder.build(), SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
PlainConnectionSocketFactory pcsf = new PlainConnectionSocketFactory();
Registry socketFactoryRegistry = RegistryBuilder.create().register("https", sslsf).register("http", pcsf).build();
PoolingHttpClientConnectionManager multiConnectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
multiConnectionManager.setMaxTotal(100);
multiConnectionManager.setDefaultMaxPerRoute(10);
httpClientBuilder.setConnectionManager(multiConnectionManager);
this.httpClient = httpClientBuilder.disableContentCompression().setSSLSocketFactory(sslsf).build();
下面是通过httpClient执行get请求的代码:
HttpGet call = new HttpGet(url);
LinkPullerContentHandler handler = new LinkPullerContentHandler();
PageLinks pl = new PageLinks(url, 200, null);
HttpResponse getResponse;
try {
call.addHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
call.addHeader("Accept","text/html");
call.setConfig(RequestConfig.custom().setCookieSpec(CookieSpecs.IGNORE_COOKIES).build());
try {
getResponse = httpClient.execute(call);
} catch (SocketTimeoutException ste) {
LOG.error(String.format("Socket timeout pulling URL %s; skipping",url));
pl.setHttpStatusCode(408);
return pl;
} catch (ConnectTimeoutException cte) {
LOG.warn(String.format("Connect timeout pulling URL %s; skipping", url));
pl.setHttpStatusCode(408);
return pl;
} catch (UnknownHostException uhe) {
LOG.warn("Unable to resolve host for URL {}; skipping", url);
pl.setHttpStatusCode(404);
return pl;
} catch (Exception e) {
LOG.error(String.format("Unable to load link %s: (%s) %s",
url,e.getClass().getSimpleName(),e.getMessage()),e);
pl.setHttpStatusCode(420);
return pl;
}
int code = getResponse.getStatusLine().getStatusCode();
在尝试具体包含TLSv1.2协议时,我将SSLConnectionSocketFactory设置代码修改为:
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslBuilder.build(),
new String[] { "TLSv1.2" }, null,
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
这适用于有问题的网站,但我觉得它会在其他一些网站上失败,因为它是硬编码到TLSv1.2的。或者,当我尝试包含附加协议时,情况如下:
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslBuilder.build(),
new String[] { "TLSv1.2", "TLSv1.1", "TLSv1", "SSLv3", "SSLv2Hello"},
null, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
最终得到例外“无法识别的SSL消息,明文连接”我还试图包括一个密码套件列表,看看这是否有帮助,但我还没有取得任何成功。
如果有人能提供任何帮助,帮助我找出如何在不牺牲获取其他网站的能力的情况下实现这一目标,那将是非常棒的。
提前感谢
不要使用SSLv2Hello。
该站点显然不支持v2格式hello;即使它会成功地在v3格式hello上协商TLSv1.2,如果我发送(使用openssl)支持升级到TLSv1.2(有线版本3.3)的v2格式,它会以明文形式的超文本标记语言正文(甚至不是HTTP标头)响应,上面写着“服务不可用”和“站点不可用”。这当然不是v2协议或v3协议的有效响应。
如果您配置从SSLv3到TLSv1的所有协议。2但不是SSLv2Hello——不管怎样,这是Java8的默认设置——假设没有其他问题,比如该站点使用了无效的证书,您将能够与支持SSLv3的其他站点进行协商(除了任何只实现TLSv1.3草案而不实现任何标准的站点)如果有任何服务器仍然存在,那么它只支持SSLv2,Java实际上无论如何都无法与之通信;SSLv2Hello的唯一“好处”是,JSSE抛出了一个关于“SSLv2不受支持”的特定异常,而不是各种各样且常常模棱两可的通信错误,这些错误很难调试。
我的java应用程序是由JBoss AS 5运行的。我试图通过URL连接下载图像,但收到下一个异常:javax.net.ssl.sslHandShakeException:Received致命警报:handshake_failure 我已将trust-managet配置为“全信任信任管理器”: null
以下是完整的StackTrace: [8/21/15 16:33:08:997 EDT]00000093 HttpMethodDir I org.apache.commons.httpclient.httpmethodDirector执行retry I/O异常(javax.net.ssl.sslException)处理请求时捕获:收到致命警报:decode_error[8/21/15 16:33:
我们确实发现了一篇文章指出了java 11中TLS1.3的一个问题(https://webtide.com/openjdk-11-and-tls-1-3-issues/),但是我们已经尝试了java 12版本,但没有成功,所以我认为这不是问题所在。 因此,我们现在必须决定是通过强制使用TLS1.2来回归,还是继续寻找另一种解决方案。
以前有人遇到过这个错误吗?我是新来的SSL,我的客户有什么明显的问题吗?你好,我错过了吗?在没有ServerHello响应的情况下引发该异常。任何建议都很感激。 {http://xml.apache.org/axis/}stackTrace: ...
问题内容: 我正在尝试使用 liferay中的* javapns 库将推送通知发送到我的设备。这是代码: * 调用pushNotification时出现此错误: 我已经用谷歌搜索了,但是找不到任何解决方案。 有谁知道如何解决这个问题? 问题答案: 当您要连接的服务器没有来自授权CA的有效证书时,通常会引发该异常。 简而言之,您尝试连接的服务器很可能使用自签名证书,因此您必须在Java代码中容纳该证
问题内容: 我正在尝试建立SSL套接字连接(并在客户端上执行以下操作) 我生成了证书签名请求以获取签名的客户证书 现在,我有一个私钥(在CSR中使用),一个签名的客户端证书和根证书(带外获得)。 我将私钥和签名的客户端证书添加到证书链中,并将其添加到密钥管理器中。和根证书到信任管理器。但是我收到了错误的证书错误。 我很确定自己使用的证书正确。是否也应该将签名的客户端证书添加到信任管理器?试了一下,