okhttp3 - CONNECT 的意外响应代码:403
okhttp3 - Unexpected response code for CONNECT: 403
在我的 android 项目中,我使用 okhttp3 库版本 3.4.2 连接到我的服务器。
最近,我尝试将库版本更新到 3.9.0,除了 build.gradle 之外没有任何代码更改。但是,现在相同的请求因 403 错误而失败。
因此,我尝试了 3.4.2 和 3.9.0 之间发布的所有版本,发现问题仅从 3.5.0 版本开始。
我只有在我必须通过将证书加载到 X509TrustManager 来连接到服务器时才在我的一台服务器上看到此错误。以下是我正在做的事情的小样本:
public OkHttpClient.Builder getCertificate(OkHttpClient.Builder client) {
try {
AssetManager assets = cntxt.getAssets();
InputStream caInput=null;
caInput = assets.open(configuration.sslCertFile);
File f = createFileFromInputStream(caInput);
final KeyStore trusted = KeyStore.getInstance("PKCS12");
trusted.load(new FileInputStream(f), sslPasswd.toCharArray());
final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(trusted,sslPasswd.toCharArray());
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
FakeX509TrustManager[] fmk=new FakeX509TrustManager[1];
fmk[0]=new FakeX509TrustManager();
fmk[0].allowAllSSL();
sslContext.init(keyManagerFactory.getKeyManagers(),fmk, new SecureRandom());
X509TrustManager trustManager = (X509TrustManager) fmk[0];
client.sslSocketFactory(new Tls12SocketFactory(sslContext.getSocketFactory()), trustManager);
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
//Log.d("MAinActivity", "Trust Host :" + hostname);
return true;
}
};
client.hostnameVerifier( hostnameVerifier);
ConnectionSpec cs = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
.tlsVersions(TlsVersion.TLS_1_2)
.build();
List<ConnectionSpec> specs = new ArrayList<ConnectionSpec>();
specs.add(cs);
specs.add(ConnectionSpec.COMPATIBLE_TLS);
specs.add(ConnectionSpec.CLEARTEXT);
client.connectionSpecs(specs);
f.delete();
log.debug("Certificate File has been deleted from the cache");
} catch (Exception exc) {
exc.printStacktrace();
}
return client;
}
我无法共享我尝试连接的服务器的 IP,因为它是私有 IP。
我也检查了 version 3.5.0 change log,但找不到任何可以中断请求的内容。
如有任何帮助,我们将不胜感激。提前致谢!
似乎无法通过您配置的 HTTP 代理进行连接。更改代理服务器配置(可能在系统 属性 中),您就可以开始了。
在我的 android 项目中,我使用 okhttp3 库版本 3.4.2 连接到我的服务器。
最近,我尝试将库版本更新到 3.9.0,除了 build.gradle 之外没有任何代码更改。但是,现在相同的请求因 403 错误而失败。 因此,我尝试了 3.4.2 和 3.9.0 之间发布的所有版本,发现问题仅从 3.5.0 版本开始。
我只有在我必须通过将证书加载到 X509TrustManager 来连接到服务器时才在我的一台服务器上看到此错误。以下是我正在做的事情的小样本:
public OkHttpClient.Builder getCertificate(OkHttpClient.Builder client) {
try {
AssetManager assets = cntxt.getAssets();
InputStream caInput=null;
caInput = assets.open(configuration.sslCertFile);
File f = createFileFromInputStream(caInput);
final KeyStore trusted = KeyStore.getInstance("PKCS12");
trusted.load(new FileInputStream(f), sslPasswd.toCharArray());
final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(trusted,sslPasswd.toCharArray());
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
FakeX509TrustManager[] fmk=new FakeX509TrustManager[1];
fmk[0]=new FakeX509TrustManager();
fmk[0].allowAllSSL();
sslContext.init(keyManagerFactory.getKeyManagers(),fmk, new SecureRandom());
X509TrustManager trustManager = (X509TrustManager) fmk[0];
client.sslSocketFactory(new Tls12SocketFactory(sslContext.getSocketFactory()), trustManager);
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
//Log.d("MAinActivity", "Trust Host :" + hostname);
return true;
}
};
client.hostnameVerifier( hostnameVerifier);
ConnectionSpec cs = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
.tlsVersions(TlsVersion.TLS_1_2)
.build();
List<ConnectionSpec> specs = new ArrayList<ConnectionSpec>();
specs.add(cs);
specs.add(ConnectionSpec.COMPATIBLE_TLS);
specs.add(ConnectionSpec.CLEARTEXT);
client.connectionSpecs(specs);
f.delete();
log.debug("Certificate File has been deleted from the cache");
} catch (Exception exc) {
exc.printStacktrace();
}
return client;
}
我无法共享我尝试连接的服务器的 IP,因为它是私有 IP。
我也检查了 version 3.5.0 change log,但找不到任何可以中断请求的内容。
如有任何帮助,我们将不胜感激。提前致谢!
似乎无法通过您配置的 HTTP 代理进行连接。更改代理服务器配置(可能在系统 属性 中),您就可以开始了。