Crear una petición de firma de certificado o CSR – Certificate Signing Request – con OpenSSL

PKI

Un CSR o Certificate Signing Request es una petición de firma de certificado que enviaremos a una CA pública para que verifique nuestra identidad y lo firme. Como resultado obtendremos un certificado fimado por esa CA.

¿En qué consiste un CSR?

Un CSR esta formado por la clave pública, información adicional que identifica a la entidad a la que pertenece y todo ello firmado con la clave privada.

Recordemos que cuando creamos una clave privada, estamos creando también la clave pública asociada a esa clave privada.

Con OpenSSL esto se realiza en un solo paso como ya hemos visto en el artículo Creación de una clave pública y privada con OpenSSL de este blog.

Una vez hemos creado un CSR lo enviaremos a una CA, y esta CA una vez ha identificado quienes somos procederá a firmarlo y nos devolverá el certificado, junto con otra serie de información entre la que se encuentra el identificador de la CA.

A partir de ese momento, ese certificado lo podemos utilizar por ejemplo en un servidor. Cuando un navegador se conecta a nuestro servidor, si en su almacen de certificados de confianza tiene el de la CA que ha firmado nuestro certificado, automaticamente confiará en nuestro certificado y comenzara la conexión segura (Https).

¿En qué consiste un certificado?

El proceso final de un CSR es su firma por parte de la CA y como resultado obtenemos el certificado. Este certificado contiene la misma información del CSR, pero además incluye entre otros datos, el identificador de la CA y su firma.

Formato de un CSR

Suele utilizarse el formato PEM, que no es otro que la representación en Base64 del certificado.

Si lo editamos en un fichero de texto veremos las cabeceras de comienzo y fin del certificado.

-----BEGIN CERTIFICATE REQUEST-----

Representación en Base64 del certificado

-----END CERTIFICATE REQUEST-----

Crear una petición de firma de certificado o CSR

Partimos de la clave pública y privada creada en el artículo de este blog Creación de una clave pública y privada con OpenSSL.

Pasos para crear un CSR

$ openssl req -new -key key.pem -out cert.csr

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]:Madrid
Locality Name (eg, city) []:Madrid
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:.
Common Name (e.g. server FQDN or YOUR name) []:mydomain.com
Email Address []:admin@mydomain.com

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

Como vemos la creación del CSR se realiza en un solo paso. Toda la información que rellenamos, es la que finalmente nos identifica a nosotros como entidad.

Si vamos a utilizar el certificado devuelto por la CA en un servidor el Common Name debe ser el dominio de nuestro servidor.

Al estar en formato PEM podemos editar el CSR en un editor de textos normal:

-----BEGIN CERTIFICATE REQUEST-----
MIICrjCCAZYCAQAwaTELMAkGA1UEBhMCRVMxDzANBgNVBAgMBk1hZHJpZDEPMA0G
A1UEBwwGTWFkcmlkMRUwEwYDVQQDDAxteWRvbWFpbi5jb20xITAfBgkqhkiG9w0B
CQEWEmFkbWluQG15ZG9tYWluLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBAMAtq8PGcdoudwcrsEih9l4M2JhhcFOVBeZwYs7Jn9u29YhQtiqh4g2D
oirpV9MK5GJ+DPA48OSKPmBHKJ0M8nt7YMkmEFm0jw1P7PIENtuPIbqAIGUauL0G
xx/0kImzXfXfTbJyyCtfrXxNq/S7dCTuP1Jc+DxRdMLttRKsa11K272BWTX3NK/+
L0OcvFyuUSA+/ZtjXoSmx3oyRKtmm4JFV4qsBDyMcv05KrEYKkXMeknPykl541Ks
FdxjrytWAcBPHLEITTj6j9r1IcRIwM5EjN7S7yP/2gNlT7B/p7x41o3tUzFUdcyg
kwLy4fxmeCqYV5WOiwLh275yDkyR4OkCAwEAAaAAMA0GCSqGSIb3DQEBBQUAA4IB
AQAOVGldwOKjJtqP4oG24AiQAiI7TjSj/6kSvC8yYkQarWT1nD3EvIqCwUgT7Zn9
4mM+XWtkmMSDp/FwRgeafptA/90idyPwp67tPrOutcWnbH0NGBEkJgpTQ9dx5Wr5
JiU1KN+hXZbgyPojtKJSLKAMv3JOHfBLmqAc6ISXWyCtsb+Y3rWygrl/CETvesQw
v+72UsDCMj50NUqAjRKxvXpIkQ/udG7DeFDThDpiiNSPi3L0B6Vw+d0zZ/rDCWkw
0aP0CpfEpZiltww0RENykIhp/Vl5A7hJ/5ync3gS70jE6tB5N9jcORJlG9IX0geM
ehfHONXqbcIIxtlXh/stipjJ
-----END CERTIFICATE REQUEST-----

