1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

SSL, Server / Client cert, Client private key

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von RED-BARON, 13.10.2009.

  1. RED-BARON, 13.10.2009 #1
    RED-BARON

    RED-BARON Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    146
    Erhaltene Danke:
    19
    Registriert seit:
    06.10.2009
    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

    Beiträge:
    146
    Erhaltene Danke:
    19
    Registriert seit:
    06.10.2009
    :)

    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

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    10.12.2009
    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

    Beiträge:
    514
    Erhaltene Danke:
    53
    Registriert seit:
    30.04.2009
    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

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    10.12.2009
    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

    Beiträge:
    514
    Erhaltene Danke:
    53
    Registriert seit:
    30.04.2009
    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
     

Diese Seite empfehlen