redis - C類 - 無法獲取HiRedis TLS例子ssl連接

66 1

我正在嘗試使用HiRedis API來執行rtc伺服器的TLS連接,我的項目需要通過互聯網將客戶數據發送到雲托管的Redis伺服器,我需要使用TLS來保護數據。

我看到HiRedis為TLS連接提供了一些有限的支持,我創建了一個Prototype來嘗試TLS代碼。

我已將私人證書和私人密鑰安裝到這台機器上,

但是,在嘗試TLS連接時,我得到以下信息:


[machine]# example-ssl <to-redis-host> 443 <cert_file> <private_key_file>



ST(0x10). before/connect initialization. R(0x1)U


ST(0x1001). before/connect initialization. R(0x1)U


ST(0x1001). SSLv2/v3 write client hello A. R(0x1)U


ST(0x1001). SSLv3 read server hello A. R(0x1)U


ST(0x4008). error. R(0x230)F


ST(0x1002). error. R(0xffffffff)U


ST(0x1002). error. R(0xffffffff)U


Couldn't initialize SSL!


Error: SSL_connect() failed




在這裡可以找到例子ssl文件: https://github.com/redis/hiredis/blob/master/examples/example-ssl.c

HiRedis版本有sslio.c,但是,它似乎在主分支中重命名為ssl.c : https://github.com/redis/hiredis/blob/master/ssl.c

如何讓它工作?

时间: 原作者:

132 5

問題出在證書驗證失敗。

  • 看了看hiRedis的master分枝,找到"ssl.c"(我的0.14.0版本里有sslio.c )文件,發現下面的代碼:
  • 
     if (c->err == 0) {
    
    
     char err[512];
    
    
     if (rv == SSL_ERROR_SYSCALL)
    
    
     snprintf(err,sizeof(err)-1,"SSL_connect failed: %s",strerror(errno));
    
    
     else {
    
    
     unsigned long e = ERR_peek_last_error();
    
    
     snprintf(err,sizeof(err)-1,"SSL_connect failed: %s",
    
    
     ERR_reason_error_string(e));
    
    
     }
    
    
     __redisSetError(c, REDIS_ERR_IO, err);
    
    
     }
    
    
     return REDIS_ERR;
    
    
    
    

我將代碼合併到程序中,然後得到了以下有用的錯誤信息:


ST(0x10). before/connect initialization. R(0x1)U


ST(0x1001). before/connect initialization. R(0x1)U


ST(0x1001). SSLv2/v3 write client hello A. R(0x1)U


ST(0x1001). SSLv3 read server hello A. R(0x1)U


ST(0x4008). error. R(0x230)F


ST(0x1002). error. R(0xffffffff)U


ST(0x1002). error. R(0xffffffff)U


Couldn't initialize SSL!


Error: SSL_connect() failed: certificate verify failed <-------------



在redhat中導入自簽名證書,發現我在hiRedis客戶端電腦上安裝的證書與自動配置文件中載入的證書不匹配,這是內部通信錯誤。

更新ca信任后,我將example-ssl.c文件修改為以下內容:


 const char *cert = NULL;


 const char *key = NULL;


 const char *ca = NULL;


 ca ="/etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt";



我指定了CA路徑,它找到了自簽名證書,我更改了sslio.c代碼以重新插入VERIFY_PEER,現在,ssl例子工作正常。

原作者:
...