使用libssh连接Debian主机时ssh-rsa算法认证失败问题排查
问题描述
我使用libssh连接运行Debian 8.11和OpenSSH_6.7p1的远程主机,该主机已配置我的RSA公钥。通过命令行可正常连接,但使用libssh连接虚拟机时失败,报错:
"Public key authentication failed: The key algorithm 'ssh-rsa' is not allowed to be used by PUBLICKEY_ACCEPTED_TYPES configuration option"
失败发生在以下代码段中:
static ssh_session start_session(const char* host, const char* user, const char* keyfile, const char* port) { ssh_session session = ssh_new(); if (session == NULL) { fprintf(stderr, "Error creating SSH session\n"); exit(EXIT_FAILURE); } ssh_options_set(session, SSH_OPTIONS_HOST, host); ssh_options_set(session, SSH_OPTIONS_USER, user); ssh_options_set(session, SSH_OPTIONS_PORT_STR, port); int rc = ssh_connect(session); if (rc != SSH_OK) { fprintf(stderr, "Error connecting to virtual machine: %s\n", ssh_get_error(session)); ssh_free(session); exit(EXIT_FAILURE); } rc = auth_keyfile(session, keyfile); if (rc != SSH_AUTH_SUCCESS) { fprintf(stderr, "Error authenticating with virtual machine\n"); ssh_disconnect(session); ssh_free(session); exit(EXIT_FAILURE); } return session; }
我已尝试更新SSH版本,但问题仍未解决,请问该问题的原因可能是什么?
问题原因及解决方向
核心原因
问题出在libssh的默认安全配置与远程主机的算法支持不匹配:
- 较新版本的libssh为规避SHA-1签名算法的安全风险,默认在
PUBLICKEY_ACCEPTED_TYPES配置中移除了ssh-rsa算法 - 你的远程主机运行的OpenSSH 6.7p1仅支持传统的
ssh-rsa算法,不兼容更安全的rsa-sha2-256/rsa-sha2-512,导致libssh与主机的算法协商失败 - 命令行的OpenSSH客户端(即使是6.7p1版本)默认允许
ssh-rsa,所以能正常连接
解决方法
1. 调整libssh的算法允许列表
在代码的ssh_connect调用前,显式将ssh-rsa添加到允许的公钥算法列表:
// 配置允许的公钥算法,包含ssh-rsa及其他兼容算法 const char* allowed_pubkey_types = "ssh-rsa,rsa-sha2-256,rsa-sha2-512"; ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES, allowed_pubkey_types);
2. 检查自定义认证函数
如果auth_keyfile是你自己实现的函数,确保它没有硬限制仅使用特定算法,要让libssh自动尝试所有已配置的允许算法;如果是调用libssh原生的ssh_userauth_publickey_file,只需完成上述配置即可。
3. 关于远程主机SSH版本更新的说明
你尝试更新SSH版本无效,是因为Debian 8.11属于旧版发行版,官方源提供的OpenSSH最高版本就是6.7p1,手动编译更高版本可能引发兼容性问题,因此优先修改libssh配置是更稳妥的方案。
内容的提问来源于stack exchange,提问作者Guilherme Moreira
相关产品推荐
相关产品推荐

