You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

libssh2中_libssh2_userauth_publickey期望的公钥格式及转换方法

libssh2 _libssh2_userauth_publickey 公钥格式要求及转换方法

函数期望的公钥格式

_libssh2_userauth_publickey 要求传入的 pubkeydata 是SSH协议标准的二进制公钥数据,结构规则如下:

  • 首4字节为大端模式的长度值,对应后续算法名称的字节数(例如"ssh-rsa"的长度是7,所以这4字节是00 00 00 07)
  • 紧随其后是算法名称的ASCII字节(例如"ssh-rsa"对应的字节为73 73 68 2d 72 73 61)
  • 后续为公钥参数数据(以RSA为例,会依次包含指数e、模数n,每个参数前同样带有4字节大端长度字段)

你遇到的_libssh2_ntohu32返回无效值,本质原因就是传入的pubkeydata不符合上述格式,首4字节不是算法名称的有效长度值。

从id_rsa.pub转换为目标格式的正确方法

OpenSSH生成的id_rsa.pub本身是「算法名 + Base64编码的SSH格式公钥 + 注释」的文本结构,不需要转成PEM格式处理。正确转换步骤如下:

  1. 提取id_rsa.pub中的Base64编码部分:
    grep -v "^#" id_rsa.pub | cut -d' ' -f2 > pubkey.base64
    
  2. 将Base64内容解码为二进制文件,这就是_libssh2_userauth_publickey需要的pubkeydata:
    base64 -d pubkey.base64 > pubkeydata.bin
    

验证格式正确性

用hexdump查看生成的pubkeydata.bin开头:

hexdump -C pubkeydata.bin | head -1

如果是ssh-rsa公钥,输出开头应该为:

00000000  00 00 00 07 73 73 68 2d  72 73 61 00 00 00 03 01  |....ssh-rsa.....|

你之前转换方法的问题

你通过ssh-keygen -e -m pem转成PEM格式,再用openssl asn1parse处理,得到的是X.509标准的ASN.1结构公钥,和SSH协议要求的格式完全不同,自然开头不会是00 00 00 07。

内容的提问来源于stack exchange,提问作者JonasVautherin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:05:06