- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我制作了一个爬虫应用程序,由于错误“握手警报:unrecognized_name”,某些网站无法连接。
我找到的大多数解决方案都是通过禁用 SNI 扩展 (jsse.enableSNIExtension=false)。但这会给需要启用 SNI 的域带来问题。
我怎样才能只对某些域禁用它?
我正在使用 Jsoup 进行抓取,并且因为我也在使用代理,所以我在启动时添加了这段代码。
private static void disableSslVerification() {
TrustManager[] trustAllCertificates = new TrustManager[] {
new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null; // Not relevant.
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
// Do nothing. Just allow them all.
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
// Do nothing. Just allow them all.
}
}
};
HostnameVerifier trustAllHostnames = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true; // Just allow them all.
}
};
try {
System.setProperty("https.protocols", "TLSv1.2,TLSv1.1,SSLv3");
// System.setProperty("jsse.enableSNIExtension", "false");
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCertificates, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(trustAllHostnames);
}
catch (GeneralSecurityException e) {
throw new ExceptionInInitializerError(e);
}
}
如您所见,SNI 扩展已被注释。我将不胜感激。
我要访问的 url 是下一个。
https://www.ocinerioshopping.es/
最佳答案
我设法通过扩展 SSLSocketConnection 并在调用 createSocket 时发送 null 而不是主机名来解决问题。这样java就禁用了SNI。然后,我将新类的一个实例传递给 Jsoup,我知道 SNI 将在其中失败。
import javax.net.ssl.*;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
public class CustomSSLSocketFactory extends SSLSocketFactory {
private SSLSocketFactory defaultFactory;
public CustomSSLSocketFactory() throws IOException {
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}};
try {
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init((KeyManager[])null, trustAllCerts, new SecureRandom());
defaultFactory = sslContext.getSocketFactory();
} catch (KeyManagementException | NoSuchAlgorithmException var3) {
throw new IOException("Can't create unsecure trust manager");
}
}
@Override
public String[] getDefaultCipherSuites() {
return defaultFactory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return defaultFactory.getSupportedCipherSuites();
}
@Override
public Socket createSocket(Socket socket, String s, int i, boolean b) throws IOException {
//magic happens here, we send null as hostname
return defaultFactory.createSocket(socket, null, i, b);
}
@Override
public Socket createSocket(String s, int i) throws IOException, UnknownHostException {
return defaultFactory.createSocket(s,i);
}
@Override
public Socket createSocket(String s, int i, InetAddress inetAddress, int i1) throws IOException, UnknownHostException {
return defaultFactory.createSocket(s,i,inetAddress,i1);
}
@Override
public Socket createSocket(InetAddress inetAddress, int i) throws IOException {
return defaultFactory.createSocket(inetAddress, i);
}
@Override
public Socket createSocket(InetAddress inetAddress, int i, InetAddress inetAddress1, int i1) throws IOException {
return defaultFactory.createSocket(inetAddress,i, inetAddress1, i1);
}
}
Jsoup 初始化。
Connection conn = Jsoup.connect(url);
conn.sslSocketFactory(new CustomSSLSocketFactory());
关于java - 如何修复 SSLProtocolException : handshake alert: unrecognized_name without disabling SNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56786496/
我正在通过一个简单的 HTTP/GET 请求通过 SSL 连接将一组 CSV 行下载到我的 android 设备。在我们切换到新服务器(Debian 6 -> Debian 7)之前,这就像一个魅力,
当我与网络服务器建立 https 连接时出现 SSLProtocolException。我只在 Android 2.3 Gingebread 中有这个异常(exception);相同的代码在所有其他
我想弄清楚为什么有时会出现此错误 javax.net.ssl.SSLProtocolException: SSL handshake terminated: ssl=0x60d46c90: Failu
我在 Android 4.4 手机(特别是 Galaxy S4,尽管我认为这不是手机本身的问题)上遇到了问题。在使用 Retrofit2.Http 时,我在通过 HTTPS 连接时收到以下错误: ja
我正在使用 Java 中的 servlet 创建一个 Web 应用程序,并且我正在使用基于类类型 Jsoup 的 httpclient 等...我遇到了 A CONNECTION SSL 的问题。 M
我遇到来自客户端的服务器问题。在此服务器上,我们的 Web 应用程序安装了 2 个。安装在443端口和8082都是2个HTTPS。 在端口 443 上没有问题。 8082端口初始化小程序时出现java
我有一个通过 SSLSocket 与服务器通信的应用程序。从 Android 6 我收到一个 SSLHandshakeException javax.net.ssl.SSLHandshakeExcep
我使用生成的应用引擎 Android 客户端 (jar lib)。 31 个客户端中有 30 个没有问题。但是一台三星平板电脑拒绝连接并出现崩溃: Android: 4.4.4 Manufacture
我正尝试从 Android 平板电脑向 api 发布一些数据,但我不断收到 SSLProtocolException,我无法找出问题所在。 这是我不断收到的错误: javax.net.ssl.SSLH
我的基于 Spring Boot 的服务在 Apache Http Client 时偶尔会遇到 javax.net.ssl.SSLProtocolException: Connection timed
在我将 IHS 服务器从 7.0.0.33 升级到 7.0.0.37 之后.. 在最新的 IHS 服务器中,SSLv3 被完全禁用.. 我的下面一段代码 HttpURLConnection urlCo
您好,我们的 API 迁移到了 TLS 1.2。我应用此处提出的解决方案 https://github.com/square/okhttp/issues/2372它在测试 API 上运行良好。 htt
我正在尝试创建一个连接到 Netgear WAG102(接入点)的 Java 软件,它必须获取我的 wifi 网络的连接日志。 我的软件已经可以与其他 Netgear 接入点(例如 WG302v2)一
我正在尝试使用 GoogleMap 的 Android API 在我的应用程序中创建地点搜索功能。我想在用户键入地点名称时填充 AutoComplete TextView。但是我在调用 urlCo
我正在尝试通过 XMPP 协议(protocol)建立 TLS 安全(使用客户端身份验证)连接。我使用的是标准端口而不是专用 SSL 端口,后者显然已被弃用。 startTLS 进程永远不会完成握手。
我制作了一个爬虫应用程序,由于错误“握手警报:unrecognized_name”,某些网站无法连接。 我找到的大多数解决方案都是通过禁用 SNI 扩展 (jsse.enableSNIExtensio
我尝试在低于 android lollipop 的设备上运行时遇到以下错误,但它在高于 lollipop 的版本上运行得非常好。 javax.net.ssl.SSLHandshakeException
我一直在寻找这个问题的解决方案,但我似乎无法弄清楚 我正在尝试在 Android 应用程序和服务器之间通过 http 连接使用 ssl,我用我的自签名证书创建了一个 keystore 我有这段代码:
我想接受所有站点的所有证书,但我从一个站点获得了 unrecognized_name。我怎样才能接受或通过它,以便我可以得到这个网站的内容? 提前致谢 最佳答案 I want to accept al
我正在尝试从 AWS 实现 DynamoDBMapper,但当我尝试连接到 AWS 服务器时应用程序崩溃了。 首先,我在 Android Studio 模拟器上运行 Android 4.4.2,一切似
我是一名优秀的程序员,十分优秀!