Я пытаюсь получить доступ к информации веб-сайта программным способом, но ни на Java, ни на Python не удается разрешить имя хоста. Если я укажу IP-адрес, ошибка изменится на TLSV1_UNRECOGNIZED_NAME. Однако этот веб-сайт можно решить без каких-либо дополнительных действий через любой браузер.
Я просмотрел здесь множество потенциальных решений, но для Python говорится, что эта проблема должна была быть решена в 2.7 или 2.8, но я использую 3.10 и все еще получаю эту ошибку. В Java утверждается, что это известная ошибка, но представленные решения, такие как удаление заголовка SNI с помощью параметра компиляции или передача пустого массива имен хостов в HTTPSURLConnection для отмены создания заголовка SNI, не решают проблему. Я также попробовал установить пользовательский агент на Mozilla, как предложено в ответе здесь, но это тоже ничего не изменило.
Я уверен, что на этом веб-сайте есть что-то необычное, но он не принадлежит мне, поэтому я не могу подробно проверить его конфигурацию.
В частности, я пытаюсь просмотреть веб-сайт:
URL -> https://epic7db.com/heroes
IP -> 157.230.84.20
DNS Lookup -> https://www.nslookup.io/domains/epic7db.com/webservers/
При локальном использовании nslookup я получаю ответ:
nslookup epic7db.com
Server: UnKnown
Address: 10.0.0.1
Non-authoritative answer:
Name: epic7db.com
Address: 157.230.84.20
Буду признателен за любую помощь, поскольку я, по сути, швыряю вещи в стену, чтобы посмотреть, что прилипнет на этом этапе.
РЕДАКТИРОВАТЬ: Добавление примеров кодаПитон:
import requests
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36'} # This is chrome, you can set whatever browser you like
url = 'https://epic7db.com'
a = requests.get(url,headers)
print(a.content)
Kotlin использует Java HttpsUrlConnection:
import http.SSLSocketFactoryWrapper
import java.net.URL
import javax.net.ssl.*
fun main() {
HttpsURLConnection.setDefaultHostnameVerifier { hostName, session -> true }
val url = URL("https://epic7db.com")
val sslParameters = SSLParameters()
val sniHostNames: MutableList = ArrayList(1)
// sniHostNames.add(SNIHostName(url.getHost()))
sslParameters.setServerNames(sniHostNames as List?)
val wrappedSSLSocketFactory: SSLSocketFactory =
SSLSocketFactoryWrapper(SSLContext.getDefault().socketFactory, sslParameters)
HttpsURLConnection.setDefaultSSLSocketFactory(wrappedSSLSocketFactory)
val conn = url.openConnection() as HttpsURLConnection
conn.hostnameVerifier = HostnameVerifier { s: String?, sslSession: SSLSession? -> true }
println(String(conn.inputStream.readAllBytes()))
}
Предлагаемый вспомогательный класс в Kotlin/Java:
package http;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
public class SSLSocketFactoryWrapper extends SSLSocketFactory {
private final SSLSocketFactory wrappedFactory;
private final SSLParameters sslParameters;
public SSLSocketFactoryWrapper(SSLSocketFactory factory, SSLParameters sslParameters) {
this.wrappedFactory = factory;
this.sslParameters = sslParameters;
}
@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
SSLSocket socket = (SSLSocket) wrappedFactory.createSocket(host, port);
setParameters(socket);
return socket;
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort)
throws IOException, UnknownHostException {
SSLSocket socket = (SSLSocket) wrappedFactory.createSocket(host, port, localHost, localPort);
setParameters(socket);
return socket;
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
SSLSocket socket = (SSLSocket) wrappedFactory.createSocket(host, port);
setParameters(socket);
return socket;
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
SSLSocket socket = (SSLSocket) wrappedFactory.createSocket(address, port, localAddress, localPort);
setParameters(socket);
return socket;
}
@Override
public Socket createSocket() throws IOException {
SSLSocket socket = (SSLSocket) wrappedFactory.createSocket();
setParameters(socket);
return socket;
}
@Override
public String[] getDefaultCipherSuites() {
return wrappedFactory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return wrappedFactory.getSupportedCipherSuites();
}
@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
SSLSocket socket = (SSLSocket) wrappedFactory.createSocket(s, host, port, autoClose);
setParameters(socket);
return socket;
}
private void setParameters(SSLSocket socket) {
socket.setSSLParameters(sslParameters);
}
}
Подробнее здесь: https://stackoverflow.com/questions/788 ... -using-htt