lunes, 25 de mayo de 2020

Certificados en java (1). Crear mi propia Autoridad de Certificados (CA)

Veamos los pasos a seguir (basándonos en Deliciousbrains)

1. Generar la clave privada


openssl genrsa -des3 -out myCA.key 2048

y nos sale esta ratahila solicitándonos una contraseña que por ejemplo damos  "mi-contraseña"


Generating RSA private key, 2048 bit long modulus (2 primes)
.......................................+++++
.................................................+++++
e is 65537 (0x010001)
Enter pass phrase for myCA.key:
Verifying - Enter pass phrase for myCA.key:

2. Generar el certificado raiz (Root certifcate)

openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem

(en vez de myCA.pem podríamos haber indicado myCA.crt)

y nos pide la contraseña

Enter pass phrase for myCA.key: 
Can't load /home/ximo/.rnd into RNG
140017841828288:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/home/eduard/.rnd
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Teruel
Locality Name (eg, city) []:Escorihuela
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Informatica Dantesca
Organizational Unit Name (eg, section) []:Informatica Dantesca
Common Name (e.g. server FQDN or YOUR name) []:Ximo Dante
Email Address []:ximodante@gmail.com

OJO con el CN (Common name), convien darle el nombre completo de la máquina con el dominio, como por ejemplo informatica.dantesca.es

Ya tenemos 2 ficheros:
  1. myCA.key (mi clave privada)
  2. myCA.pem (mi certificado raíz)

3. Instalar el certificado raiz en el keystore de Java

Solamente para que nuestro Java reconozca el certificado raiz, en mi caso me interesa para ser cliente de WS de un servidor que le vamos a instalar un certificado nuestro.

Veamos donde tenemos el Java instalado:

sudo update-alternatives --config java

y observamos que tenemos 2 versiones de Java y conviene actualizarlo en los 2 keystores

  Selecció    Camí                                           Prioritat  Estat
------------------------------------------------------------
* 0            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      mode automàtic
  1            /usr/java/jdk-13.0.2/bin/java                    1         mode manual

Para el java 8 hacemos:

/usr/lib/jvm/java-8-openjdk-amd64/bin/keytool -import -trustcacerts -alias RootCert -file myCA.pem -storepass changeit -keystore /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts

y nos contesta:

Owner: EMAILADDRESS=ximodante@gamil.com, CN=Ximo Dante, OU=Informatica Dantesca, O=Informatica Dantesca, L=Escorihuela, ST=Teruel, C=ES
Issuer: EMAILADDRESS=ximodante@gamil.com, CN=Ximo Dante, OU=Informatica Dantesca, O=Informatica Dantesca, L=Escorihuela, ST=Teruel, C=ES
Serial number: 2f70e1318bee92310bb278db98597b48bdd0575c
Valid from: Fri May 22 08:48:23 CEST 2020 until: Wed May 21 08:48:23 CEST 2025
Certificate fingerprints:
	 MD5:  A7:81:46:75:34:28:C1:73:DB:26:11:3B:A5:1C:44:8A
	 SHA1: E1:82:8C:A0:5A:97:9D:6D:A0:F9:08:B6:ED:4B:C6:38:39:AC:28:76
	 SHA256: D4:42:33:6A:B7:86:98:42:17:B3:0C:39:7D:2C:3E:7D:06:3D:89:6B:52:40:77:34:61:04:81:4A:0D:77:46:39
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3

Extensions: 

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: B0 E6 C3 22 E5 18 E6 10   AF 95 E2 AD 75 00 29 63  ..."........u.)c
0010: 64 A4 91 A7                                        d...
]
]

#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: B0 E6 C3 22 E5 18 E6 10   AF 95 E2 AD 75 00 29 63  ..."........u.)c
0010: 64 A4 91 A7                                        d...
]
]

Trust this certificate? [no]:  yes
Certificate was added to keystore

Y para el java 13

sudo /usr/java/jdk-13.0.2/bin/keytool -import -trustcacerts -alias RootCert -file myCA.pem -storepass changeit -keystore /usr/java/jdk-13.0.2/lib/security/cacerts

Y nos devuelve una ratahila parecida.

