What version of links does the user called "bytepool" have that he's able to find this workaround? Refer to link below.
Desconhecido.
He writes "I quickly peeked into the code, and it seems that the relevant function is verify_cert in https.c. .... So as a quick fix for my problem I just built myself a custom version in which verify_cert always returns true, i.e. the cert check is just completely bypassed."
Má ideia.
O código a seguir deve fazer o truque se tudo que você quiser fazer for bem-sucedido para um certificado expirado.
Em essência, você adiciona a função https_verify_cb
e, em seguida, diz ao contexto para usar o retorno de chamada. Então, quando o OpenSSL encontrar um certificado, ele chamará seu retorno de chamada depois de fazer algum processamento próprio.
O código abaixo permite que qualquer certificado seja expirado, incluindo o CA e os intermediários. Você pode restringi-lo a certificados de entidades finais (por exemplo, certificados de servidor) usando depth == 0
.
$ diff -u https.c.orig https.c
--- https.c.orig 2013-09-20 17:17:00.000000000 -0400
+++ https.c 2014-11-13 17:42:40.000000000 -0500
@@ -23,10 +23,34 @@
#define PATH_MAX 255
#endif
+#ifndef NDEBUG
+# include <stdio.h>
+#endif
+
#ifdef HAVE_SSL
+#include <openssl/ssl.h>
+#include <openssl/x509_vfy.h>
+
static SSL_CTX *context = NULL;
+int https_verify_cb(int preverify, X509_STORE_CTX* x509_ctx)
+{
+ /* For error codes, see http://www.openssl.org/docs/apps/verify.html */
+
+ const int depth = X509_STORE_CTX_get_error_depth(x509_ctx);
+ const int err = X509_STORE_CTX_get_error(x509_ctx);
+
+#ifndef NDEBUG
+ fprintf(stdout, "https_verify_cb (depth=%d)(preverify=%d)(error=%d)\n", depth, preverify, err);
+#endif
+
+ /* We return the result of 'preverify', which is the result of customary */
+ /* X509 verifcation. If all goes well, the value will be 1. If preverify */
+ /* failed, then we return success if the certifcate is expired. */
+ return preverify || (err == X509_V_ERR_CERT_HAS_EXPIRED);
+}
+
SSL *getSSL(void)
{
if (!context) {
@@ -62,7 +86,12 @@
if (!m) return NULL;
context = SSL_CTX_new((void *)m);
if (!context) return NULL;
- SSL_CTX_set_options(context, SSL_OP_ALL);
+
+ /* SSL_CTX_set_options(context, SSL_OP_ALL); */
+ const long flags = SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION;
+ long old_opts = SSL_CTX_set_options(context, flags);
+
+ SSL_CTX_set_verify(context, SSL_VERIFY_PEER, https_verify_cb);
SSL_CTX_set_default_verify_paths(context);
}
Observe que o OpenSSL anterior à versão 1.1.0 não realiza a correspondência do nome do host, portanto, a biblioteca terá êxito na construção do caminho, mesmo se os nomes não corresponderem. Veja a man page para X509_check_host (3) .