openssl - tls - Verificación del Certificado SSL programáticamente
verificar certificado ssl openssl (2)
El error específico que está recibiendo es
20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: unable to get local issuer certificate
the issuer certificate could not be found: this occurs if the issuer certificate of an untrusted certificate cannot be found.
Intente colocar el emisor de gmail, y no el certificado de gmail, en certificate.pem.
Además, asegúrese de comprender el primer comentario de Bruno sobre su pregunta.
Sé que esta será una publicación enorme, pero quería presentar un problema al que me estoy enfrentando dando esencialmente todos los detalles.
Antecedentes Tengo una aplicación que hace que Firefox busque datos URL y presente el tiempo de carga de componentes individuales de todos los componentes en una página web (como Firebug). Sin embargo, la aplicación no valida los certificados SSL de forma automática (es decir, se queda enganchada si hay un certificado incorrecto, ya que no hay un usuario que acepte / rechace un certificado manualmente y todo se hace programáticamente). Necesito resolver este problema intentando validar el certificado del sitio antes de que se inicie el proceso de Firefox.
Mi solución
Encontré este bit de código c que hace la verificación de certs SSL programáticamente en C. Le doy una breve descripción de ello. este es el método principal ():
SSL_library_init();
ERR_load_BIO_strings();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
/* Set up the SSL context */
ctx = SSL_CTX_new(SSLv23_client_method());
/* Load the trust store - in this case, it''s just a single
* certificate that has been created for testing purposes.
*/
if(! SSL_CTX_load_verify_locations(ctx,"certificate.pem",NULL))
{
fprintf(stderr, "Error loading trust store/n");
//ERR_print_errors_fp(stderr);
SSL_CTX_free(ctx);
return 0;
}
/* Setup the connection */
bio = BIO_new_ssl_connect(ctx);
/* Set the SSL_MODE_AUTO_RETRY flag */
BIO_get_ssl(bio, & ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
/* Create and setup the connection */
BIO_set_conn_hostname(bio, "mail.google.com:https");
fprintf(stderr, "Connecting to host .../n");
if(BIO_do_connect(bio) <= 0)
{
fprintf(stderr, "Error attempting to connect: %d/n",BIO_do_connect(bio));
//ERR_print_errors_fp(stderr);
BIO_free_all(bio);
SSL_CTX_free(ctx);
return 0;
}
/* Retrieve the peer certificate */
fprintf(stderr, "Retrieving peer certificate/n");
if(getPeerCert(ssl, & peerCert) != X509_V_OK)
{
/* Can be changed to better handle a suspect certificate. However,
* for the purposes of this demonstration, we''re aborting.
*/
fprintf(stderr, "Certificate verification error: %i/n",SSL_get_verify_result(ssl));
BIO_free_all(bio);
SSL_CTX_free(ctx);
return 0;
}
Estoy dejando de lado la defensa del método getPeerCert () ya que obtiene el certificado de pares y verifica el uso de los métodos de openssl.
También el certificate.pem es un archivo de pem obtenido al seguir los pasos para la solución a esta pregunta.
Sin embargo, cuando intento ejecutar esto, obtengo
Connecting to host ...
Retrieving peer certificate
Certificate verification error: 20
No puedo ver por qué esto debería suceder ya que la verificación debería tener éxito. Estaría agradecido y contento de cualquier ayuda que pueda obtener. Muchas gracias por adelantado.
Saludos, Hari
Actualización 1
Intenté usar el comando Abrir SSL e intenté llamar al comando desde el código, es decir,
opensssl verify -CAfile ./ca-bundle.crt cert1...
Sin embargo, descubrí que valida los certificados internos y externos, también parece validar certs (internos) que en realidad deberían ser malos (específicamente certificados de dominio incorrecto). Agradecería enormemente cualquier idea sobre esto. Muchas gracias por adelantado.
opensssl verify -CAfile ./ca-bundle.crt -untrusted cert1...
mira este artículo, pero aún no sé cómo hacerlo programáticamente.