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格式处理。正确转换步骤如下:
- 提取
id_rsa.pub中的Base64编码部分:grep -v "^#" id_rsa.pub | cut -d' ' -f2 > pubkey.base64 - 将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
相关产品推荐
相关产品推荐

