【问题标题】:okhttp3 - Unexpected response code for CONNECT: 403okhttp3 - CONNECT 的意外响应代码:403
【发布时间】:2017-10-09 06:35:37
【问题描述】:

在我的 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,但找不到任何会破坏请求的内容。

任何帮助将不胜感激。提前致谢!

【问题讨论】:

    标签: android okhttp http-status-code-403 okhttp3


    【解决方案1】:

    似乎无法通过您配置的 HTTP 代理进行连接。更改代理服务器配置(可能在系统属性中),一切顺利。

    【讨论】:

    • 服务器不是我们公司托管的,所以我们不能对服务器端进行任何更改。有没有办法更改客户端代码并使其工作?
    • 更改 OkHttp 以跳过代理服务器。您可以将 Proxy.NO_PROXY 传递给 OkHttpClient.Builder 以强制关闭它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2018-05-16
    • 2014-09-21
    相关资源
    最近更新 更多