gpt4 book ai didi

java - OkHttp javax.net.ssl.SSLPeerUnverifiedException : Hostname domain. com 未验证

转载 作者:IT老高 更新时间:2023-10-28 23:38:11 27 4
gpt4 key购买 nike

我已经尝试了好几天才能让它工作。我正在尝试使用自签名证书通过 https 连接到我的服务器。我认为到目前为止我还没有阅读任何页面或示例。

我做了什么:

  1. 按照本教程创建了 bks keystore :http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

它使用 openssl s_client -connect domain.com:443 从服务器获取证书。然后使用充气城堡创建一个 bks keystore 。

  1. 从原始文件夹中读取创建的 keystore ,将其添加到 sslfactory,然后添加到 OkHttpClient。像这样:

    public ApiService() {
    mClient = new OkHttpClient();
    mClient.setConnectTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS);
    mClient.setReadTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS);
    mClient.setCache(getCache());
    mClient.setCertificatePinner(getPinnedCerts());
    mClient.setSslSocketFactory(getSSL());
    }

    protected SSLSocketFactory getSSL() {
    try {
    KeyStore trusted = KeyStore.getInstance("BKS");
    InputStream in = Beadict.getAppContext().getResources().openRawResource(R.raw.mytruststore);
    trusted.load(in, "pwd".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) {
    e.printStackTrace();
    }
    return null;
    }

    public CertificatePinner getPinnedCerts() {
    return new CertificatePinner.Builder()
    .add("domain.com", "sha1/theSha=")
    .build();
    }
  2. 由于某种原因,这总是会生成带有或不带有 keystore 的 SSLPeerUnverifiedException。有或没有 CertificatePinner

    javax.net.ssl.SSLPeerUnverifiedException: Hostname domain.com not verified: 0         
    W/System.err﹕ certificate: sha1/theSha=
    W/System.err﹕ DN: 1.2.840.113549.1.9.1=#1610696e666f40626561646963742e636f6d,CN=http://domain.com,OU=development,O=domain,L=Valencia,ST=Valencia,C=ES
    W/System.err﹕ subjectAltNames: []
    W/System.err﹕ at com.squareup.okhttp.internal.http.SocketConnector.connectTls(SocketConnector.java:124)
    W/System.err﹕ at com.squareup.okhttp.Connection.connect(Connection.java:143)
    W/System.err﹕ at com.squareup.okhttp.Connection.connectAndSetOwner(Connection.java:185)
    W/System.err﹕ at com.squareup.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128)
    W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:341)
    W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
    W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
    W/System.err﹕ at com.squareup.okhttp.Call.getResponse(Call.java:273)
    W/System.err﹕ at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:230)
    W/System.err﹕ at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:201)
    W/System.err﹕ at com.squareup.okhttp.Call.execute(Call.java:81)
    ...

我做错了什么?

最佳答案

我遇到了同样的问题,但是我需要我的应用程序在多个暂存环境中工作,所有这些环境都具有自签名证书。更糟糕的是,他们可以随时更改这些证书。

为了解决这个问题,仅在连接到登台时,我添加了一个信任所有证书的 SSLSocketFactory。这修复了 java 错误,但是它给我留下了这张票中提到的 okhttp 异常。

为了避免这个错误,我需要在我的 okHttpClient 中再添加一个自定义项。这为我解决了错误。

okHttpClient.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});

关于java - OkHttp javax.net.ssl.SSLPeerUnverifiedException : Hostname domain. com 未验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31917988/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com