===== 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:
* OCSP puede proporcionar una información más adecuada y reciente del estado de revocación de un certificado.
* OCSP elimina la necesidad de que los clientes tengan que obtener y procesar las CRL, ahorrando de este modo tráfico de red y procesado por parte del cliente.
* El contenido de las CRL puede considerarse información sensible, análogamente a la lista de morosos de un banco.
* Un "OCSP responder" puede implementar mecanismos de tarificación para pasarle el coste de la validación de las transacciones al vendedor, más bien que al cliente.
* OCSP soporta el encadenamiento de confianza de las peticiones OCSP entre los "responders". Esto permite que los clientes se comuniquen con un "responder" de confianza para lanzar una petición a una autoridad de certificación alternativa dentro de la misma PKI.
* Una consulta sobre el estado de un certificado sobre una CRL, debe recorrerla completa secuencialmente para decir si es válido o no. Un "OCSP responder" en el fondo, usa un motor de base de datos para consultar el estado del certificado solicitado, con todas las ventajas y estructura para facilitar las consultas. Esto se manifiesta aún más cuando el tamaño de la CRL es muy grande.
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 [[https://www.busindre.com/cambiar_algoritmo_predeterminado_en_openssl|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/s/tutorials/OpenSSL_command_line_Root_and_Intermediate_CA_including_OCSP_CRL%20and_revocation.html|https://raymii.org]]