2017-02-16 9 views
1

Я копаю исходный код, пытаясь найти способ заставить OpenSSL всегда принимать сертификаты с истекшим сроком действия. Я не могу найти связь между истекшими ошибками/аварийными сигналами и фактическим кодом проверки. Может кто-то указать мне верное направление? (Мой C не очень хорош, я полагаюсь на то, что можно переносить с C++)Сделайте OpenSSL истек сертификаты

Причина, по которой я хочу принять сертификаты с истекшим сроком действия, заключается в том, что у нас есть тонна встроенных систем, чьи сертификаты истекают через несколько месяцев (обновление не опция, поскольку они либо отключены, либо находятся в массовом хранилище). Сервер, к которому они подключаются, знает только принимать эти системы, поэтому разрешение истекших сертификатов кажется самым простым решением.

+0

Какие изменения вы хотите сделать? Изменения в сценариях с помощью 'openssl'? Изменения в пользовательском двоичном файле, который использует функции библиотеки OpenSSL? –

+0

Мы используем nginx на нашем сервере, поэтому я вытащил исходный код oppenssl и надеялся принудительно нажать OK на проверку срока действия. –

+0

_Who_ точно отвергает истекшие сертификаты? Nginx используется как (обратный) прокси? – Ctx

ответ

2

Сделать OpenSSL принимают сертификаты с истекшим сроком ...

В вашей проверки функции обратного вызова, вы должны принять как X509_V_OK и X509_V_ERR_CERT_HAS_EXPIRED. Может быть что-то вроде:

int verify_callback(int preverify, X509_STORE_CTX* x509_ctx) 
{ 
    /* For error codes, see http://www.openssl.org/docs/apps/verify.html */ 
    int err = X509_STORE_CTX_get_error(x509_ctx); 

    if(preverify == 0) 
    { 
     if(err == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY) 
      fprintf(stdout, " Error = X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY\n"); 
     else if(err == X509_V_ERR_CERT_UNTRUSTED) 
      fprintf(stdout, " Error = X509_V_ERR_CERT_UNTRUSTED\n"); 
     else if(err == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN) 
      fprintf(stdout, " Error = X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN\n"); 
     else if(err == X509_V_ERR_CERT_NOT_YET_VALID) 
      fprintf(stdout, " Error = X509_V_ERR_CERT_NOT_YET_VALID\n"); 
     else if(err == X509_V_ERR_CERT_HAS_EXPIRED) 
      fprintf(stdout, " Error = X509_V_ERR_CERT_HAS_EXPIRED\n"); 
     else if(err == X509_V_OK) 
      fprintf(stdout, " Error = X509_V_OK\n"); 
     else 
      fprintf(stdout, " Error = %d\n", err); 
    } 

    if (err == X509_V_OK || err == X509_V_ERR_CERT_HAS_EXPIRED) 
     return 1; 

    return preverify; 
} 

Другой проблемы с более старыми мобильными и ИТНЫ гаджет является отсутствием часов и/или вспомогательного питания. Возможно, вам также придется разрешить X509_V_ERR_CERT_NOT_YET_VALID. Вы будете наблюдать это за устройство, которое работает и думает о нем в 1990-х или 2000-х годах. Старые телефоны без SIM-карты это все время. Я также наблюдал это на современных телефонах с низким уровнем доступа.

+0

Спасибо. Извините, я видел это только после того, как нашел еще одно обходное решение. (Я буквально прокомментировал код, устанавливающий истекшую ошибку в 'x509_vfy.c'). Ваше решение выглядит более прочным (и приятнее!), Чем мое. –

1

Как я ее решил:

проверяет время для сертификатов в ssl/x509_vfy.c:

static int check_cert_time(X509_STORE_CTX *ctx, X509 *x) 
{ 
    time_t *ptime; 
    int i; 

    . 
    . 
    . 

    i = X509_cmp_time(X509_get_notAfter(x), ptime); 
    . 
    . 
    . 

    if (i < 0) { 
     return 1; 
     /* Allow expired certificates! 
     * 
     * ctx->error = X509_V_ERR_CERT_HAS_EXPIRED; 
     * ctx->current_cert = x; 
     * if (!ctx->verify_cb(0, ctx)) 
     * return 0; 
     */ 
    } 

    return 1; 
} 

Я просто закомментировать часть, где находится устанавливает ошибку истечения. Не лучший способ сделать это, я бы предложил вместо этого использовать jww's answer. Я просто подумал, что должен задокументировать решение, которое я использовал.

Это решение означает, что OpenSSL не может обнаружить любых истекших сертификатов, даже если set_verify_cb изменяет функцию обратного вызова.