2013-04-24 20 views
8

Gibt es eine option zum verschlüsseln keystorePass wert in tomcat server.xml? Ich will nicht, es ist ein Klartext zu Ihrem server.xml Zugang zu sein, ist der Klartext Wert Ihrer keys erscheintVerschlüsseln tomcat keystore passwort

<Connector port="8403" //... 
     keystorePass="myPassword" /> 
+1

Wo waren Sie zum Speichern des Verschlüsselungsschlüssels zu denken, das Passwort zu entsperren die keys zu entsperren? Nur aus Interesse. – david99world

+1

Ich bin mir bewusst, dass dies keine einfache Frage ist. Ich möchte wissen, ob es eine Standardlösung gibt. – AdiB

+0

Nein, es gibt eine andere Standardlösung als _maybe_, die den Connector wie unten erwähnt überschreibt, aber das ist in keiner Weise eine Standardlösung und eher ein Down-Right-Hack. – david99world

Antwort

10

Wenn jemand nur eine Ihrer Sorgen.

Wenn jemand Zugriff von dort hat, könnten sie viel mehr Schaden anrichten. Wenn Sie das Passwort hier verschlüsseln, verschieben Sie das Problem einfach woanders hin, denn dann könnte jemand den Verschlüsselungsschlüssel für diesen Verschlüsselungsschlüssel finden (ein bisschen wie eine russische Puppe).

Wenn Sie das Passwort verschlüsseln möchten, müssen Sie die Connector Implementierung überschreiben, um das verschlüsselte Passwort zu entschlüsseln, so dass das echte Passwort zugänglich oder für Tomcat verfügbar ist.

+0

Eine kleine Korrektur - da die Anschlüsse final sind (zumindest bei Tomcat 7) ist es das Protokoll, das man überschreiben muss – AdiB

+0

Könnte ich bitte bitte Sie, welches Protokoll man überschreiben muss? und wie? – Hasan

+0

Ich stimme dem oben nicht zu. Der ganze Punkt der Sicherheit ist eine geschichtete Verteidigung. In der Cloud ist es beispielsweise möglich, Daten zu verschlüsseln und dann über IAM (auf aws) den Zugriff auf die Verschlüsselungsschlüssel zu ermöglichen. Passwörter auf der Festplatte im Klartext zu halten ist nur eine schlechte Sicherheit. Solche Geheimnisse sollten immer nur in ihrer entschlüsselten Form im Prozess gespeichert werden. –

5

Mit dem gleichen Problem konfrontiert. Der Kunde fordert, alle Passwörter zu "verstecken".

So, einfachste Art, Audit zu bestehen - von Tomcat Wiki.

Gehen Sie auf Seite http://coderstoolbox.net/string/#!encoding=xml&action=encode&charset=none und codieren Sie übergeben an XML-View.

So - <Connector> Element wie folgt aussieht:

<Connector 
    port="8443" 
    protocol="HTTP/1.1" 
    SSLEnabled="true" 
    enableLookups="false" 
    disableUploadTimeout="true" 
    scheme="https" 
    secure="true" 
    clientAuth="want" 
    sslProtocol="TLS" 
    keystoreFile="conf/.ssl/keystore.jks" 
    keyAlias="tomcat" 
    keystorePass="&#99;&#104;&#105;&#107;&#115;" 
    truststoreFile="conf/.ssl/trustedstore.jks" 
    truststorePass="&#99;&#104;&#105;&#107;&#115;" 
/> 
7

Es gibt einen besseren Weg, als nur den XML kodieren verwenden.

Erstellen Sie eine Verschlüsselungsklasse zum Verschlüsseln und Entschlüsseln Ihres Kennworts.

Und überschreiben Http11Nio2Protocol Klasse, etwas ähnlich wie der unten stehenden Code.

public class Http11Nio2Protocol extends org.apache.coyote.http11.Http11Nio2Protocol { 

@Override 
public void setKeystorePass(String s) { 
    try { 
     super.setKeystorePass(new EncryptService().decrypt(s)); 
    } catch (final Exception e){ 
     super.setKeystorePass(""); 
    } 
} 

}

