Drucken

SSL-Server in Java

Um einen SSL-Server zu programmieren, bringt Java alle Voraussetzungen mit. In wenigen Schritten hat man dies erledigt.

Zusätzlich benötigt man den Key-Store, welcher den Private-Key, das Zertifikat, das Root-Zertifikat (CA-Authority) sowie die eventuell notwendigen Zwischen-Zertifikate enthält. Der Private-Key ist ebenso wie der Key-Store mit einem Password gesichert.

 

import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import java.security.GeneralSecurityException;
import java.security.KeyStore;
import javax.net.ServerSocketFactory;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;

public class SSLServer {
	
		
	public SSLServer(String host,String keystoreFilename,String keystorePassword,String privateKeyPassword) 
			throws GeneralSecurityException, IOException
	{

		// KeyStore laden
		KeyStore keyStore = KeyStore.getInstance("JKS");
		keyStore.load(new FileInputStream(keystoreFilename), keystorePassword.toCharArray());


		//KeyManager 
		KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
		kmf.init(keyStore,privateKeyPassword.toCharArray());

		//SSLContext erzeugen
		SSLContext sslcontext = SSLContext.getInstance("SSLv3");
		sslcontext.init(kmf.getKeyManagers(), null, null);
		ServerSocketFactory socketFactory = sslcontext.getServerSocketFactory();

		// Https-Socket an Port 443 
		ServerSocket socket = socketFactory.createServerSocket(443, 0, InetAddress.getByName(host));

		listen(socket);
	}

	private void listen(ServerSocket socket) throws IOException {
		while(true)
		{
			Socket cl = socket.accept();
			/* Input und Outputstream oeffen und so weiter */
		}
	}
}

 

Key-Store erstellen

Der folgende Befehl erzeugt den öffentlichen und den privaten Schlüssel mit jeweils 2048 Bit Länge und speichert sie zusammen in der Datei keystore.key

server:~/# jdk/bin/keytool  -genkey -keyalg RSA -keysize 2048  -keystore keystore.key -validity 360
Geben Sie das Keystore-Passwort ein:  
Geben Sie das Passwort erneut ein: 
Wie lautet Ihr Vor- und Nachname?
 [Unknown]:  www.hostname.tld
Wie lautet der Name Ihrer organisatorischen Einheit?
 [Unknown]:  
Wie lautet der Name Ihrer Organisation?
 [Unknown]:  Max Mustermann
Wie lautet der Name Ihrer Stadt oder Gemeinde?
 [Unknown]:  Musterstadt
Wie lautet der Name Ihres Bundeslandes oder Ihrer Provinz?
 [Unknown]:  Bayern
Wie lautet der Landescode (zwei Buchstaben) für diese Einheit?
 [Unknown]:  DE
Ist CN=rotanstreichen.de, OU=Unknown, O=Dirk Friedenberger, L=Waldaschaff, ST=Bayern, C=DE richtig?
 [Nein]:  Ja

Geben Sie das Passwort für  ein.
        (EINGABETASTE, wenn Passwort dasselbe wie für Keystore):

CSR erstellen

Der folgende Befehl liest den öffentlichen Schlüssel aus der Key-Datei und erstellt damit einen sogenannten Certificate Signing Request (CSR). Der CSR enthält üblicherweise Angaben zum Inhaber des Schlüssels wie Organisation, Land, Ort, E-Mail-Adresse und die Adresse des Servers (Common Name, CN) für die das Zertifikat ausgestellt werden soll. Daneben enthält der CSR den öffentlichen Schlüssel. Den CSR schickt man zur Certificate Authority, die ein Zertifikat erstellt. Das Zertifikat wiederum enthält den öffentlichen Schlüssel, Angaben zum Inhaber und zum Aussteller sowie die digitale Signatur des Ausstellers über alle enthaltenen Informationen und den Schlüssel. Damit ist der Schlüssel an eine Identität gebunden.

server:~/# jdk/bin/keytool -certreq -keyalg RSA -keysize 2048 -keystore keystore.key -file domain.csr 
Geben Sie das Keystore-Passwort ein:  
server:~/# catdomain.csr 
-----BEGIN NEW CERTIFICATE REQUEST-----
MIICxDCCAawCAQAwfzELMAkGA1UEBhMCREUxDzANBgNVBAgTBkJheWVybjEUMBIGA1UEBxMLV2Fs
ZGFzY2hhZmYxGzAZBgNVBAoTEkRpcmsgRnJpZWRlbmJlcmdlcjEQMA4GA1UECxMHVW5rbm93bjEa
MBgGA1UEAxMRcm90YW5zdHJlaWNoZW4uZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
...
PQ3wC5J8spvX8+jEaI99cBSD6LNcQOX+mgaEVg==
-----END NEW CERTIFICATE REQUEST-----

 

Der CSR wird nun beim entsprechenden Certificate Authority (zum Beispiel www.psw.net) eingereicht und nach verschieden validierungsschritten erhält man ein Zertifikats-Bundle, dass das Root-Zertifikat, evtuelle Zwischenzertifikate und das Zertifikat für die eigenen Domain enthält. Diese müssen nun im Keystore gespeichert werden.

Zertifikate in Keystore speichern

Root-Zertifikat (CA-Authority)

jdk/bin/keytool -keystore keystore.key -import -trustcacerts -alias root -file root.crt

Zwischen-Zertifikat

jdk/bin/keytool -keystore keystore.key -import -trustcacerts -alias INTER -file intermediate1.crt

Zertifikat für eigenen Key

jdk/bin/keytool -keystore keystore.key -import -trustcacerts -alias mykey -file certificate.crt

Key-Store anzeigen


server:~# jdk/bin/keytool -list -keystore keystore.key
Geben Sie das Keystore-Passwort ein:
Keystore-Typ: JKS
Keystore-Provider: SUN
Ihr Keystore enthält 2 Einträge.
root, 08.06.2010, trustedCertEntry,
Zertifikatsfingerabdruck (MD5): 64:9C:EF:2E:AA:FC:12:8F:52:07:D0:51:73:8F:CB:3D
mykey, 09.06.2010, PrivateKeyEntry,
Zertifikatsfingerabdruck (MD5): E0:5C:6F:23:5B:CD:96:E3:5D:96:5C:33:63:98:A8:15

 

Kategorie: How-To
Zugriffe: 1926