openssl - verificacion - verificar certificado
¿Por qué la retrollamada de grapado OCSP se llama DESPUÉS de la devolución de llamada de verificación? (1)
La tercera opción sería solicitar puntos CRL y respuestas OCSP y luego validar usted mismo en el orden correcto.
Valida la respuesta grapada de OCSP dentro de la devolución de llamada, usando OCSP_basic_verify. Luego, una vez que se estableció la conexión, usted verifica CRL por
X509_STORE_CTX* ctx = ...
// fill up ctx, if not yet initialized
ctx->chain = chain;
ctx->get_crl = []( X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x ) -> int
{ .. your method to download CRL .. }
// disable additional CRL lookup by the library
ctx->lookup_crls = [] (X509_STORE_CTX *ctx, X509_NAME *nm) ->STACK_OF( X509_CRL ) * { return nullptr; };
// other possible options are: X509_V_FLAG_EXTENDED_CRL_SUPPORT, X509_V_FLAG_CRL_CHECK_ALL, X509_V_FLAG_USE_DELTAS
ctx->param->flags = X509_V_FLAG_CRL_CHECK;
// this will evaluate how well the CRL fits the leaf certificate you want to validate
ctx->check_revocation(ctx);
// this validates the CRL itself, if it is signed and stuff
// 0 - bad
// 1 - okay
int ok = ctx->check_crl(ctx, m_crl);
// This gives actual revocation result
// 0 - bad (ctx->error = X509_V_ERR_CERT_REVOKED or something else)
// 1 - okay
// 2 - CRL_REASON_REMOVE_FROM_CRL
int result = ctx->cert_crl(ctx, m_crl, leafCertificate);
No soy un experto en OpenSSL, pero he intentado escribir un código para manejar el engrapado OCSP para un cliente que se conecta a un servidor con seguridad SSL. Mi comprensión de OCSP es que se usa para probar que el certificado que se presenta no ha sido revocado, lo que significa que no necesito ocuparme de la administración de las CRL publicadas por el emisor.
Utilizo SSL_CTX_set_verify para establecer una devolución de llamada para manejar la verificación de los certificados (bueno, manejando excepciones al propio proceso de verificación interna de OpenSSL. Supongo, pero no puedo encontrar una prueba positiva de que este proceso interno no verifique el estado de revocación del certificado), y actualmente mi código usa esta oportunidad para verificar que el emisor sea confiable (o de lo contrario, el emisor es confiable, y así sucesivamente hasta que la cadena sea confiable o rechazada), así como otras cosas como que el certificado no ha expirado . (Esto también puede estar ya verificado, pero eso no es realmente importante para mi pregunta).
Modifiqué mi código, agregando
SSL_set_tlsext_status_type(<the ssl object>, TLSEXT_STATUSTYPE_ocsp);
SSL_CTX_set_tlsext_status_cb(<the context>, ssl_cb_ocsp_verify);
y luego puedo obtener la respuesta y verificarlo en el controlador. ¡Hasta aquí todo bien!
Pero lo extraño es que recibo la devolución de llamada OCSP después de obtener el controlador SSL_CTX_set_verify. Para mi (admitidamente ingenuo) pensamiento, esto significa que tengo dos opciones:
1) Verifique el estado de revocación en la devolución de llamada de verificación, ya sea utilizando la CRL o haciendo mi propia solicitud de OCSP. Si hago esto, no tiene sentido hacer nada en la devolución de llamada OCSP, ya que he determinado el estado de revocación del certificado 2) No verifique el estado de revocación en la devolución de llamada de verificación, y espero que el manejador OCSP esté loco. llamado.
Me di cuenta de que el controlador OCSP se llama antes del controlador de verificación si la respuesta del servidor no incluye un mensaje OCSP engrapado. Entonces, una posibilidad es que coloque un indicador en algún lugar ''no_ocsp'' en 0 inicialmente, y luego, si recibo la devolución de llamada OCSP sin mensaje adjunto, configúrelo en 1. Luego, en el controlador de verificación, puedo verificar esto para intentar determinar si el El manejador OCSP se llamará más tarde. Esto se parece un poco a un automóvil que se abre cuando alguien se acerca, y luego, si la persona que se acerca pone la llave incorrecta, se bloquea, en otras palabras, seguramente no puede ser la forma "correcta" de hacer la seguridad.
Por lo tanto, debo tener algún malentendido fundamental sobre cómo usar OCSP, OpenSSL o ambos. ¿Qué estoy haciendo mal?
(He visto preguntas similares que explican cómo obtener el mensaje engrapado OCSP, pero mi pregunta se relaciona con la forma en que realmente lo usa de manera sensata, dado el orden de las devoluciones de llamada. Para ser claros: Puedo obtener el OCSP_RESPONSE sin cualquier problema)