2016-06-07 5 views
0

Ich habe ein Stück Code geschrieben, der zu einem Online-Formular auf einer angegebenen URL veröffentlichen muss. Das SSL der Site ist ein selbstsignierendes SSL-Zertifikat. Ich habe alles versucht, aber eine Datei nicht gefunden Ausnahme erhalten. Wenn ich die URL für das Zertifikat angeben, muss es auf den genauen Speicherort der .crt-Datei verweisen?Android: Senden über ein Netzwerk mit selbstsignieren SSL Certs

Bitte schauen Sie auf den Code unten und bitte führe mich in die richtige Richtung:

public static byte[] doPost(String urlString, HashMap<String, String> postData, String certificateName) throws Exception 
{ 
    byte[] result = null; 

    // Load CAs from an InputStream 
    CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); 
    InputStream CAInput = new BufferedInputStream(new FileInputStream(certificateName)); 
    Certificate certificate; 

    certificate = certificateFactory.generateCertificate(CAInput); 
    Dev.debug("Certificate: " + ((X509Certificate)certificate).getSubjectDN()); 
    CAInput.close(); 

    // Create Keystore containing our trusted certificates 
    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
    keyStore.load(null, null); 
    keyStore.setCertificateEntry("tss_certificate", certificate); 

    // Create a TrustManager that trusts the CA in our KeyStore 
    String algorithm = TrustManagerFactory.getDefaultAlgorithm(); 
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm); 
    tmf.init(keyStore); 

    // Create an SSLContext that uses our TrustManager 
    SSLContext context = SSLContext.getInstance("TLS"); 
    context.init(null, tmf.getTrustManagers(), null); 

    // Create URL and connection 
    // The url string is "keystore.crt" 
    URL url = new URL(urlString); 
    HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); 

    // Set connection properties 
    connection.setSSLSocketFactory(context.getSocketFactory()); 
    connection.setRequestMethod("POST"); 
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
    connection.setDoOutput(true); 
    connection.setDoInput(true); 

    // Create an output stream and write encoded data to the stream 
    byte[] output = HttpPost.postEncode(postData).getBytes(); 
    OutputStream out = new BufferedOutputStream(connection.getOutputStream()); 
    out.write(output); 
    out.flush(); 

    // Write to input stream 
    if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) 
    { 
     InputStream in = connection.getInputStream(); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     byte[] buffer = new byte[1024]; 
     int read; 
     while ((read = in.read()) > -1) baos.write(buffer, 0, read); 
     result = baos.toByteArray(); 
    } 

    connection.disconnect(); 

    return result; 
} 

Hier ist die Stacktrace:

06-07 20:16:09.445 2382-4296/techss.fitmentmanager W/System.err: java.io.FileNotFoundException: keystore: open failed: ENOENT (No such file or directory) 
06-07 20:16:09.445 2382-4296/techss.fitmentmanager W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:452) 
06-07 20:16:09.445 2382-4296/techss.fitmentmanager W/System.err:  at java.io.FileInputStream.<init>(FileInputStream.java:76) 
06-07 20:16:09.446 2382-4296/techss.fitmentmanager W/System.err:  at java.io.FileInputStream.<init>(FileInputStream.java:103) 
06-07 20:16:09.446 2382-4296/techss.fitmentmanager W/System.err:  at techss.app_lib.HttpPostCert.doPost(HttpPostCert.java:34) 
06-07 20:16:09.446 2382-4296/techss.fitmentmanager W/System.err:  at techss.fitmentmanager.jobcard.jobcard_steps.JobCardStepSelectStateStaticAsset$2$override.run(JobCardStepSelectStateStaticAsset.java:104) 
06-07 20:16:09.446 2382-4296/techss.fitmentmanager W/System.err:  at techss.fitmentmanager.jobcard.jobcard_steps.JobCardStepSelectStateStaticAsset$2$override.access$dispatch(JobCardStepSelectStateStaticAsset.java) 
06-07 20:16:09.446 2382-4296/techss.fitmentmanager W/System.err:  at techss.fitmentmanager.jobcard.jobcard_steps.JobCardStepSelectStateStaticAsset$2.run(JobCardStepSelectStateStaticAsset.java:0) 
06-07 20:16:09.449 2382-4296/techss.fitmentmanager W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory) 
06-07 20:16:09.449 2382-4296/techss.fitmentmanager W/System.err:  at libcore.io.Posix.open(Native Method) 
06-07 20:16:09.449 2382-4296/techss.fitmentmanager W/System.err:  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
06-07 20:16:09.449 2382-4296/techss.fitmentmanager W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:438) 
06-07 20:16:09.449 2382-4296/techss.fitmentmanager W/System.err: ... 6 more 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:328) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.okhttp.internal.http.SocketConnector.connectTls(SocketConnector.java:103) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.okhttp.Connection.connect(Connection.java:143) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:185) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:341) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:384) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:231) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at techss.app_lib.CSVFile.importCsv(CSVFile.java:19) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at techss.fitmentmanager.jobcard.jobcard_steps.JobCardStepSelectStateStaticAsset$1.run(JobCardStepSelectStateStaticAsset.java:72) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err: Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:318) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.org.conscrypt.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:219) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:115) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:556) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err:  at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:324) 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err: ... 14 more 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err: Caused by: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 
06-07 20:16:09.857 2382-4297/techss.fitmentmanager W/System.err: ... 20 more 

Antwort

0

Sie SSL Ausnahmen erhalten, so dass ich denke, dass Sie Sie versuchen, Ihr Zertifikat von einem nicht vertrauenswürdigen Host herunterzuladen (oder selbstsigniert). Wenn Sie dies tun möchten, haben Sie zwei Möglichkeiten: - Alle Zertifikate überprüfen (dies wird nicht empfohlen, da Sie Angreifern ausgesetzt sind). -Vertrauen Sie nur Ihr selbstsigniertes Zertifikat. Wenn Sie alle Zertifikate vertrauen möchten, hier ist a way to do that (nicht empfohlen). Wenn Sie nur Ihr Zertifikat akzeptieren möchten, dann können Sie es manuell herunterladen und installieren oder wenn Sie es durch Code tun möchten, dann Sie this answer might help you.

+0

Vielen Dank für die schnelle Antwort, aber ich mache genau das, was das zweite Beispiel sagt. Ich erstelle einen Schlüsselspeicher, aber es wirft eine "FileNotFoundException" auf die Keystore-Datei, auf die ich zugreifen möchte. Ich habe eine Schlüsselspeicherdatei auf meinem Server und ich versuche, auf die Zertifikate in dieser Datei zuzugreifen, aber die Datei wurde nicht gefunden, die Teil der Frage war. Muss der Pfad zu diesem Speicherort sein oder wird er vom Server abgeholt? Ich möchte nicht Schritt 1, um vor Angriffen zu schützen, weshalb es Zertifikate gibt. –

+0

Versuchen Sie, die Cert-Datei von einem Thrusted Server auszuwählen? (Hat der Server ein gültiges Zertifikat?) – josemgu91

+0

Ja, ich versuche das Zertifikat von einem Server zu holen. Der Server verfügt über ein gültiges selbstsigniertes Zertifikat in einer KeyStore-Datei. –