Mostrando las entradas con la etiqueta Firma Digital. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Firma Digital. Mostrar todas las entradas

jueves, 1 de mayo de 2014

Instalando un Servidor de TimeStamping o TSA con Signserver usando HSM Thales ncipher o PKCS12


Bueno instalar un servidor de tiempo es una de las cosas mas sencillas gracias a SignServer, al inicio tuve problemas para entender su lógica pero una vez pasado este nivel fue todo sencillo, incluso unir el servicio a un equipo HSM (Hardware Security Module - Ncipher).
Primero les explico la lógica de funcionamiento de SignServer. Bueno Signserver es en realidad una plataforma al estilo contenedor de servicios, algo así como un framework en el cual puedes construir una aplicación que haga uso de sus recursos para poder brindar algún servicio relacionado con firma digital hecha por un servidor enlazado a un certificado digital (ojo el certificado no pertenece a una persona sino al sistema o al equipo servidor o en este caso al certificado del server de timestamping), bueno uno de estos servicios es la firma de tiempo o timestamping que para abreviar y entender mejor también es una firma digital, al igual que si nosotros usáramos un acrobat reader, solo que con mayores funcionalidades y mayor velocidad.
Para colocar un ejemplo a lo mencionado anteriormente, SignServer no solo puede ser un servidor de tiempo sino un firmador de documentos en formato pdf de forma masiva o firmador de otros formatos incluso de openoffice (es parte de las bondades de signserver). A este servicio en Perú se le conoce como intermediación electrónica, donde el equipo servidor es el propietario del certificado digital que se usara para firmar digitalmente.
Bueno entrando un poco mas a detalle a cada servicio montado sobre SignServer se le conoce como "Worker" y el nombre colocado a cada Worker puede ser customizado.

Bueno ahora vamos manos a la obra. Colocare un listado de pasos ordenados para instalar SignServer (3.4.2) y configurar.
ANTECEDENTE.- asumimos que ya tenemos instalado un servidor linux (el que desee, al final todos son buenos), Java Virtual Machine (yo uso la versión 6.45 de oracle no recomiendo mayor a la version 7.25, aquí un post mio si tuvieran problemas en este paso), un servidor de aplicaciones Jboss 5.1 (no probé con versiones superiores pero no se recomienda) y el aplicativo apache-ant. Ah lo olvidaba deben parchar manualmente a Jboss51 ya que hay un pequeño problema de configuración para brindar servicios web (esta recomendado en la misma pagina de SignServer "6. Configure application server").

1.- Primer paso recomiendo seguir el manual de instalación que se encuentra en la misma pagina de SignServer y usar este material mas para casos de querer usar un HSM o hasta un PKCS12 como repositorio del certificado digital o para mayor detalle. Pero de todas maneras abarcare todos los pasos de instalación.

2.- #copio la libreria de mysql a jboss, luego copio tambien las bc*
#preparo el archivo tsa.properties
#hago path para ANT y creo la variable ANT_HOME y luego uso ant y ant deploy
./signserver.sh setproperties conf_tany/tsa.properties
./signserver.sh getconfig 1
./signserver.sh reload 1
./signserver.sh getconfig 1
./signserver.sh uploadsignercertificate 1 glob /home/tany/Descargas/tsa.pem
./signserver.sh uploadsignercertificatechain 1 glob /home/tany/Descargas/junto.pem
./signserver.sh reload 1

Solo para terminar para invocar al Servicio de TimeStamping (SignServer) este se realiza a traves de una url, al estilo web o bueno un webservice. 

NOTA 1.- La configuración mostrada arriba se realizo en un servidor Linux RedHat 6.2. (Recomiendo instalar SignServer en Linux porque te hace la vida mas sencilla)
NOTA 2.- En caso que en lugar un HSM quieran utiliza un hardware mas modesto como un smartcard o un token, solo necesitan tener el driver o biblioteca pkcs11. En proximos posts prometo hablar mas sobre este hardware.
NOTA 3.- Si ya instalaron el software libre EjbCA unido a algun equipo HSM o Pkcs11 veran que en SignServer es muy similar, y como no serlo si es la misma empresa que provee EjbCA y SignServer.

jueves, 5 de diciembre de 2013

Lanzamiento del DNIe (DNI electrónico) Perú

Andando por youtube me tope con estos videos del lanzamiento del DNI electrónico de Perú, asi que los comparto con ustedes.

Parte 1/3


Parte 2/3


Parte 3/3

Hablemos de pki (infraestructura de clave pública), ejbca, openssl, thales ncipher, smartcard, token, firma digital,firma de tiempo y dnie de Perú

Hola, después de algunos meses regreso al blog esta vez para iniciar varios post sobre pki (infraestructura de clave pública),ejbca (primekey), openssl, thales ncipher, smartcard, token, firma digital,firma de tiempo y dni electrónico en el Perú. Ya vengo en este tema por 3 años y creo que ya tengo algo de material para escribir sobre este tema, así que bueno espero les sirva de algo la experiencia que adquirí en este trabajo diario.


Trabaje con el software libre Ejbca desde su versión 3.x (después de probar varias soluciones como openca, newpki, siti-brasil y otros menos populares), la cual vi muy poco ya que rápidamente escale a la versión 4.x, esta versión me parece muy estable y buena. En lo largo de estos años llegue a agregar o a modificar pequeñas opciones que hicieron que mis usuarios puedan manejar de forma mas amigable y sin complicaciones. Ademas de esto conseguí unir este software con algunos medios o equipos (ampliance) criptograficos (aunque un amigo dice que la palabra correcta es equipo de cifrado porque criptografico viene de cripta), bueno siguiendo, uno de estos equipos con los que trabaje fue un HSM ncipher 2000 aunque también trabaje con versiones superiores, nada complicado ya que también tuve que aprender a manipularlos y entender su lógica (supongo que haré un post de este tema también), pero ahi vi que un HSM es muy similar a un smartcard o a un token viendo desde el punto de vista de PKCS11, así que como juego uni al ejbca con un smartcard de gemalto y un token de safenet. Bueno aunque debo confesar que me fue mucho mas facil manejar este equipo HSM con openssl, ya que Thales tuvo la inteligente idea de integrarla en su producto a la venta. Bueno hasta ahí todo parecía bastante aburrido administrando solo ejbca, creando perfiles y configuraciones para publicar crl o brindar ocsp, hasta que un día hubo necesidad de integrar a ejbca con un software de Entidad de Registro o RA, bueno ahí se puso la cosa mejor porque hubo mucho material por rebanar usando el webservice de Ejbca, claro que había otras maneras (protocolos) pero se adopto este modelo porque siendo sincero la manera mas sencilla fue usando webservice. Así que manos a la obras se hizo un cliente en java (consola) que ejecutaba desde el ide eclipse, se podían hacer las operaciones básicas como emisión, revocación, búsqueda de usuarios o certificados y algunas otras operaciones básicas. Así que cuando llego la hora de hacer el web no fue difícil únicamente escalar ese código de consola a web. Lamentablemente no participe de la construcción del RA solo con el análisis y diseño pero no con la implementación. Una vez hecho esto nuevamente de regreso a la monotonía, hasta que hubo otro reto, que en realidad se tuvo desde el inicio y es que las autoridades o certificados que teníamos cargados en EJBCA no se encontraban en el repositorio de windows por lo que había que hacer mucha configuración en la maquina de los usuarios para que lograsen generar un certificado nuestro usando la plataforma ejbca, así que bueno se tubo que alimentar de un script adicional en la pagina de descarga de ejbca que verificaba que nuestro certificado raíz se encontrara instalado, con esto se alivio un poco el problema, pero a pesar de esto algunas veces teníamos inconvenientes, así que el siguiente paso era encontrar una solución a esto. Y oh sorpresa se me ocurrió construir un cliente versión escritorio que instalara y haga toda la configuración necesaria en la maquina del usuario al estilo script o bash de windows, bueno hasta ahi todo bien, pero aun tenían que usar la web de Ejbca para descargar el certificado lo que hay veces generaba uno que otro problema eventual, así que el próximo paso fue hacer crecer este cliente de escritorio de modo que este se encargara de generar los certificados en la maquina del cliente conectándose al webservice de ejbca, pues demoro pero se consiguió. Y el resultado fue un aplicativo de escritorio que configura las autoridades raíz, genera el pedido o csr en la maquina del cliente usando el repositorio de windows y enviando este request o csr al webservice de ejbca y obteniendo finalmente el certificado que luego es instalado en la maquina del cliente, el resultado fue un aplicativo en c# que no necesita ser instalado y que pesa 400 K y fácil de usar y evita problemas al usuario final. Bueno eso es un resumen de todo lo que hice por el mundo del PKI o Certificación Digital. En vista de que generar un certificado digital no es suficiente para usar esta tecnología, después de ese tema estuve metido investigando sobre software de firma digital (otro tema bastante grande) y conseguí hacer algunas versiones demo en c# y java, que tal vez a futuro me anime a publicar gratuitamente pero creo que debería darle un mejor acabado (lo pensare). Y finalmente puedo hablarles también un poco de signserver que es un servidor de firma de tiempo que también conseguí unir a un equipo Thales ncipher usando por supuesto un NTP para garantizar la hora.

Espero no haya sido muy confuso, pero hay que considerar que son poco mas de 3 años resumidos en un párrafo y adicionando que no es todo sino que hay pequeños detalles que no mencione en este resumen, pero supongo los iré develando poco a poco. Espero les sirva y mi blog se mas visitado ya que lo tuve muy descuidado. Ah y disculpen si se me fue alguna palabra o acento por ahí, pero es que no soy un literato aunque el corrector ortográfico ayuda igual lo pase de frente.

miércoles, 19 de junio de 2013

Trabajando firma digital en c# (versiones)

Estos días estuve realizando algunas pruebas de firma digital en formato PDF usando itextsharp y Bouncy Castle y me tope con muchos problemas debido a que en temas de criptografía .net cambio mucho en sus bibliotecas de versión a versión  incluso es una confusión si uno mira de acuerdo a la versión de Visual Studio que utiliza, así que empujado por eso me vi forzado a realizar un cuadro de versiones de net framewrok cruzadas con la versión de los IDEs: Visual Studio y Sharpdevelop, y también con los sistemas operativos que ya traen algunas versiones de este por defecto y claro por supuesto con las versiones de c# soportadas por cada uno, debido a que este lenguaje es el único que uso de esta plataforma.

Aquí le adjunto la imagen.










jueves, 6 de diciembre de 2012

Firmando un archivo usando certificados digitales y openssl



Para realizar la firma de un archivo (firma externa o firma en archivo separado) únicamente debemos ejecutar el comando:

#openssl dgst -c -sha256 -sign private.key -out firma.sig archivo.zip

En este caso estoy utilizando un resumen criptograma sha256 y estoy utilizando mi clave privada para firmar (private.key). La firma se almacena en el archivo externo firma.sig y el archivo a firmar es archivo.zip.

Para verificar la firma (firma.sig) únicamente deberé ejecutar el siguiente comando (utilizando mi llave pública):

#openssl dgst -sha256 -c -verify pubkey.pem -signature firma.sig archivo.zip

En caso de que tenga un certificado y no directamente la llave pública, puedo extraer la llave pública del certificado con el comando:

#openssl x509 -pubkey -noout -in certificado.crt > pubkey.pem


Cifrar archivos grandes usando certificado digital de cifrado

Bueno hoy explicare como cifrar archivos grandes usando certificados digitales.
Para iniciar necesitamos un certificado digital (clave publica y tambien su privada). Podríamos obtener este certificado de alguna autoridad certificadora como Verisign o cualquier otra, pero para nuestro ejemplo lo que haremos es crearnos un certificado digital autofirmado, es decir que no dependeremos de nadie y seremos nuestra propiedad emisora de certificado, y usaremos este certificado para cifrar un archivo de backup (archivos grandes).



Primero lo que hago es generar un par de llaves con el comando:

#openssl genrsa -des3 -out private.key 4096

Como veran estoy generando una llave RSA de 4096 (bastante grande ya que el periodo de vigencia del certificado sera de 20 años), ademas le digo que proteja la clave privada con un algoritmo 3des (elijo la contraseña a mi elección).

Luego procedera a generar el pedido de certificado.

#openssl req -new -key private.key -out pedido.csr

con esto ya tengo generado el pedido "pedido.csr" que sera firmado por su misma clave privada (que generamos en el paso anterior).

Entonces procedemos a autofirmar.

#openssl x509 -req -days 7300 -in pedido.csr -signkey private.key -out certificado.crt

Como ven estoy generando el archivo "certificado.crt" que contendrá el certificado auto-firmado que estoy requiriendo para cifrar, ademas le daré un tiempo de vigencia de 20 años (7300). Como ven estoy firmando el pedido con su propia clave privada (auto-firmado).

Ahora que ya tenemos el certificado "certificado.crt" y su clave privada "private.key", ya podemos cifrar usando este certificado.

Primero una aclaración valiosa: Si tratan de cifrar un texto directamente con la llave publica (asimétrica), podría funciona o tal vez no, todo dependerá del tamaño del archivo que quieren cifrar, ya que el tipo de cifrado asimétrico tiene un limite de tamaño del archivo a cifrar, que normalmente no debe ser mayor del tamaño de la clave (clave publica). Entonces aquí se debe saber que en realidad un cifrado por certificado digital es un cifrado simétrico, normalmente usando algoritmos como AES o 3DES. Para ser mas preciso al hacer un cifrado por certificado digital lo que sucede en realidad es que se genera una clave simétrica aleatoria y con esta se cifra el archivo (de gran tamaño), luego esta clave simétrica que no es de un tamaño muy grande es cifrado por la clave publica asimétrica y es enviada junto con el archivo cifrado. Entonces el receptor que tiene llave privada lo primero que hace es descifrar la clave simétrica y luego con esta descifra el archivo (de gran tamaño). esto tiene numerosas ventajas como por ejemplo: un cifrado simétrico es mucho mas rápido que uno asimétrico  Si alguien vio como funciona un servicio https, este modelo es muy parecido.

Bueno con esta aclaración, pasaremos a cifrar el archivo de gran tamaño usando el certificado digital:


#openssl smime -encrypt -binary -aes-256-cbc -in archivo_grande.zip -out archivo_grande.zip.enc -outform DER certificado.crt

Ahora si queremos descifrar necesitaremos nuestra clave privada y ejecutamos:

#openssl smime -decrypt -binary -in archivo_grande.zip.enc -inform DER -out archivo_grande.zip -inkey private.key -passin pass:tu_password

Aquí donde dice tu_password, debes colocar la contraseña que usaste al generar el par de claves (primer paso de este tópico).

NOTA.- Ahora algo adicional, si alguien quiere cifrar un texto usando puramente cifrado asimétrico y usando la clave publica seria así:

#openssl rsautl -pubin -encrypt -in texto_a_cifrar.txt -out salida_cifrada.txt -inkey publica.key

Claro que antes previamente debió derivar la clave publica del par de claves generadas en el primer paso (openssl rsa in private.key -pubout -out publica.key). Pero como mencione si el texto a cifrar es muy grande tendrán un error parecido a "data too large for key size".

NOTA 2.- Si el archivo a cifrar es demasiado grande (algo como 3 gb), podrías tener problemas al hacer este cifrado (error provocado por usar smime que muchas veces no se muestra como error, pero es obvio cuando miras el tamaño del archivo origen y el archivo cifrado y hay bastante diferencia de tamaño (mas de 5 mb)), pero bueno también se puede usar otro modelo de cifrado que funciona perfectamente.

#openssl rand 64 | tee >(openssl enc -aes-256-cbc -pass stdin -in file.txt -out file.enc) | openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem  -out file.enc.key

Y el comando para descifrar seria:

#openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc.key | openssl enc -aes-256-cbc -pass stdin -d -in file.enc -out file.txt