2017-02-16 90 views
1

我正在挖掘源代碼,試圖找到一種方法讓OpenSSL始終接受過期證書。我無法找到過期的錯誤/警報和實際檢查代碼之間的鏈接。任何人都可以將我指向正確的方向嗎? (我的C不是很好,我依賴於可以從C++繼承的東西)使OpenSSL接受過期證書

我想接受過期證書的原因是因爲我們有一噸嵌入式系統,其證書將在幾個月內過期(更新不是一個選項,因爲它們不在或大容量存儲)。這些連接的服務器知道只接受這些系統,因此允許過期的證書似乎是最直接的解決方案。

+0

你想要做什麼樣的改變?使用'openssl'改變腳本?對使用OpenSSL庫函數的自定義二進制文件的更改? –

+0

我們在我們的服務器上使用nginx,所以我拉了oppenssl源代碼,並希望在過期檢查時強制執行OK。 –

+0

_Who_完全拒絕已過期的證書?用作(反向)代理的nginx? – Ctx

回答

2

讓OpenSSL的接受過期的證書......

在您的驗證回調函數,你應該同時接受X509_V_OKX509_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。你會觀察到這個設備在上個世紀九十年代或二十一世紀九十年代開機並認爲它。沒有SIM卡的舊手機一直都在使用它。我也在現代[低端] Android手機中觀察過它。

+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改變回調。