Finalmente enviaremos ese CSR a una CA pública para que nos lo firme.

Verificación de los datos del CSR

$ openssl req -text -in cert.csr
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=ES, ST=Madrid, L=Madrid, CN=mydomain.com/emailAddress=admin@mydomain.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:c0:2d:ab:c3:c6:71:da:2e:77:07:2b:b0:48:a1:
                    ...
                    78:2a:98:57:95:8e:8b:02:e1:db:be:72:0e:4c:91:
                    e0:e9
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha1WithRSAEncryption
         0e:54:69:5d:c0:e2:a3:26:da:8f:e2:81:b6:e0:08:90:02:22:
         ...
         17:d2:07:8c:7a:17:c7:38:d5:ea:6d:c2:08:c6:d9:57:87:fb:
         2d:8a:98:c9
-----BEGIN CERTIFICATE REQUEST-----
MIICrjCCAZYCAQAwaTELMAkGA1UEBhMCRVMxDzANBgNVBAgMBk1hZHJpZDEPMA0G
...
ehfHONXqbcIIxtlXh/stipjJ
-----END CERTIFICATE REQUEST-----

Vemos que los datos introducidos son correctos, y además, vemos otra serie de información adicional como es el la longitud de la clave pública utilizado (2048 bits), el algoritmo Signature Algorithm utilizado para firmar el CSR con nuestra clave privada, la clave pública etc.

Extracción de la clave pública de un CSR

Como hemos dicho dentro de un CSR va la clave pública asociada a nuestra clave privada. La podemos extraer directamente del CSR con OpenSSL

$ openssl req -in cert.csr -noout -pubkey

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwC2rw8Zx2i53ByuwSKH2
XgzYmGFwU5UF5nBizsmf27b1iFC2KqHiDYOiKulX0wrkYn4M8Djw5Io+YEconQzy
e3tgySYQWbSPDU/s8gQ2248huoAgZRq4vQbHH/SQibNd9d9NsnLIK1+tfE2r9Lt0
JO4/Ulz4PFF0wu21EqxrXUrbvYFZNfc0r/4vQ5y8XK5RID79m2NehKbHejJEq2ab
gkVXiqwEPIxy/TkqsRgqRcx6Sc/KSXnjUqwV3GOvK1YBwE8csQhNOPqP2vUhxEjA
zkSM3tLvI//aA2VPsH+nvHjWje1TMVR1zKCTAvLh/GZ4KphXlY6LAuHbvnIOTJHg
6QIDAQAB
-----END PUBLIC KEY-----

Extracción de la clave pública asociada a la clave privada

La clave pública sabemos que se puede extraer directamente de la clave privada, ya que lo hemos hecho en anteriores artículos de este blog, el comando es el siguiente:

