1. Hast Du Lust, bei uns mitzuarbeiten und das AH-Team zu verstärken? Alle Details zu dieser aktuellen Herausforderung findest Du hier.
  1. RED-BARON, 13.10.2009 #1
    RED-BARON

    RED-BARON Threadstarter Android-Hilfe.de Mitglied

    Hallo :eek:

    zum Glück habe ich ein Anhaltspunkt und weiß genau wo ich hin muss.
    Zur Verdeutlichung hier der Ablauf in einer anderen App, welcher nach
    Android/Java gebracht werden soll.

    Es existiert ein verbundener Socket, der in SSL-Mode versetzt werden soll.
    Die bisherige App macht das mit openSSL wie folgt.

    // Methode festlegen
    m_pSSLMethod = TLSv1_client_method();
    // Context erstellen
    m_pSSLContext = SSL_CTX_new(m_pSSLMethod);
    // selbst signiertes Serverzertifikat, nicht in Cert-chain einer
    // der großen bekannten CAs enthalten !
    SSL_CTX_load_verify_locations(m_pSSLContext, CA_CERT);
    // Clientzertifikat laden
    SSL_CTX_use_certificate_file(m_pSSLContext, CERT_CLIENT, SSL_FILETYPE_PEM);
    // Clientkey laden
    SSL_CTX_use_PrivateKey_file(m_pSSLContext, PRIV_CLIENT, SSL_FILETYPE_PEM);

    soweit die Vorbereitungen, und nun der SSL-Handshake

    // SSL initalisieren ...
    m_pSSL = SSL_new(m_pSSLContext);
    // ... den bereits verbundenen Socket an SSL Layer übergeben
    SSL_set_fd(m_pSSL, m_sock);
    // ... Status setzten
    SSL_set_connect_state(m_pSSL);
    // Handshake
    SSL_do_handshake(m_pSSL);



    Mein Problem ist nur den Wald vor Bäumen nicht zu sehen :D

    obwohl ich diesmal schon ein paar Infos hab sammeln können
    wie dieses Beispiel:
    SSLContext and Key manager : SSL SocketSecurityJava Tutorial

    und diese Meldung habe ich auch schon im Debugger gesehen :rolleyes:
    [android-developers] CertPathValidatorException: TrustAnchor for CertPat


    wie schauen nun meine Codefragmente in Java aus:

    // Context erstellen mit TLS Methode
    SSLContext ctx = SSLContext.getInstance("TLS");

    // :confused: , laden der Zertifikate, wobei ich diese als
    // -----BEGIN CERTIFICATE-----
    // und
    // -----BEGIN RSA PRIVATE KEY-----
    // vorliegen habe
    //
    // hier fehlt mir ebend der entscheidende Teil



    // SSLSocket an bestehenden Socket binden
    SSLSocketFactory f = (SSLSocketFactory) SSLSocketFactory.getDefault();​
    // :confused: : SSLSocket mit SSLContext "initalisiere"


    SSLSocket c =(SSLSocket)f.createSocket(
    mSocket, mHost, mPort, false);
    // Handshake

    c.startHandshake();



    Mein Problem ist nicht besonders androidspezifisch, bestenfalls - wie
    bekomme ich meine Zerti-Dateien in den Emulator geladen. Weil ohne
    die da drin zu haben muss ich wohl mit InputStream garnicht erst an-
    fangen.


    Herzlichen Dank fürs Kopfzerbrechen schon mal :rolleyes:
     
  2. RED-BARON, 19.10.2009 #2
    RED-BARON

    RED-BARON Threadstarter Android-Hilfe.de Mitglied

    :)

    macht die Verschlüsselung zwar etwas sinnlos aber es funktioniert
    erstmal so:

    Code:
    [LEFT][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]final[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] TrustManager[] trustAllCerts = [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] TrustManager[] {[/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] X509TrustManager(){ [/SIZE]
    [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]public[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] java.security.cert.X509Certificate[] getAcceptedIssuers(){[/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]return[/COLOR][/SIZE][/COLOR][/SIZE][/B][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]null[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2]; }[/SIZE]
    [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]public[/COLOR][/SIZE][/COLOR][/SIZE][/B][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]void[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType){}[/SIZE]
    [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]public[/COLOR][/SIZE][/COLOR][/SIZE][/B][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]void[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType){}[/SIZE][/LEFT]
    
    Code:
    [SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]mSSLContext[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] = SSLContext.[I]getInstance[/I]([/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"TLS"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]);[/SIZE]
    [LEFT][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]mSSLContext[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].init([/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]null[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2], trustAllCerts, [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]null[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2]); [/SIZE][SIZE=2][COLOR=#3f7f5f][SIZE=2][COLOR=#3f7f5f]//new java.security.SecureRandom());[/COLOR][/SIZE][/COLOR][/SIZE]
    [SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]mSSLSocketFactory[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] = [/SIZE][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]mSSLContext[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].getSocketFactory();[/SIZE]
    [SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]mSocket[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] = (SSLSocket)[/SIZE][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]mSSLSocketFactory[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].createSocket([/SIZE][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]mSocket[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]mHost[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]mPort[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]true[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2]);[/SIZE]
    [SIZE=2]((javax.net.ssl.SSLSocket)[/SIZE][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]mSocket[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]).addHandshakeCompletedListener([/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] MyHandshakeListener());[/SIZE]
    [SIZE=2]((javax.net.ssl.SSLSocket)[/SIZE][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]mSocket[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]).startHandshake(); [/SIZE]
    [SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]mSocket[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].getOutputStream().flush();[/SIZE][/LEFT]
    
    demnach braucht es das Clientzertifikat und den privaten Schlüssel nicht.
     
  3. t-droid, 10.12.2009 #3
    t-droid

    t-droid Neuer Benutzer

    Hallo,
    vorneweg: Ich bin kein Coder und habe erst seit ein paar Tagen das HTC Tattoo/Android Phone). Trotzdem habe ich das Gefühl das der Beitrag nahe an meinem Problem liegt:

    Ich benütze für meine beruflichen Emails einen Account auf einem eigenen Server mit einem selbst - signierten Zertifikat.

    Das Abrufen der Mails via HTC Mail (HTC Tattoo) oder K9 funktionert einwandfrei, aber das senden (SMTP mit SSL) versagt. Meldung:
    "Verbindung mit Mailserver kann nicht hergestellt werden um Kontoinformationen zu prüfen. Der Server reagiert nicht."

    Meine Hypothese: Es stimmt etwas mit der Authentifizierung nicht, da der Client das Zertifikat nicht liefert. Jetzt habe ich schon etwas im Netz gestöbert und es gibt wohl auf Android keine Möglichkeit Zertifikate einzufügen/einzusehen (Astro als Filemanger finde ich nichts).

    Habt ihr eine Idee wie ich die Nuß knacken kann...?
     
  4. arez, 10.12.2009 #4
    arez

    arez Android-Experte

    Ich habe mal irgendwo gelesen, dass man das Zertifikat mit dem Browser aufrufen soll, damit diese in den Android Zertifikatsspeicher gelegt wird - vielleicht hilft Dir das ja weiter.

    Viele Grüße,
    arez
     
  5. t-droid, 11.12.2009 #5
    t-droid

    t-droid Neuer Benutzer

    Hallo,
    erstmal danke für die Antwort...

    Jippee - Habs hinbekommen!

    Es könnte gut sein, daß die Methode zumindest Teil der Lösung war: Habe nämlich die URL mal in den Browser kopiert und das Online Mail Programnm besucht. Dabei kam die Meldung wegen des selbst-signierten Zertifikats - beim erneuten aufrufen nicht mehr.

    Dannach bin ich nochmal meine Einstellungen im Mail Programm durch gegangen und habe noch mal diverses probiert: Und siehe da plötzlich hat es funktionert!! Dabei habe ich mal die Verschlüsselung zufällig von SSL auf TLS gestellt.

    Ein glücklicher Android Benürtzer mehr!
     
  6. arez, 11.12.2009 #6
    arez

    arez Android-Experte

    Schön, wie gesagt, ich habe mal irgendwo gelesen, dass es noch ein Android-Bug ist, dass man die Zertifikate nur über Websites integrieren kann und nicht selbst...

    Viele Grüße,
    arez
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
[OFFEN] SharedPreferences und ViewPager, unique key Android App Entwicklung 06.06.2017
Woher bekomme ich einen öffentlichen Server ? Android App Entwicklung 02.03.2017
Bei Erreichbarkeit eines Servers eine APP starten Android App Entwicklung 12.02.2017
Speichern von Server-Verbindungsdaten (Benutzereingabe) Android App Entwicklung 12.01.2017
Verbindung zu FTP Server schlägt fehl Android App Entwicklung 10.01.2017
Python Server / Android Client-Socket-Error Android App Entwicklung 03.11.2016
Datenübertragung zwischen Server PC und Client Android Android App Entwicklung 26.10.2016

Users found this page by searching for:

  1. android java X509TrustManager

    ,
  2. Account X509TrustManager

    ,
  3. keine sichere verbindung zum server möglich (java.security.cert.certPathValidatorException:

Du betrachtest das Thema "SSL, Server / Client cert, Client private key" im Forum "Android App Entwicklung",