Hinweis: EncryptService ist unsere eigene Verschlüsselungsklasse.

Und konfigurieren Sie die überschriebene Klasse im Protokoll-Attribut in server.xml wie unten.

<Connector port="8443" protocol="<com.mypackage.overridden_Http11Nio2Protocol_class>" 
      maxThreads="150" SSLEnabled="true" scheme="https" secure="true" 
      clientAuth="false" sslProtocol="TLS" 
      keystoreFile="conf/.ssl/keystore.jks"   
      keystorePass="<encrypted_password>"/> 

Hoffe das hilft.

+0

Ja, genau das haben wir gemacht. Siehe meinen Kommentar zu der akzeptierten Antwort. – AdiB

+0

Ich habe diese Lösung versucht, aber ich bekomme den Fehler: '' java.lang.ClassNotFoundException: listener.Http11Nio2Protocol''. –

+0

Ich habe implementiert, dass es nicht die Methode setKeystorePass liest !! – Hasan

0

Wir hatten auch ein ähnliches Problem, aber wir haben unsere eigene Verschlüsselungs- und Entschlüsselungslogik entwickelt, um das Problem anzugehen. Hier ist der Code

/* class is used to generate encrypted password */ 

public class ClientForPasswordGeneration { 

    public static void main(String[] args) { 
     //final String secretKey = "ssshhhhhhhhhhh!!!!"; 
     final String secretKey = PasswordKey.getEncryptionKey(); 
     GenerateLogic object = new GenerateLogic(); 

     String password = PasswordField.readPassword("Enter password: "); 

     String encryptPassword = object.encrypt(password, secretKey); 
     System.out.println("Encrypted Password:"); 
     System.out.println(encryptPassword); 

    } 

} 

Eine andere Klasse

class EraserThread implements Runnable { 
    private boolean stop; 

    /** 
    * @param The 
    *   prompt displayed to the user 
    */ 
    public EraserThread(String prompt) { 
     System.out.print(prompt); 
    } 

    /** 
    * Begin masking...display asterisks (*) 
    */ 
    public void run() { 
     stop = true; 
     while (stop) { 

      System.out.print("\010*"); 

      try { 

       Thread.currentThread().sleep(1); 
       // System.out.println("current thread::" + Thread.currentThread()); 
      } catch (InterruptedException ie) { 
       ie.printStackTrace(); 
      } 
     } 
    } 

    /** 
    * Instruct the thread to stop masking 
    */ 
    public void stopMasking() { 
     this.stop = false; 
    } 

} 

Logik, die Hash-Code erzeugt

import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.util.Arrays; 
import java.util.Base64; 

import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec; 

public class GenerateLogic { 
    private static SecretKeySpec secretKey; 
    private static byte[] key; 

    public static void setKey(String myKey) { 
     MessageDigest sha = null; 
     try { 
      key = myKey.getBytes("UTF-8"); 
      sha = MessageDigest.getInstance("SHA-1"); 
      key = sha.digest(key); 
      key = Arrays.copyOf(key, 16); 
      secretKey = new SecretKeySpec(key, "AES"); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static String encrypt(String strToEncrypt, String secret) { 
     try { 
      setKey(secret); 
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
      cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
      return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8"))); 
     } catch (Exception e) { 
      System.out.println("Error while encrypting: " + e.toString()); 
     } 
     return null; 
    } 

    public static String decrypt(String strToDecrypt) { 
     try { 
      //System.out.println("decryptedString methods"); 
      //String secret = "ssshhhhhhhhhhh!!!!"; 
      String secret = PasswordKey.getEncryptionKey(); 
      setKey(secret); 
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); 
      cipher.init(Cipher.DECRYPT_MODE, secretKey); 
      //System.out.println("testing string values::" + new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)))); 
      return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt))); 
     } catch (Exception e) { 
      System.out.println("Error while decrypting: " + e.toString()); 
     } 
     return null; 
    } 

    public static void main(String[] args) { 
     final String secretKey = "ssshhhhhhhhhhh!!!!"; 

     String originalString = "changeit"; 
     String encryptedString = GenerateLogic.encrypt(originalString, secretKey); 
     String decryptedString = GenerateLogic.decrypt(encryptedString); 

     System.out.println(originalString); 
     System.out.println(encryptedString); 
     System.out.println(decryptedString); 
    } 

} 

