Таким образом, проблема заключалась в том, что проверка сертификата не удалась.
- Посмотрел главную ветку hiRedis. Я нашел файл "ssl.c" (это sslio.c в моей версии 0.14.0) и нашел следующий код:
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, не соответствовал сертификату, загруженному на моем AWS NLB. Это является результатом внутренних ошибок связи.
После обновления ca-trust я изменил файл 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 по умолчанию либо неверно, либо не загружено. Я указал путь CA, который нашел самоподписанный сертификат. Я изменил код sslio.c, чтобы заново вставить функциональность VERIFY_PEER. Теперь пример-ssl работает правильно.
Просто примечание: AWS Network Load Balancer (NLB) не требует проверки сертификата клиента. Поэтому я мог бы установить и быть нулевым. Однако, если вы используете hiRedis (или любой другой API Redis в этом отношении) для подключения к лабораториям Redis Enterprise Cloud, они требуют client-AUTH в соответствии с их документацией.