(para crear un jks desde cero (aunque no recomendable)
 keytool -keystore ximodante.jks -genkey -alias ximodante


4. Instalar el certificado raiz en Chrome

Vamos a Configuración - Privacidad y seguridad - Más V - Administra certificados - (Tab)Entidades emisoras - (Botón) Importa

Y nos situamos donde está el certificado.

5. Instalar el certificado raiz en Mozilla Firefox

Vamos a Prefencias - Privacidad y seguridad - Certificados - Muestra Certificados - Entidades -(Boon) Importar

Y nos situamos donde está el certificado.


6. Crear certificados firmados por nuestra entidad certificadora (CA)  

Primero, creamos una clave privada:

openssl genrsa -out ximo.dante.key 2048

y nos contesta

Generating RSA private key, 2048 bit long modulus (2 primes)
..............................................................+++++
..........................+++++
e is 65537 (0x010001)


Ahora generamos el CSR (Certificate Signing Request)


openssl req -new -key ximo.dante.key -out ximo.dante.csr

Nos pregunta lo mismo que al generar el certificado raiz, pero las contestaciones parece que no sirven para mucho, porqué es un CSR y no un certificado. De todas formas contestar lo más adecuadamente posible.

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Teruel
Locality Name (eg, city) []:Escorihuela
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Informatica Dantesca
Organizational Unit Name (eg, section) []:Informatica Dantesca
Common Name (e.g. server FQDN or YOUR name) []:ws.ximodante.es        
Email Address []:ximodante@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

OJO con el common name (CN) que debería de ser el nombre de la máquina.!!

Nos puede que hace falta también un fichero de configuración, pues necesitamos el SAN (Subject Alternative File). sinó no reconocerá al servidor de https. Le llamaremos ximo.dante.conf

NOTA: En la versión 3 del formato X509 podemos indicarle varios dominios a un certificado, con lo que parece ser que prodríamos utilizar un solo certificado par varias máquinas y ahorrarnos una pasta en caso de que compremos los certificados... Pero todo tiene su cara y su cruz, ya que si queremos convertir dicho certificado X509v3 al estándard PKCS12, APARENTEMENTE se pierde toda la información de los dominios alternativos. Por eso es muy importante colocar el nombre y dominio de la máquina en del CN (Common Name). Digo "aparentemente", pues si mostramos la información del certificado con " openssl -nokeys -info -in ximo.dante.p12 " NO MUESTRA LA INFORMACION DE LOS DOMINIOS ALTERNATIVOS... pero si lo instalamos en un tomcat y miramos el certificado con Firefox, SI QUE APARECEN !!!!

OJO: Para obtener cada una de las DNS, debemos hacer este comando:

nslookup 192.168.2.2

siendo 192.168.2.2 la dirección IP del servidor que queremos crear el certificado, y nos devuelve:

server.interno.ximodante.es  --> Dominio Interno
server.externo.ximodante.es  --> Dominio Externo

Ahora ya podemos ver el fichero de configuración para el caso de darle varios nombres y dominio de equipos. Esto puede ser útil cuando estamos en una DMZ y se tienen 2 dominios, uno por lo que las máquinas acceden entre si dentro de la DMZ y otro para las máquinas que estan fuera de este DMZ.

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = server.interno.ximodante.es
DNS.2 = server.externo.ximodante.es


Vamos a generar nuestro preciado certificado usando el CSR, la clave privada y certificado de Entidad Certificadora y el fichero de configuración.


openssl x509 -req -in ximo.dante.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out ximo.dante.crt -days 825 -sha256 -extfile ximo.dante.conf

 Y nos escribe en la consola datos del "subject".... 

Y ya tenemos el certificado.

Si queremos ver todos los detalles del certificado escribimos

openssl x509 -in ximo.dante.crt -text

 
7. Convertir el certificado X509 a PKCS12

Algunas veces, nos hace falta tener el certificado en formato PKCS12, con la ratahila de certificados raiz de la entidad certificadora... Pero todo tiene un pero en esta vida, si hacemos la conversión, PARECE FALSEMENTE que se pierde la información de los SAN o "nombre de máquina+ dominio" alternativos, y parece solo conserva la información de "máquina+dominio" del campo CN!!  PERO SI SE CONSERVA!!!


openssl pkcs12 -export -in ximo.dante.crt -inkey ximo.dante.key -out ximo.dante.p12 -name servercert -CAfile myCA.pem -caname root -chain

Y nos pide una contrasseña y que la verifiquemos

Si queremos ver el certificado, podemos comprobar que pierde gran parte de la información adicional que tiene la versión 3 del X509. Para ello ejecutamos el comando y le damos la contraseña que le hemos dado antes (mypassword) o si no le ponemos "-passin pass:", nos pedirá la contraseña al ejecutar el comando.


openssl pkcs12 -nokeys -info -in ximo.dante.p12 -passin pass:mypassword

No nos muestra los dominios alternativos SAN pero si instalamos el certificado en tomcat y vemos desde Firefox el certificado, SI QUE APARECEN los DNS alternativos.

8. Opcionalmente copiar el certificado a un jks

Veamos

keytool -importcert -alias ximo.dante -file ximo.dante.crt -keystore ximodante.jks

No hay comentarios :

Publicar un comentario