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.