summaryrefslogtreecommitdiffstats
path: root/dozentenmodulserver/src/main/java
diff options
context:
space:
mode:
authorSimon Rettberg2015-08-17 21:00:48 +0200
committerSimon Rettberg2015-08-17 21:00:48 +0200
commit269dd50ca6600fe38e59d27898b49ac01b678b7f (patch)
tree8e38388a5dfef7b9b4104a1d7ac7352f573c659c /dozentenmodulserver/src/main/java
parent[server] Add TLS/SSL related classes and functionality (wip) (diff)
downloadtutor-module-269dd50ca6600fe38e59d27898b49ac01b678b7f.tar.gz
tutor-module-269dd50ca6600fe38e59d27898b49ac01b678b7f.tar.xz
tutor-module-269dd50ca6600fe38e59d27898b49ac01b678b7f.zip
[server] Add missing Identity.java
Diffstat (limited to 'dozentenmodulserver/src/main/java')
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/util/Identity.java162
1 files changed, 162 insertions, 0 deletions
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/util/Identity.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/util/Identity.java
new file mode 100644
index 00000000..c288fcab
--- /dev/null
+++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/util/Identity.java
@@ -0,0 +1,162 @@
+package org.openslx.bwlp.sat.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.sql.SQLException;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+
+import org.apache.log4j.Logger;
+import org.openslx.bwlp.sat.database.mappers.DbConfiguration;
+import org.openslx.util.QuickTimer;
+import org.openslx.util.QuickTimer.Task;
+
+public class Identity {
+
+ private static final Logger LOGGER = Logger.getLogger(Identity.class);
+
+ private static final String ALIAS = "dozmod";
+
+ private static final String PASSWORD = "donotchangeme";
+
+ private static KeyStore currentKeyStore = null;
+
+ public static KeyStore loadCertificate() {
+ if (currentKeyStore != null)
+ return currentKeyStore;
+ KeyStore keystore = null;
+ try {
+ keystore = DbConfiguration.loadKeyStore(PASSWORD);
+ } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException | SQLException
+ | IOException e) {
+ LOGGER.error("Could not load existing keystore from database", e);
+ LOGGER.info("Will generate a new temporary key. Please fix the existing key"
+ + " or delete it to permanently generate a new one");
+ }
+ if (keystore == null) {
+ if (!generateCertificate()) {
+ LOGGER.error("Could not create certificate, encrypted connections not supported");
+ return null;
+ }
+ try {
+ keystore = DbConfiguration.loadKeyStore(PASSWORD);
+ } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException | SQLException
+ | IOException e) {
+ LOGGER.error("Error loading key", e);
+ }
+ if (keystore == null) {
+ LOGGER.error("Could not load freshly generated certificate back from db. Something's fishy.");
+ return null;
+ }
+ }
+ currentKeyStore = keystore;
+ return keystore;
+ }
+
+ public static SSLContext getSSLContext() {
+ if (loadCertificate() == null)
+ return null;
+ KeyManagerFactory kmf;
+ try {
+ kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+ kmf.init(currentKeyStore, PASSWORD.toCharArray());
+ } catch (NoSuchAlgorithmException | UnrecoverableKeyException | KeyStoreException e) {
+ LOGGER.warn("Could not create a key manager factory, SSL unavailable", e);
+ return null;
+ }
+ SSLContext sslContext;
+ try {
+ sslContext = SSLContext.getInstance("TLSv1.2");
+ } catch (NoSuchAlgorithmException e) {
+ LOGGER.warn("Could not create a TLS1.2 context, SSL unavailable", e);
+ return null;
+ }
+ KeyManager[] keyManagers = kmf.getKeyManagers();
+ try {
+ sslContext.init(keyManagers, null, null);
+ } catch (KeyManagementException e) {
+ LOGGER.warn("Could not find a suitable cert/key in the keystore. SSL unavailable", e);
+ }
+ return sslContext;
+ }
+
+ private static boolean generateCertificate() {
+ File tmpFile = null;
+ try {
+ tmpFile = File.createTempFile("certfile", ".jks");
+ tmpFile.delete();
+ } catch (IOException e1) {
+ LOGGER.error("Could not generate temp file for self-signed cert container", e1);
+ return false;
+ }
+ try {
+ LOGGER.info("Generating certificate for this server...");
+ final Process proc;
+ try {
+ proc = Runtime.getRuntime().exec(
+ new String[] { "keytool", "-genkeypair", "-alias", ALIAS, "-keyalg", "rsa",
+ "-validity", "3000", "-keypass", PASSWORD, "-storepass", PASSWORD,
+ "-keystore", tmpFile.getAbsolutePath(), "-storetype", "JKS", "-dname",
+ "CN=dozmodserver" });
+ QuickTimer.scheduleOnce(new Task() {
+ @Override
+ public void fire() {
+ try {
+ proc.exitValue();
+ proc.destroy();
+ } catch (IllegalThreadStateException e) {
+ }
+ }
+ }, 10000);
+ } catch (IOException e) {
+ LOGGER.error("Launching keytool failed", e);
+ return false;
+ }
+ int exitCode;
+ try {
+ exitCode = proc.waitFor();
+ } catch (InterruptedException e) {
+ LOGGER.warn("Got interrupted while creating the certificate");
+ proc.destroy();
+ return false;
+ }
+ if (exitCode != 0) {
+ LOGGER.warn("keytool returned exit code " + exitCode);
+ InputStream is = proc.getInputStream();
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+ try {
+ String line;
+ while (null != (line = br.readLine())) {
+ LOGGER.info(line);
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return false;
+ }
+ LOGGER.info("Certificate successfully created!");
+ try {
+ DbConfiguration.saveKeyStore(tmpFile);
+ } catch (SQLException | IOException e) {
+ LOGGER.error("Could not import generated keystore to database", e);
+ return false;
+ }
+ return true;
+ } finally {
+ tmpFile.delete();
+ }
+ }
+
+}