Square的okHTTP证书固定-sslSocketFactory错误

5

我想导入我的自签名证书内容,但在使用okHTTP时遇到了问题。我希望能够使用这个bks文件来完成操作,我也已经通过sha512方式使其成功运行。

我从几个教程中获取了这段代码,我知道问题出在哪里,但无法解决它。

import android.content.Context;
import android.util.Log;

import java.io.InputStream;
import java.security.KeyStore;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class Pinning
{
    Context context;
    public static String TRUST_STORE_PASSWORD = "your_secret";
    private static final String ENDPOINT = "https://api.yourdomain.com/";

public Pinning(Context c) {
    this.context = c;
}

private SSLSocketFactory getPinnedCertSslSocketFactory(Context context) {
    try {
        KeyStore trusted = KeyStore.getInstance("BKS");
        InputStream in = context.getResources().openRawResource(R.raw.mytruststore);
        trusted.load(in, "mypass".toCharArray());
        SSLContext sslContext = SSLContext.getInstance("TLS");
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
                TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(trusted);
        sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
        return sslContext.getSocketFactory();
    } catch (Exception e) {
        Log.e("MyApp", e.getMessage(), e);
    }
    return null;
}


public void makeRequest() {
    try {
        OkHttpClient client = new OkHttpClient().sslSocketFactory(getPinnedCertSslSocketFactory(this.context));

        Request request = new Request.Builder()
                .url(ENDPOINT)
                .build();

        Response response = client.newCall(request).execute();

        Log.d("MyApp", response.body().string());

    } catch (Exception e) {
        Log.e("MyApp", e.getMessage(), e);

    }
}
}

现在我在以下行中遇到了以下错误:
OkHttpClient client = new OkHttpClient().sslSocketFactory(getPinnedCertSslSocketFactory(this.context)).;

错误:

在okHTTPClient中,SSLSocketFactory不能应用于javax.net.SSLSocketFactory。

如果您查看导入的内容,您会看到以下3个来自javax的内容。

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

我遇到了一个不匹配的问题。似乎我需要一个带有bks文件的okHTTP-sslSocketFactory,但是我找不到一个可行的解释。同时我还在使用okHTTP 3.3.1版本。

compile 'com.squareup.okhttp3:okhttp:3.3.1'

我在这里找到了解释/解决方案:How can I pin a certificate with Square OKHTTP?。如前所述,我想使用bks文件,而不是sha512/方法。
因此,我需要知道如何将javax.ssl.Factory解析为okHTTP-sslFactory,或者如何使用生成的bks文件创建okHTTPsslFactory。
此外,在okHTTP 3.1.1中,setSSLSocketFactory方法不再可用。
非常感谢您的帮助,并感谢您抽出时间来阅读这个问题!
1个回答

0
你应该使用以下语法。
OkHttpClient client = new OkHttpClient.Builder()
             .sslSocketFactory(getPinnedCertSslSocketFactory(this.context))
             .build();

1
哦,谢谢!我真是个白痴!我忘记加上.Builder()了。我真丢人 :/ - user3325230

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接