Java API mit Zertifikaten

Veröffentlicht von

Hier ein Code-Beispiel, wie man mit Java und einem Zertifikat eine Anfrage an eine ASP.NET API-Anwendung stellen kann.

Libraries

  • OKHttp 4.8.1

Code

package com.indiClient.utilities;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Date;
import java.util.Enumeration;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class APIClientTest {
	
	private final String url = "https://example.com:5001";
	private final String pfxKeyStore = "<Location to Cert>\\cert.pfx";
	private final String pfxKeyStorePW = "1234";
	private final String javaTrustStorePW = "changeit"; // runtime/lib/security/cacerts
	
	private boolean infos = false;
	private boolean massage = false;
	
	public APIClientTest() {

		// Test ohne Zertifikat
		getRequest(getClient(), url + "/api/Test", "GET");
		getRequest(getClient(), url + "/api/Test", "POST");
		getRequest(getClient(), url + "/weatherforecast", "GET");		
		getRequest(getClient(), url + "/weatherforecast/auth", "GET");
		
		// Test mit Zertifikat
		getRequest(getClientWithCert(), url + "/api/Test", "GET");
		getRequest(getClientWithCert(), url + "/api/Test", "POST");
		getRequest(getClientWithCert(), url + "/weatherforecast", "GET");		
		getRequest(getClientWithCert(), url + "/weatherforecast/auth", "GET");		
	}

	
	private void getRequest(OkHttpClient client, String requestUrl, String method)  {
		
		System.out.println("------------------------ " + requestUrl + " - " + method +" ------------------------");
		
		try {
			
			MediaType mediaType = MediaType.parse("text/plain");
			RequestBody body = RequestBody.create(mediaType, "");
			
			Request request = null;
			
			if (method.equalsIgnoreCase("get")) {
				request = new Request.Builder()
					    .url(requestUrl)			    
					    .method(method, null)			   
					    .build();
			} else {
				request = new Request.Builder()
					    .url(requestUrl)			    
					    .method(method, body)			   
					    .build();
			}

			Response response = client.newCall(request).execute();

		    System.out.println("Status: " + response.code());	
		    if (massage) {
		    	System.out.println("Message: " + response.body().string());
			}			    
		    System.out.println("\n");
		} catch (IOException e) {
			e.printStackTrace();
		} 
	}
	
	
	private OkHttpClient getClient()  {
		OkHttpClient client = new OkHttpClient.Builder()
				.build();			
		return client;
	}
	
	private OkHttpClient getClientWithCert()  {
		try {
			KeyStore keystore = getKeyStore();	  
			X509Certificate cert = getCert(keystore);
			KeyStore trustStore = getTrustStore();

			// Wrap it up in an SSL context.
			KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(
			    KeyManagerFactory.getDefaultAlgorithm());
			keyManagerFactory.init(keystore, pfxKeyStorePW.toCharArray());
  
			TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
					TrustManagerFactory.getDefaultAlgorithm());
			trustManagerFactory.init(trustStore);
			TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
	      
			SSLContext sslContext = SSLContext.getInstance("TLS");
			sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(),
					new SecureRandom());

			OkHttpClient client = new OkHttpClient.Builder()
	              .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustManagers[0])
	              .build();
			
			    return client;
		} catch (NoSuchAlgorithmException | UnrecoverableKeyException | KeyStoreException | KeyManagementException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	private KeyStore getTrustStore() {
		try {
			File runtime = getRuntimeLocation().getParentFile().getParentFile();
		    String relativeCacertsPath = runtime + "/lib/security/cacerts".replace("/", File.separator);
		      
		    if (!new File(relativeCacertsPath).exists()) {
		    	System.err.println("Java KeyStore konnte nicht gefunden werden: " + relativeCacertsPath);
		    } else {
		    	System.out.println("Java KeyStore gefunden: " + relativeCacertsPath);
		    }
		      
		    KeyStore trustStore = KeyStore.getInstance("JKS");
		    trustStore.load(new FileInputStream(relativeCacertsPath), javaTrustStorePW.toCharArray());

	        return trustStore;	          
	    } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException | IOException e) {
	        e.printStackTrace();
	    }		  
		return null;	  
	}
	
	private KeyStore getKeyStore() {
		try {
	        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
	        KeyStore keystore = KeyStore.getInstance("PKCS12", "SunJSSE");

	        keystore.load(new FileInputStream(pfxKeyStore), pfxKeyStorePW.toCharArray());
	        kmf.init(keystore, pfxKeyStorePW.toCharArray());

	        return keystore;	          
	    } catch (Exception e) {
	        e.printStackTrace();
	    }		  
		return null;	  
	}
	  
	private X509Certificate getCert(KeyStore keystore) {
		try {
			Enumeration<String> aliases = keystore.aliases();
			while(aliases.hasMoreElements()){
				String alias = aliases.nextElement();
				if(keystore.getCertificate(alias).getType().equals("X.509")){
					Date expDate = ((X509Certificate) keystore.getCertificate(alias)).getNotAfter();
					Date fromDate= ((X509Certificate) keystore.getCertificate(alias)).getNotBefore();
					if (infos) {
						System.out.println("alias: " + keystore.getCertificate(alias) );
						System.out.println("Expiray Date:-"+expDate );
						System.out.println("From Date:-"+fromDate);		
					}		      
					return (X509Certificate) keystore.getCertificate(alias); 
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}	  
		return null;
	}
	  
	private File getRuntimeLocation() {
		final String javaLibraryPath = System.getProperty("java.library.path");
		final File javaExeFile = new File(javaLibraryPath.substring(0, javaLibraryPath.indexOf(';')) + "\\java.exe");
		final String javaExePath = javaExeFile.exists() ? javaExeFile.getAbsolutePath() : "java";
		if (infos) {
			System.out.println("javaLibraryPath: " + javaLibraryPath);
			System.out.println("javaLibraryPath: " + javaExeFile);
			System.out.println("javaLibraryPath: " + javaExePath);	
		}   
			    
		if (javaExeFile.exists()) {
			return javaExeFile;
		} else {
			return null;
		}
	}
	  
	public static void main(String[] args) {
		new APIClientTest();
	}
}
Code-Sprache: JavaScript (javascript)