【问题标题】:hiredis fails with username and password in hostnamehiredis 在主机名中使用用户名和密码失败
【发布时间】:2019-08-26 11:56:12
【问题描述】:

我正在尝试在 C 上运行 hiredis CentOS

以下代码似乎运行良好:

...
const char *hostname = "my.redis-as-a-service.com";
int port = 8765;

const char *cert = "-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----\n";
const char *key = "-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----\n";
const char *ca = "-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----\n";

struct timeval tv = { 1, 500000 }; // 1.5 seconds
redisOptions options = {0};
REDIS_OPTIONS_SET_TCP(&options, hostname, port);
options.timeout = &tv;
c = redisConnectWithOptions(&options);

if (c == NULL || c->err) {
    if (c) {
        printf("Connection error: %s\n", c->errstr);
        redisFree(c);
    } else {
        printf("Connection error: can't allocate redis context\n");
    }
    exit(1);
}

if (redisSecureConnection(c, ca, cert, key, "sni") != REDIS_OK) {
    printf("Couldn't initialize SSL!\n");
    printf("Error: %s\n", c->errstr);
    redisFree(c);
    exit(1);
}

但是当我尝试针对 Compose.com 运行它时,它需要在 URL 中使用 usernamepassword,例如:

const char *hostname = "USERNAME:PASSWORD@my.redis-as-a-service.com";

然后它会在没有特定错误的情况下失败。简单:

Connection error: Name or service not known

【问题讨论】:

  • 当主机名的名称解析(通常是 DNS 查找)失败时,通常会出现这种情况。有可能是语法错误,整个字符串USERNAME:PASSWORD@my.redis-as-a-service.com 被当作主机名(当然不能存在)
  • 应该在代码中修复,还是在OS上修复?

标签: c ssl redis centos hiredis


【解决方案1】:

您不能在主机名字符串中指定用户名和密码。整个字符串被视为主机名,DNS 查找失败。

相反,您必须这样做:

首先,无需身份验证凭据即可正常连接。

成功后,就可以进行身份​​验证了

redisCommand(c, "AUTH password");

请注意,redis 不支持用户名,因此您不能指定一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多