OkHttp javax.net.ssl.SSLPeerUnverifiedException: nom d'hôte domain.com non vérifié

J'ai essayé pendant des jours pour obtenir ce travail. J'essaie de me connecter à mon serveur sur https avec un certificat auto-signé. Je ne pense pas qu'il y est une quelconque des pages ou des exemples que je n'ai pas lu à ce jour.

Ce que j'ai fait:

  1. Créé bks fichier de clés en suivant ce tutoriel: http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

Il utilise openssl s_client -connect domain.com:443 pour obtenir le certificat du serveur. Puis crée un bks fichier de clés à l'aide de château gonflable.

  1. De lecture créé fichier de clés à partir des matières premières dossier de l'ajouter à sslfactory et puis à OkHttpClient. Comme ceci:

    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. Cela pour une raison quelconque, cela génère toujours un SSLPeerUnverifiedException avec ou sans le fichier de clés. Et avec ou sans la 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)
    ...

Ce que je fais mal?

source d'informationauteur just_user