SSL, Server / Client cert, Client private key

R

RED-BARON

Fortgeschrittenes Mitglied
19
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:
 
:)

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.
 
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...?
 
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
 
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!
 
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
 

Ähnliche Themen

M
  • maksimilian
Antworten
6
Aufrufe
1.003
jogimuc
J
M
  • maksimilian
Antworten
2
Aufrufe
1.212
maksimilian
M
M
  • maksimilian
Antworten
4
Aufrufe
1.208
jogimuc
J
Zurück
Oben Unten