err_ssl_protocol_error configurar tomcat server.xml

configurar - tomcat add ssl certificate



Encriptar la contraseƱa de tomcat keystore (5)

¿Existe alguna opción para cifrar el valor de keystorePass en tomcat server.xml ? No quiero que sea un texto simple

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


Hay una mejor manera que solo usar la codificación XML.

Cree una clase de encriptación para encriptar y descifrar su contraseña.

Y anule la clase Http11Nio2Protocol , algo similar al código siguiente.

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(""); } }

}

Nota: EncryptService es nuestra propia clase de encriptación.

Y configure la clase reemplazada en el atributo de protocolo en server.xml como a continuación.

<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>"/>

Espero que esto ayude.


Si alguien tiene acceso a su server.xml, el valor de texto sin formato de su keystorePass que aparece es solo una de sus preocupaciones.

Si alguien tiene acceso desde allí, podrían hacer mucho más daño. Encriptar la contraseña aquí solo está trasladando el problema a otra parte, ya que alguien podría encontrar la clave de cifrado para esta clave de cifrado (un poco como una muñeca rusa).

Si desea encriptar la contraseña, debe anular la implementación de Connector para descifrar la contraseña cifrada de modo que el pwd real esté accesible o disponible para tomcat.


Frente al mismo problema. El cliente exige "ocultar" todas las contraseñas.

Entonces, la forma más simple de pasar la auditoría, desde Tomcat Wiki .

Vaya a la página http://coderstoolbox.net/string/#!encoding=xml&action=encode&charset=none y codifique para pasar a XML-view.

Por lo tanto, el elemento <Connector> se ve así:

<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;" />


También nos enfrentábamos a un problema similar, pero creamos nuestra propia lógica de cifrado y descifrado para abordar esto. Aquí está el código

/* 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); } }

Otra clase

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; } }

Lógica que generó código hash

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); } }

Aquí es donde extendimos la clase org.apache.coyote.http11.Http11Nio2Protocol que está presente en tomcat-coyote-8.0.29.jar que está presente en la carpeta lib de tomcat 8. Por lo tanto, al compilar estas clases tomcat-coyote-8.0. 29.jar debe estar presente.

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(""); } } }

Aquí es donde el usuario debe ingresar la contraseña en cmd, que debe ser hash

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; } }

Aquí es donde guarda su clave de contraseña. Deberías cambiarlo

public class PasswordKey { private static String ENCRYPTION_KEY = "myKeysecretkey"; protected static String getEncryptionKey() { return ENCRYPTION_KEY; } }

compilar encima de las clases para generar archivos de clase con el siguiente comando en cmd. Recuerde tomcat-coyote-8.0.29.jar debe estar presente en la misma carpeta donde están presentes todos los archivos java.

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

Haga un jar con el archivo de clase generado usando este comando en cmd

jar -cvf PasswordEncryptor.jar *.class

Esto creará un archivo jar PasswordEncryptor.jar

Pegue el PasswordEncryptor.jar generado en la carpeta lib de Tomcat8. es decir, apache-tomcat-8.5.9 / lib

Ahora vaya a esta ubicación y escriba debajo del comando para generar la contraseña hash.

java -cp ".;PasswordEncryptor.jar" ClientForPasswordGeneration

Ahora ve a apache-tomcat-8.5.9 / conf y edita server.xml

Utilice la contraseña hash en clave o paso del certificado

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

Observe que el protocolo es el nombre de clase personalizado.

Espero que esto te ayudará.

Gracias


Aquí hay una útil línea de Perl para XML que codifica una contraseña:

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