Crear servidor OCSP para recibir peticiones de información sobre certificados SSL

Online Certificate Status Protocol (OCSP) es un método para determinar el estado de revocación de un certificado digital X.509 usando otros medios que no sean el uso de CRL (Listas de Revocación de Certificados). Este protocolo se describe en el RFC 2560 y está en el registro de estándares de Internet.

Ventajas sobre las CRL (Certificate Revocation List). OCSP fue creado para solventar ciertas deficiencias de las CRL. Cuando se despliega una PKI (Infraestructura de Clave Pública), es preferible la validación de los certificados mediante OCSP sobre el uso de CRL por varias razones:

La guía para crear un servidor OCSP está basada en CentOS aplicable al resto de distribuciones GNU/Linux.

NOTA: Se puede especificar la opción “-days” desde la linea de comandos o bien en el fichero “openssl.cnf”, donde también sería interesante adaptar otras opciones como el algoritmo de firma predeterminado.

Editar el fichero de configuración de openssl /etc/pki/tls/openssl.cnf.

[ usr_cert ] 
authorityInfoAccess = OCSP;URI:http://www.XXX.com:2560

[ v3_OCSP ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = OCSPSigning
crlDistributionPoints     = URI:http://XXXXXXXX/XX.crl
authorityInfoAccess = @ocsp_section
certificatePolicies       = @OCSP_CPS

[ OCSP_CPS ]
#policyIdentifier = TSA-CPS
CPS.1            = "http://XXXX"
CPS.2            = "http://XXXX"
userNotice.1     = @OCSP_CPS_Notice

[ OCSP_CPS_Notice ]
explicitText  = "XXXXXXXXX)"

[ocsp_section]
caIssuers;URI.0 = http://www.XXX.org/
OCSP;URI.0 = http://www.XXX.com:2560

NOTA: Se recomienda agregar / modificar la siguiente directiva a openssl.conf para generar firmas SHA512.

default_md              = sha512 

Crear entidad certificadora (CA). Modificar el script /etc/pki/tls/misc/CA según necesidad, por ejemplo ampliando la validez del certificado (3 años por defecto).

echo '1000' > /etc/pki/CA/serial
cd /etc/pki/tls/misc 
./CA -newca

Ficheros: /etc/pki/CA/cacert.pem y /etc/pki/CA/private/cakey.pem

NOTA: Si ya se dispone de una entidad certificadora, se debe simplemente agregar en esas dos rutas el certificado y la clave privada de la CA. No haría falta más.

Crear un fichero en blanco /etc/pki/CA/index.txt y un fichero /etc/pki/CA/index.txt.attr con este contenido.

unique_subject = no

Lo anterior evita el siguiente mensaje de error.

failed to update database
TXT_DB error number 2

Generar certificados para el servidor OCSP.

mkdir /etc/pki/CA/OCSP
cd /etc/pki/CA/OCSP
openssl req -sha512 -new -nodes -out ocsp.test.local.csr -keyout ocsp.test.local.key -extensions v3_OCSP

La CA firma la solicitud generada anteriormente (La CA emite el certificado), en el ejemplo para 10 años.

openssl ca -policy policy_anything -in ocsp.test.local.csr -out ocsp.test.local.crt -days 3650 -extensions v3_OCSP

NOTA: Si se están haciendo pruebas, es recomendable revisar el identificador de “/etc/pki/CA/serial” y comprobar que el número de serie es el que debe ser y no ha cambiado. Esto sucede cada vez que se emite un certificado (se firma una solicitud). Una señal de que se debe revisar esto se da cuando se obtiene la salida “unknow” al comprobar un certificado por OCSP. EL archivo “/etc/pki/CA/index.txt” puede que se quiera limpiar también, para ello lo mejor es borrarlo y crearlo nuevamente con el comando “touch” (no debe contener ninguna linea en blanco.)

Arrancar servidor OCSP en el puerto 2560.

openssl ocsp -index /etc/pki/CA/index.txt -port 2560 -ignore_err -rsigner /etc/pki/CA/OCSP/ocsp.test.local.crt -rkey /etc/pki/CA/OCSP/ocsp.test.local.key -CA /etc/pki/CA/cacert.pem -text -out /etc/pki/CA/OCSP/log.txt &

NOTA: el parámetro “-ignore_err” es importante para que el servidor no se cierre cada vez que se reciba una solicitud invalida.

# Registro del servidor al recibir una petición erronea.
Responder Error: malformedrequest (1)

Comprobar la validez de un certificado (newcert.pem) emitido (firmado) por dicha CA.

openssl ocsp -CAfile /etc/pki/CA/cacert.pem -issuer /etc/pki/CA/cacert.pem -cert newcert.pem -url http://www.XXX.com:2560

Revocar un certificado SSL. Se debe identificar el número serial de dicho certificado en /etc/pki/CA/newcerts/, por ejemplo c5:07:3c:dc:c5:8a:cb:ad.

openssl ca -revoke /etc/pki/CA/newcerts/C5073CDCC58ACBAD.pem
 
# Comprobar la revocación anterior.
openssl ocsp -CAfile /etc/pki/CA/cacert.pem -issuer /etc/pki/CA/cacert.pem -cert /etc/pki/CA/newcerts/C5073CDCC58ACBAD.pem -url http://www.XXX.com:2560 -resp_text

Enlace de Interés: https://raymii.org