- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试对网站 https://www.facebookbrand.com/ 执行获取调用在这样做的过程中,我收到了错误 (SSLException) Received fatal alert: protocol_version。有问题的网站正在使用 TLSv1.2,如果我设置我的 ConnectionFactory 以专门支持此协议(protocol),它可以正常工作,但我需要它适用于每个网站,并且根据我的理解,将其硬编码为 TLSv1.2 会使它无法工作对于其他不使用 TLSv1.2 的 https 网站。我还尝试包括一个协议(protocol)列表(“TLSv1.2”、“TLSv1.1”、“TLSv1”、“SSLv3”、“SSLv2Hello”),但随后我收到错误 Unrecognized SSL message, plaintext connection。我不关心它有多安全,我只需要能够基本上连接到每个网站,并试图找到最好的方法来做到这一点。下面我包含了我的代码。
这是我设置 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获取请求和执行的代码:
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 协议(protocol)时,我将 SSLConnectionSocketFactory 设置代码修改为:
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslBuilder.build(),
new String[] { "TLSv1.2" }, null,
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
这适用于有问题的网站,但我觉得它在其他一些网站上会失败,因为它被硬编码为 TLSv1.2。或者,这是我尝试包含其他协议(protocol)时的样子:
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslBuilder.build(),
new String[] { "TLSv1.2", "TLSv1.1", "TLSv1", "SSLv3", "SSLv2Hello"},
null, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
最终得到异常“无法识别的 SSL 消息,纯文本连接。”我还试图包含一个 cipherSuites 列表以查看这是否有帮助,但我还没有取得任何成功。
如果有人能提供任何帮助来帮助我弄清楚如何在不牺牲访问其他站点的能力的情况下完成这项工作,那就太棒了。
提前致谢
最佳答案
不要使用 SSLv2Hello。
该站点显然不支持 v2 格式 hello;即使它会在 v3+ 格式 hello 上成功协商 TLSv1.2,如果我发送(使用 openssl)支持升级到 TLSv1.2(有线版本 3.3)的 v2 格式,它会以明文形式响应 HTML 正文(甚至不是 HTTP header )说“服务不可用”和“网站不可用”。这当然不是 v2 协议(protocol)或 v3+ 协议(protocol)的有效响应。
如果您配置了从 SSLv3 到 TLSv1.2 的所有协议(protocol),但没有配置 SSLv2Hello(无论如何这是 Java8 的默认设置),您将能够与支持低至 SSLv3 的任何内容的其他站点协商,假设没有其他问题,例如该站点使用了无效的证书。 (除了任何实现仅草案 TLSv1.3 而没有任何标准的网站。)如果有任何服务器仍然存在,太旧或太差,它只支持 SSLv2,Java 无论如何都无法与它通信; SSLv2Hello 的唯一“好处”是 JSSE 抛出一个关于“不支持 SSLv2”的特定异常,而不是更难调试的各种且通常模棱两可的通信错误。
关于java - 如何修复 (SSLException) 收到致命警报 : protocol_version in Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32898488/
在 Android Studio 中,当我尝试通过 SDK 管理器更新大型 SDK 时,我不断收到以下错误: SSLException: Connection has been shutdown:
我只是集成 Frimi 支付网关。第一步我尝试生成访问 token ,生成 token 后将调用支付链接。但我收到错误:- SSLException:连接已被对等方关闭。 public void
我发布了 this issue我可以解决它从 WebLogic startups 参数中删除下一个: -Djsse.enableSNIExtension=false 谁能解释一下? 最佳答案 参数 -
我的类(class)有一个简短的任务,即扩展一个简单的 Java 服务器以在 Ubuntu 上支持 SSL。 好的,首先,我这样做了: 私有(private)静态 SSLServerSocketFac
我打算为 Android 应用程序使用 GCM 功能。我设置了正确的 Android 应用程序和部署在本地主机上的后端服务。 一切都很好,通知显示在我的测试设备上。接下来我尝试将服务部署到具有真实 I
所以我想通过 https 测试一下。问题是我得到这个: Error getting response; javax.net.ssl.SSLException Received Fatal alert:
我将我的文件从 android 上传到 aws 服务。我是这样配置的: AwsMetadata awsMetadata = resultData.getParcelable(Params.Comm
我尝试向 Web 服务发送 https 请求,在几次成功尝试后,我开始不断收到此错误。这个错误是什么意思,为什么它会在第一次发生。 javax.net.ssl.SSLException: java.l
我是 React Native 的新手,一直在尝试一两个示例。当我尝试在我的 Mac 上构建 Android“电影”示例时,出现以下错误: ./gradlew :Examples:Movies:and
这个问题已经有答案了: javax.net.ssl.SSLException: Received fatal alert: protocol_version (15 个回答) 已关闭 7 年前。 我试
我正在尝试在 Android 客户端上使用自定义证书实现 SSL 连接。如果我尝试使用我编写的普通 Java 程序连接到同一台服务器(我在其中使用系统参数导入 keystore ),一切正常。此外,如
当我向 Google 云消息传递中心发送新的推送通知时,有时会出现问题。我正在使用可用的 Google 库 here .我正在使用 Tomcat 7.0.35 和 bouncycaSTLe 1.46。
我需要在服务器启动时使用 jax-rs 访问 https URL 以获取一些唯一的 session key 。但是,一旦 session 过期,我将再次触发对该 URL 的点击并取回我的 sessio
我正在使用 Android-Query 进行 HTTP 调用,并且不断收到随机的 SSLExceptions,如下所示: AQuery(7746): javax.net.ssl.SSLExceptio
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: SSL handshake alert: unrecognized_name error since upg
从昨天开始,我无法从 JBoss EAP 6.2 连接到我本地开发机器上的 MicroSoft SQLServer (v11.1.3000.0)。 SQLServer 现在想要使用 SSL 进行连接。
我正在创建一个 web 项目..我已经为此配置了 jdbc 领域..我需要将 java servlet 连接到 mysql 数据库.. private static String JDBC_DRIVE
当使用 Android 的 HttpUrlConnection 库发出 HTTPS 请求时,我有时会看到抛出以下异常: javax.net.ssl.SSLException: SSL handshak
我一直在使用以下代码连接到谷歌的一项服务。这段代码在我的本地机器上运行良好: HttpClient client=new DefaultHttpClient(); HttpPost post = ne
我有一个 Spring Boot 后端项目。我想使用我的 ssl 证书。 这是我的 application.properties 文件。 我使用 mycert.cert 和 mycert.key 创建
我是一名优秀的程序员,十分优秀!