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例子工作正常。

原作者:
...