Ich versuche seit Tagen, das zum Laufen zu bringen. Ich versuche, eine Verbindung zu meinem Server herzustellen https mit einem selbstsignierten Zertifikat. Ich glaube, es gibt keine Seiten oder Beispiele, die ich noch nicht gelesen habe.
Was habe ich getan:
- Erstellen Sie den bks-Schlüsselspeicher, indem Sie diesem Tutorial folgen: http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html
Es benutzt openssl s_client -connect domain.com:443
um das Zertifikat vom Server zu erhalten. Erstellt dann einen bks-Keystore mit Hüpfburg.
-
Lesen des erstellten Keystores aus dem Raw-Ordner, Hinzufügen zu sslfactory und dann zu OkHttpClient. So was:
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(); }
-
Dies erzeugt aus irgendeinem Grund immer a
SSLPeerUnverifiedException
mit oder ohne Keystore. Und mit oder ohneCertificatePinner
.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) ...
Was mache ich falsch?
Bitte überprüfen Sie, ob Ihr Zertifikat den tatsächlichen Hostnamen und nicht die IP-Adresse enthält (IP-Adressen sollten in
Subject Alternative Name
Zertifikatsfeld). Wie fürHostnameVerifier
was true zurückgibt – es macht SSL nutzlos und unsicher (am meisten positiv bewertete Antwort). Auf modernen Androids können Sie Ihr selbstsigniertes Zertifikat problemlos über die Sicherheitseinstellungen installieren.– Boris Treuchow
6. Juli 2016 um 9:59 Uhr