$ openssl rsa -in key.pem -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwC2rw8Zx2i53ByuwSKH2
XgzYmGFwU5UF5nBizsmf27b1iFC2KqHiDYOiKulX0wrkYn4M8Djw5Io+YEconQzy
e3tgySYQWbSPDU/s8gQ2248huoAgZRq4vQbHH/SQibNd9d9NsnLIK1+tfE2r9Lt0
JO4/Ulz4PFF0wu21EqxrXUrbvYFZNfc0r/4vQ5y8XK5RID79m2NehKbHejJEq2ab
gkVXiqwEPIxy/TkqsRgqRcx6Sc/KSXnjUqwV3GOvK1YBwE8csQhNOPqP2vUhxEjA
zkSM3tLvI//aA2VPsH+nvHjWje1TMVR1zKCTAvLh/GZ4KphXlY6LAuHbvnIOTJHg
6QIDAQAB
-----END PUBLIC KEY-----

Verificación de la firma del CSR

Como hemos dicho, el CSR lo hemos firmado con nuestra clave privada. Como la firma se encuentra en el CSR al igual que la clave pública, podemos verificarlo muy facilmente

$ openssl req -in cert.csr -noout -verify

verify OK

Firmar nosotros mismos el CSR

Si al final decidimos no enviar el CSR a una CA debido a que lo vamos a utilizar de forma interna en nuestra intranet, podemos firmarlo nosotros mismos.

$ openssl x509 -req -days 3650 -in cert.csr -signkey key.pem -out cert.crt

Signature ok
subject=/C=ES/ST=Madrid/L=Madrid/CN=mydomain.com/emailAddress=admin@mydomain.com
Getting Private key

Crear un certificado autofirmado

Si desde el principio sabemos que no vamos a enviar el CSR a una CA, podemos crear directamente el certificado, creando con OpenSSL un certificado autofirmado:

$ openssl req -new -x509 -days 3650 -key key.pem -out fd.crt

Comprobación de los datos de un certificado

Una vez tenemos el certificado devuelto por la CA o bien hemos generado nuestro certificado autofirmado, podemos verificar la información del certificado. Veremos la información de expiración, la entidad que lo firma Issuer, la clave pública, etc.

$ openssl x509 -text -in cert.crt
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            e8:56:61:0b:7e:90:63:05
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=ES, ST=Madrid, L=Madrid, CN=mydomain.com/emailAddress=admin@mydomain.com
        Validity
            Not Before: Oct 28 11:28:34 2015 GMT
            Not After : Oct 25 11:28:34 2025 GMT
        Subject: C=ES, ST=Madrid, L=Madrid, CN=mydomain.com/emailAddress=admin@mydomain.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:c0:2d:ab:c3:c6:71:da:2e:77:07:2b:b0:48:a1:
                    f6:5e:0c:d8:98:61:70:53:95:05:e6:70:62:ce:c9:
                    9f:db:b6:f5:88:50:b6:2a:a1:e2:0d:83:a2:2a:e9:
                    57:d3:0a:e4:62:7e:0c:f0:38:f0:e4:8a:3e:60:47:
                    28:9d:0c:f2:7b:7b:60:c9:26:10:59:b4:8f:0d:4f:
                    ec:f2:04:36:db:8f:21:ba:80:20:65:1a:b8:bd:06:
                    c7:1f:f4:90:89:b3:5d:f5:df:4d:b2:72:c8:2b:5f:
                    ad:7c:4d:ab:f4:bb:74:24:ee:3f:52:5c:f8:3c:51:
                    74:c2:ed:b5:12:ac:6b:5d:4a:db:bd:81:59:35:f7:
                    34:af:fe:2f:43:9c:bc:5c:ae:51:20:3e:fd:9b:63:
                    5e:84:a6:c7:7a:32:44:ab:66:9b:82:45:57:8a:ac:
                    04:3c:8c:72:fd:39:2a:b1:18:2a:45:cc:7a:49:cf:
                    ca:49:79:e3:52:ac:15:dc:63:af:2b:56:01:c0:4f:
                    1c:b1:08:4d:38:fa:8f:da:f5:21:c4:48:c0:ce:44:
                    8c:de:d2:ef:23:ff:da:03:65:4f:b0:7f:a7:bc:78:
                    d6:8d:ed:53:31:54:75:cc:a0:93:02:f2:e1:fc:66:
                    78:2a:98:57:95:8e:8b:02:e1:db:be:72:0e:4c:91:
                    e0:e9
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha1WithRSAEncryption
         38:fb:46:0b:8b:0a:10:3f:d1:e7:51:53:c3:8d:67:ad:d3:93:
         0e:48:52:94:03:8a:a5:06:77:0b:8c:9e:5a:4c:17:cf:a9:76:
         dd:70:69:31:08:f7:d4:de:9e:6d:90:e2:e2:7b:ab:8b:23:1b:
         4d:95:34:19:35:a7:08:29:93:b7:f2:6d:9b:17:66:cc:8f:98:
         a1:7b:65:49:af:aa:4e:57:c0:1c:e0:69:bb:cf:57:59:1d:b7:
         0b:f5:ad:68:3d:f5:f9:fe:23:af:1a:fc:59:31:05:fa:7b:4d:
         5f:40:d9:25:43:f3:a4:ff:09:cb:52:86:ae:95:36:72:fb:03:
         25:c7:ac:ea:9f:d7:5e:a8:b3:32:71:94:a2:58:8f:bf:a2:ee:
         08:ea:f5:d4:18:1d:8b:d8:ff:fb:47:1c:8a:5e:19:18:c7:ad:
         e6:04:88:80:70:22:f7:eb:17:71:9c:67:1c:76:9d:4c:de:a5:
         6f:9b:6e:0b:c8:73:e8:ed:b9:cb:6a:81:a7:35:d3:2a:47:da:
         38:48:1c:96:5d:ba:b9:3f:3b:4c:41:4b:8b:d5:1f:68:19:8f:
         bf:fc:7d:ed:75:f9:da:7f:d4:bd:df:60:77:de:0b:db:fd:b1:
         4a:69:73:f6:f4:c1:bb:46:0e:35:58:aa:2d:5e:99:44:54:c4:
         b7:6c:d5:53
-----BEGIN CERTIFICATE-----
MIIDTjCCAjYCCQDoVmELfpBjBTANBgkqhkiG9w0BAQUFADBpMQswCQYDVQQGEwJF
UzEPMA0GA1UECAwGTWFkcmlkMQ8wDQYDVQQHDAZNYWRyaWQxFTATBgNVBAMMDG15
ZG9tYWluLmNvbTEhMB8GCSqGSIb3DQEJARYSYWRtaW5AbXlkb21haW4uY29tMB4X
DTE1MTAyODExMjgzNFoXDTI1MTAyNTExMjgzNFowaTELMAkGA1UEBhMCRVMxDzAN
BgNVBAgMBk1hZHJpZDEPMA0GA1UEBwwGTWFkcmlkMRUwEwYDVQQDDAxteWRvbWFp
bi5jb20xITAfBgkqhkiG9w0BCQEWEmFkbWluQG15ZG9tYWluLmNvbTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMAtq8PGcdoudwcrsEih9l4M2JhhcFOV
BeZwYs7Jn9u29YhQtiqh4g2DoirpV9MK5GJ+DPA48OSKPmBHKJ0M8nt7YMkmEFm0
jw1P7PIENtuPIbqAIGUauL0Gxx/0kImzXfXfTbJyyCtfrXxNq/S7dCTuP1Jc+DxR
dMLttRKsa11K272BWTX3NK/+L0OcvFyuUSA+/ZtjXoSmx3oyRKtmm4JFV4qsBDyM
cv05KrEYKkXMeknPykl541KsFdxjrytWAcBPHLEITTj6j9r1IcRIwM5EjN7S7yP/
2gNlT7B/p7x41o3tUzFUdcygkwLy4fxmeCqYV5WOiwLh275yDkyR4OkCAwEAATAN
BgkqhkiG9w0BAQUFAAOCAQEAOPtGC4sKED/R51FTw41nrdOTDkhSlAOKpQZ3C4ye
WkwXz6l23XBpMQj31N6ebZDi4nuriyMbTZU0GTWnCCmTt/JtmxdmzI+YoXtlSa+q
TlfAHOBpu89XWR23C/WtaD31+f4jrxr8WTEF+ntNX0DZJUPzpP8Jy1KGrpU2cvsD
Jces6p/XXqizMnGUoliPv6LuCOr11Bgdi9j/+0ccil4ZGMet5gSIgHAi9+sXcZxn
HHadTN6lb5tuC8hz6O25y2qBpzXTKkfaOEgcll26uT87TEFLi9UfaBmPv/x97XX5
2n/Uvd9gd94L2/2xSmlz9vTBu0YONViqLV6ZRFTEt2zVUw==
-----END CERTIFICATE-----

Igualmente podríamos hacer las mismas operaciones que hemos visto en los puntos anteriores, como extraer la clave pública del certificado con

$ openssl x509 -in cert.crt -noout -pubkey
Anuncios

Aumenta la seguridad en tus viajes y desplazamientos con CloseToYou

CloseToyou

Seguro que alguna vez, ante cualquier viaje o desplazamiendo de alguno de nuestros amigos o familiares, nos hemos sentido preocupados por saber si habían llegado a casa o al hotel.

Aunque en la actualidad existen muchas aplicaciones para localizar a nuestros amigos o familiares, al final no las utilizamos por el consumo excesivo que hacen de la batería, o simplemente por no fiarnos y no poder limitar quién nos puede localizarnos.

CloseToYou se diferencia de este tipo de aplicaciones en lo siguiente:

  • Responde en tiempo real
  • Está basada en privacidad
  • Es completamente gratuita
  • Hace un consumo mínimo de la batería

CloseToYou es un servicio de geolocalización en tiempo real para las personas a las que hemos dado permiso de ver nuestra ubicación.

Está basado en GPS o las antenas de red móviles, por lo que puede llegar a ser bastante preciso. Además, la aplicación no necesita estar ejecutandose constantemente ya que utiliza los servicios de Google y la plataforma de Android. Esto significa que la aplicación solo se ejecuta cuando un amigo o familiar nos pide nuestra ubicación, en ese momento la aplicación pide la ubicación al móvil, se la manda, y vuelve a dejar de ejecutarse.

El concepto es similar a la desaparecida Google Latitude pero sin el desfase en tiempos que tenía.

Una vez instalamos la aplicación, nadie podrá localizarnos ni podremos localizar a nadie. Para poder localizar a un amigo o familiar o para que nos localicen, antes tenemos que darles permisos, y a su vez ellos tendrán que darnos permisos.

Los permisos están basados en las cuentas que utilizamos de android, por lo que es muy fácil dar permisos a una persona. Simplemente tenemos que utilizar la dirección o cuenta de gmail.

Aunque la interface de la aplicación es bastante simple, la aplicación cumple perfectamente con su función, que no es otra cosa que la de localizar en tiempo real a nuestros familiares o amigos.

Aquí os dejamos unas capturas de pantallas

CloseToyou

Si queréis saber más sobre CloseToYou la podéis encontrar en Google Play:

disponible-google-play

Como guardar las contraseñas de forma segura en una base de datos

Base de datos

La respuesta es la utilización de PBKDF2 – Password Based Key Derivation Function 2. Es parte de los estándares de Public Key Cryptography Standards, concretamente de PKCS#5.

Cuando nos llega la contraseña de un usuario nunca debemos guardarla como texto plano. Lo que debemos hacer es generar una nueva contraseña a partir de la contraseña del usuario. Esta nueva contraseña sería la que guardaremos desechando la introducida por el usuario.

Sigue leyendo