Dies ist, wo wir die Klasse org.apache.coyote.http11.Http11Nio2Protocol erweitert, die ist vorhanden in tomcat-coyote-8.0.29.jar welches im lib-ordner von tomcat 8 vorhanden ist.Beim Kompilieren dieser Klassen sollte also tomcat-coyote-8.0.29.jar vorhanden sein.

public class Http11Nio2Protocol extends org.apache.coyote.http11.Http11Nio2Protocol { 

    @Override 
    public void setKeystorePass(String s) { 
     try { 
      super.setKeystorePass(new GenerateLogic().decrypt(s)); 
     } catch (final Exception e) { 
      super.setKeystorePass(""); 
     } 
    } 

} 

Dies ist, wo Benutzer-Passwort in cmd eingeben muss, die

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class PasswordField { 

    /** 
    * @param prompt 
    *   The prompt to display to the user 
    * @return The password as entered by the user 
    */ 
    public static String readPassword(String prompt) { 
     EraserThread et = new EraserThread(prompt); 
     Thread mask = new Thread(et); 
     mask.start(); 

     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
     String password = ""; 

     try { 
      password = in.readLine(); 

     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
     // stop masking 
     et.stopMasking(); 
     // return the password entered by the user 
     return password; 
    } 
} 

Dies ist, wo Sie Ihr Passwort Schlüssel halten gehasht werden soll. Du solltest es ändern.

public class PasswordKey { 

    private static String ENCRYPTION_KEY = "myKeysecretkey"; 

    protected static String getEncryptionKey() 
    { 
     return ENCRYPTION_KEY; 
    } 

} 

kompilieren über Klassen zum Generieren von Klassendateien mit unter Befehl in cmd. Denken Sie daran, dass tomcat-coyote-8.0.29.jar im selben Ordner vorhanden sein sollte, in dem alle Java-Dateien vorhanden sind.

javac -cp ".;tomcat-coyote-8.0.29.jar" *.java 

Machen Sie ein Glas mit der Datei generierte Klasse diesen Befehl in cmd

jar -cvf PasswordEncryptor.jar *.class 

Diese

Fügen Sie den erzeugten PasswordEncryptor.jar in Ordner lib eine JAR-Datei PasswordEncryptor.jar schaffen Tomcat8. d. h. apache-tomcat-8.5.9 \ lib

Gehen Sie nun zu diesem Speicherort und geben Sie den folgenden Befehl ein, um das Hash-Passwort zu generieren.

java -cp ".;PasswordEncryptor.jar" ClientForPasswordGeneration 

Enter The password and it will show hashed password

Gehen Sie jetzt zu Apache-tomcat-8.5.9 \ conf und bearbeiten server.xml

Verwenden Sie das Hash-Passwort in keystorpasss von Zertifikat

<Connector port="9443" protocol="Http11Nio2Protocol" SSLEnabled="true" 
       maxThreads="150" scheme="https" secure="true" 
       clientAuth="false" sslProtocol="TLS" 
     keystoreFile="C:\Certificates\SSLCert.cert" keystorePass="nOS74yuWW4s18TsL2UJ51A=="/> 

Beachten Sie die Protokoll ist der Name der benutzerdefinierten Klasse.

Hoffe, das wird Ihnen helfen.

Dank

0

Hier ist eine handliche Perl Einzeiler zu XML ein Passwort verschlüsseln:

$ perl -pe 's/(.)/"&#".ord($1).";"/eg;' <<< 'secret' 
# &#115;&#101;&#99;&#114;&#101;&#116; 
Verwandte Themen