SmallJiaJia 2024-04-16 17:31 采纳率: 0%
浏览 189

libssh2密钥交换失败

img

img


使用libssh2库进行ssh连接,握手一直返回-8,无法交换密钥。搞了很久了,有知道为什么吗?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-16 17:34
    关注

    引自免费微信小程序:皆我百晓生

    在您提供的代码片段中,libssh2_session_handshake() 函数返回值为 -8 表示一个错误。根据 libssh2 的文档,这个错误码通常对应于 LIBSSH2_ERROR_KEY_EXCHANGE_FAILED,意味着密钥交换过程中出现了问题。

    密钥交换失败可能由多种原因引起,包括但不限于:

    1. 密钥类型不匹配:服务器和客户端支持的加密算法不同。
    2. 公钥验证失败:公钥与私钥不匹配,或者服务器上没有正确的公钥来验证客户端的身份。
    3. 网络问题:数据包丢失、网络中断等可能导致密钥交换过程中的通信异常。
    4. 安全策略限制:防火墙或其他安全设置可能阻止了必要的端口或协议。

    为了诊断和解决这个问题,您可以尝试以下几个步骤:

    步骤 1:检查密钥对

    确保您使用的公钥和私钥是配对的,并且与服务器上的公钥匹配。可以尝试更换一套公钥/私钥对,或者确认您的公钥已正确添加到服务器的 ~/.ssh/authorized_keys 文件中(对于 OpenSSH)。

    步骤 2:启用调试信息

    为了获取更详细的错误信息,可以在初始化 libssh2 连接时启用调试日志。这将帮助您了解具体哪个密钥交换算法失败。在调用 libssh2_init() 之前,添加以下代码:

    #include <libssh2/log.h>
    
    // 初始化日志等级为 LIBSSH2_LOG_VERBOSE
    libssh2_log_init(LIBSSH2_LOG_VERBOSITY, stderr);
    

    步骤 3:检查网络连接和防火墙

    确保您的网络连接正常,没有被防火墙或其他安全软件阻止。尝试从同一网络环境下的其他机器连接到同一服务器,看看是否也有同样的问题。

    步骤 4:查看服务器日志

    查看服务器的 ssh 日志(通常是 /var/log/auth.log/var/log/secure),可能会提供关于密钥交换失败的更多上下文信息。

    步骤 5:更新 libssh2 库

    确保您使用的 libssh2 库是最新的版本。有时候,旧版库可能存在已知的问题或兼容性问题。

    步骤 6:代码优化

    尽管您未提供完整的代码,但可以考虑优化代码结构,比如使用循环处理 libssh2_error_eagain 错误,而不是简单的条件判断。以下是优化后的代码段:

    #include <libssh2/session.h>
    #include <libssh2/log.h>
    
    // 初始化日志等级为 LIBSSH2_LOG_VERBOSE
    libssh2_log_init(LIBSSH2_LOG_VERBOSITY, stderr);
    
    int establish_ssh_session(libssh2_session **session, int sock) {
        int rc;
    
        // 初始化 libssh2
        if ((rc = libssh2_init()) != 0) {
            char *errmsg;
            libssh2_session_last_error(session, &errmsg, NULL, 0);
            printf("Error initializing libssh2: %d : %s\n", rc, errmsg);
            return -1;
        }
    
        // 创建新会话
        if (!(session = libssh2_session_new())) {
            char *errmsg;
            libssh2_session_last_error(session, &errmsg, NULL, 0);
            printf("Error creating new session: %s\n", errmsg);
            return -1;
        }
    
        // 设置 socket
        if ((rc = libssh2_session_set_blocking(*session, 0)) != 0) {
            char *errmsg;
            libssh2_session_last_error(session, &errmsg, NULL, 0);
            printf("Error setting blocking mode: %d : %s\n", rc, errmsg);
            return -1;
        }
        
        while ((rc = libssh2_session_handshake(*session, sock)) == LIBSSH2_ERROR_EAGAIN) {
            // Wait for more data or handle EINTR
        }
    
        if (rc) {
            char *errmsg;
            libssh2_session_last_error(session, &errmsg, NULL, 0);
            printf("Error %d : %s\n", rc, errmsg);
            printf("Failure establishing SSH session: %d\n", rc);
            return -1;
        }
    
        return 0;
    }
    

    如果你仍然遇到问题,请提供更全面的日志输出和详细情况,以便更好地分析问题所在。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月16日