Hallo Community,
es existiert eine selbstsignierte CA. Das Serverzertifikat und das Clientzertifikat
ist von dieser CA signiert. Die Zertifikate sind in Ordnung und funktionieren mit
einer anderen Anwendung. Die Zertifikate liegen im PEM Format als base46 String
vor.
Aufgabe:
Ein verbundener Socket soll in SSL-Mode versetzt werden soll.
Problem:
ich bin noch recht neu bei Java, Zielplatform ist "Android" - OS.
Die bestehende Lösung sieht wie Folgt aus: ( C++ Code, openSSL )
// Methode festlegen
m_pSSLMethod = TLSv1_client_method();
// Context erstellen
m_pSSLContext = SSL_CTX_new(m_pSSLMethod);
// 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);
Wie sieht aber nun der Ablauf in Java aus ?
Ich habe bisher nur folgenden Einstieg:
SSLContext ctx = SSLContext.getInstance("TLS");
SSLSessionContext sessctx = ctx.getClientSessionContext();
// wie läd man hier die Zertifikat-Strings in den Context ?
// wie wird der Context mit dem SSL-Socket "verbunden"
SSLSocketFactory f = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket c =(SSLSocket)f.createSocket(mSocket, mHost, mPort, false);
c.startHandshake();
Ergebnis:
Der Server sendet sein Zertifikat, es wird eine "not trusted"-Exception gewurfen.
Trustet kann das Zerti auch erst sein, nachdem der Client das ServerZert *irgendwie*
geladen hat. Zudem muss der Client auch sein Zertifikat und private Key laden um
Daten verschlüsselt senden zu können.
Anwendung soll das ganze finden beim Datenaustausch mit einem MySQL-Server.
Das Protokoll ist soweit schon implementiert, nur die Umschaltung in SSL fehlt noch.
Ich habe schon einige Tuturial angesehen und auch im Forum gesucht, nur vll.
kennt das jemand - den Wald vor Bäumen nicht zu sehen ;(
Ich freue mich jedenfalls über jede sachdienliche Hinweise
Viele Grüße, RB
Edit: neuer Code in Anlehnung an:
http://www.java-forum.org/netzwerkprogrammierung/79529-https-einloggen.html#post491246
Ergebnis: Exception: not trusted server certificate
es existiert eine selbstsignierte CA. Das Serverzertifikat und das Clientzertifikat
ist von dieser CA signiert. Die Zertifikate sind in Ordnung und funktionieren mit
einer anderen Anwendung. Die Zertifikate liegen im PEM Format als base46 String
vor.
Aufgabe:
Ein verbundener Socket soll in SSL-Mode versetzt werden soll.
Problem:
ich bin noch recht neu bei Java, Zielplatform ist "Android" - OS.
Die bestehende Lösung sieht wie Folgt aus: ( C++ Code, openSSL )
// Methode festlegen
m_pSSLMethod = TLSv1_client_method();
// Context erstellen
m_pSSLContext = SSL_CTX_new(m_pSSLMethod);
// 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);
Wie sieht aber nun der Ablauf in Java aus ?
Ich habe bisher nur folgenden Einstieg:
SSLContext ctx = SSLContext.getInstance("TLS");
SSLSessionContext sessctx = ctx.getClientSessionContext();
// wie läd man hier die Zertifikat-Strings in den Context ?
// wie wird der Context mit dem SSL-Socket "verbunden"
SSLSocketFactory f = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket c =(SSLSocket)f.createSocket(mSocket, mHost, mPort, false);
c.startHandshake();
Ergebnis:
Der Server sendet sein Zertifikat, es wird eine "not trusted"-Exception gewurfen.
Trustet kann das Zerti auch erst sein, nachdem der Client das ServerZert *irgendwie*
geladen hat. Zudem muss der Client auch sein Zertifikat und private Key laden um
Daten verschlüsselt senden zu können.
Anwendung soll das ganze finden beim Datenaustausch mit einem MySQL-Server.
Das Protokoll ist soweit schon implementiert, nur die Umschaltung in SSL fehlt noch.
Ich habe schon einige Tuturial angesehen und auch im Forum gesucht, nur vll.
kennt das jemand - den Wald vor Bäumen nicht zu sehen ;(
Ich freue mich jedenfalls über jede sachdienliche Hinweise
Viele Grüße, RB
Edit: neuer Code in Anlehnung an:
http://www.java-forum.org/netzwerkprogrammierung/79529-https-einloggen.html#post491246
Java:
final TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager(){
public java.security.cert.X509Certificate[] getAcceptedIssuers(){return null; }
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType){}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType){}
}};
new MySQLLoginPacket40(user, passwd, mServer, mSocket.getOutputStream());
if( (mServer.mCapabilities & MySQLServerPacket.CLIENT_SSL) > 0)
{
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, trustAllCerts, new java.security.SecureRandom());
SSLSocketFactory f = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket c =(SSLSocket)f.createSocket(mSocket, mHost, mPort, false);
c.startHandshake();
c.getOutputStream();
}
Ergebnis: Exception: not trusted server certificate
Zuletzt bearbeitet: