Cifrar un documento con un certificado mediante openssl
Enviado por miguelcarmona :: 9 de marzo de 2012
Anteriormente ya vimos cómo podemos pedir un CSR para enviar a una entidad certificadora y cómo podemos autofirmar el certificado. Vamos a ver como podemos usar openssl para cifrar un documento extrayendo la clave pública de un certificado para luego cifrar el documento y usar la clave privada para descifrarlo.
Siguiendo el nombre de los ficheros de los posts anteriores, vamos a suponer que:
- cert.crt: Contiene la clave pública certificada, ya sea por una entidad externa opor nosotros mismos
- privkey.pem: Contiene la clave privada que generamos al hacer el CSR
Primero de todo deberemos extraer la clave pública el certificado, creando el ficheopub.key:
$ openssl x509 -inform pem -in cert.crt -pubkey -noout > pub.key
A continuación generamos un documento a cifrar, por ejemplo:
$ echo systemadmin.es > datos.txt
Mediante la clave pública ciframos el documento, que vamos a guardar comodatos.ssl:
$ openssl rsautl -encrypt -inkey pub.key -pubin -in datos.txt -out datos.ssl
Podemos comprobar que los datos se han cifrado mediante el comando file:
$ file datos.txt
datos.txt: ASCII text
$ file datos.ssl
datos.ssl: data
O bien mediante hexdump:
$ hexdump -C datos.ssl
00000000 94 b4 8d 68 a2 63 f4 cc f7 f6 aa 09 86 70 dc 3f |.´.h¢côÌ÷öª..pÜ?|
00000010 29 c8 ea 21 e6 61 7c 24 6e e5 85 d6 5d 1b 44 6d |)Èê!æa|$nå.Ö].Dm|
00000020 e5 41 de 05 73 92 f9 6f b1 de ca f6 e1 2f d8 52 |åAÞ.s.ùo±ÞÊöá/ØR|
00000030 a6 ef 71 d7 03 04 fe 83 c3 96 26 4b f1 9b a1 c2 |¦ïq×..þ.Ã.&Kñ.¡Â|
00000040 9b db 8e f0 76 03 3e 68 d6 d2 26 a9 54 3d 76 73 |.Û.ðv.>hÖÒ&©T=vs|
00000050 d3 eb 82 75 b9 47 73 1e 8f b2 e6 b8 c7 b2 4c bf |Óë.u¹Gs..²æ¸Ç²L¿|
00000060 d0 9f ad ea fb 19 a1 b4 40 44 d7 9b 94 1f f6 0e |Ð.êû.¡´@D×...ö.|
00000070 ae 65 1b 07 b9 91 ee a7 f8 e2 0f 1f 82 c2 db 96 |®e..¹.î§øâ...ÂÛ.|
00000080 04 7e 9c 27 0a f0 e1 ab cb f6 48 a6 94 0e e3 3a |.~.'.ðá«ËöH¦..ã:|
00000090 99 1a 63 8e cb dd 27 8c db 16 56 0c cf 32 da 38 |..c.ËÝ'.Û.V.Ï2Ú8|
000000a0 d1 78 aa c4 c6 35 b5 9c ad c3 4f 3b 6e 42 31 2e |ÑxªÄÆ5µ.ÃO;nB1.|
000000b0 6b e7 47 3c 61 93 aa 82 29 cd 16 ee 5a ba 04 27 |kçG<a.ª.)Í.îZº.'|
000000c0 40 8b 7b 86 17 21 1b 95 ff 73 fa 62 f5 79 7b b1 |@.{..!..ÿsúbõy{±|
000000d0 ef a5 3e f5 04 89 40 55 72 5e 88 65 7e 5f 2c 9c |ï¥>õ..@Ur^.e~_,.|
000000e0 26 b0 6a 57 7e ae 3b 3f 5d ae 2d fd 97 ca e8 96 |&°jW~®;?]®-ý.Êè.|
000000f0 48 41 3c 2c 51 29 4e 94 03 fb dc 1a 23 98 4d cc |HA<,Q)N..ûÜ.#.MÌ|
00000100
Para descifrar el documento deberemos usar la clave privada (privkey.pem) y guardamos el documento recuperado en el fichero datos.recuperados:
$ openssl rsautl -decrypt -inkey privkey.pem -in datos.ssl -out datos.recuperados
Y podremos comprobar que los datos recuperados son los mismos:
$ cat datos.recuperados
systemadmin.es
Este mismo procedimiento nos puede servir para verificar que cierta clave privada corresponde a algún certificado. En el caso que la clave privada no sea la correcta obtendremos el siguiente mensaje:
$ openssl rsautl -decrypt -inkey priv.key.2 -in datos.ssl -out datos.recuperados
RSA operation error
140238622533448:error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02:rsa_pk1.c:190:
140238622533448:error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed:rsa_eay.c:653: