La documentación de OpenSSL es obtusa e incompleta, por lo que lleva tiempo encontrar todos los parametros necesarios para realizar una tarea. Aquí hay una lista de ejemplos para ayudarlo.
Generar un clave RSA (con contraseña)
La misma tendrá una contraseña y una longitud de 2048 bits. Será encriptada con triple DES y guardada en test1.pem.
openssl genrsa -des3 -out test1.pem 2048
Generar el request (PKCS #10) para el archivo anterior.
openssl req -config formatoReq.txt -out test1Certrequest.csr -verify -key test1.pem -sha1 -new -batch
formatoReq.txt contiene el DN que se utilizara para el request. Por ejemplo:
[ req ] default_bits = 2048 default_keyfile = test1.pem distinguished_name = req_distinguished_name prompt = no [ req_distinguished_name ] C = AR ST = Capital Federal L = Capital Federal O = Mi Prepaga serialNumber = CUIT 20305949125 OU = Facturacion CN = MiSistema
test1Certrequest.csr contiene el request generado.
Ver el contenido del request
openssl req -in test1Certrequest.csr -text
Generar un certificado (x509.v3) selfsigned
Este certificado no tiene ninguna validez porque esta firmado por la propia clave privada pero sirve para pruebas.
openssl req -x509 -days 1095 -config formatoReq.txt -out test1.selfsigned.cer -verify -key test1.pem -sha1 -new -batch
La clave está en test1.pem y el resultado es test1.selfsigned.cer
Firmar y convertir a PKCS #7/CMS (PEM - Base64)
openssl smime -sign -signer test1.crt -inkey test1.pem -out ticket.xml.cms -in ticket.xml -outform PEM -nodetach
test1.crt es el certificado digital.
test1.pem es la clave privada.
Ticket.xml es el archivo que se desea firmar.
ticket.xml.cms es la salida firmada.
Otra forma de realizar lo anterior, pero en dos etapas es:
openssl smime -sign -signer test1.crt -inkey test1.pem -out ticket.xml.cms -in ticket.xml -outform DER -nodetach openssl base64 -in ticket.xml.cms -out ticket.xml.cms.base64
La ventaja de este ultimo método es que no agrega los encabezados indicando que es una firma, pero el código base64 debería ser el mismo. Ver ticket.xml.cms.base64
Parsear el archivo con la firma
Esto permite ver el contenido del archivo firmado. En mi caso, me permitio ver que el archivo XML que estaba enviando estaba en Unicode.
openssl asn1parse -inform DER -in ticket.xml.cms
Generar un archivo para importar la clave privada en el Internet Explorer (PKCS #12)
openssl pkcs12 -export -inkey test1.pem -in test1.crt -out test1.p12
El archivo test1.p12 puede ser importado en el IE.
A veces puede ser necesario utilizar el parámetro -name para indicar un alias para el certificado y la clave. Esto es necesario para algunas librerias que se emplean en Java para acceder a los certificados. En ese caso, se debe agregar al comando anterior algo similar a "-name antonio".
Verificar una firma.
openssl smime -verify -in ticket.xml.cms -inform PEM test1.crt
Donde ticket.xml.cms es un archivo firmado que está en base 64.