Git Bash生成RSA密钥调用Abenity API报错,求转PKCS1格式方法
Fixing "Not an RSA key" Error with Abenity API Using Git Bash-Generated RSA Keys
我刚碰到过一模一样的问题——Abenity API要求的是PKCS1格式的PEM公钥(就是你说的-----BEGIN RSA PUBLIC KEY-----开头的那种),但ssh-keygen -t rsa -b 4096默认生成的公钥是OpenSSH格式(ssh-rsa开头),两者的编码结构不一样,所以API识别不了。下面给你两种简单的解决办法:
方法一:用Git Bash里的OpenSSL命令行转换
Git Bash自带OpenSSL工具,直接在终端里跑下面的命令就能把你的OpenSSH公钥转成PKCS1格式:
# 假设你的公钥文件叫id_rsa.pub,转换后输出id_rsa_pkcs1.pub ssh-keygen -f id_rsa.pub -e -m PKCS8 | openssl rsa -pubin -RSAPublicKey_out -out id_rsa_pkcs1.pub
命令解释:
ssh-keygen -f id_rsa.pub -e -m PKCS8:把OpenSSH格式的公钥导出为PKCS8标准的PEM格式openssl rsa -pubin -RSAPublicKey_out -out id_rsa_pkcs1.pub:把PKCS8格式的公钥转换成PKCS1格式的RSA公钥
转换完成后打开id_rsa_pkcs1.pub,你就会看到熟悉的-----BEGIN RSA PUBLIC KEY-----开头的内容了。
方法二:在C#代码里直接转换(无需手动处理文件)
如果不想每次都手动跑命令,可以用BouncyCastle库在代码里直接把OpenSSH格式的公钥字符串转换成PKCS1格式。
步骤:
先安装BouncyCastle的NuGet包:
Install-Package BouncyCastle或者在Visual Studio的NuGet包管理器里搜索
BouncyCastle安装。用下面的代码实现转换:
using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using System.IO; using System.Text; public string ConvertOpenSshToPkcs1PublicKey(string openSshPublicKey) { // 拆分OpenSSH公钥的各个部分(去掉开头的ssh-rsa和末尾的注释) var keyParts = openSshPublicKey.Split(' ', StringSplitOptions.RemoveEmptyEntries); var publicKeyBytes = Convert.FromBase64String(keyParts[1]); // 解析OpenSSH公钥为RSA参数 var rsaParams = PublicKeyFactory.CreateKey(publicKeyBytes) as RsaKeyParameters; // 将RSA参数写入PKCS1格式的PEM字符串 using var stringWriter = new StringWriter(); var pemWriter = new PemWriter(stringWriter); pemWriter.WriteObject(new RsaKeyParameters(false, rsaParams.Modulus, rsaParams.Exponent)); return stringWriter.ToString(); }
使用示例:
// 你的OpenSSH格式公钥字符串 var openSshPubKey = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC................G+KssB6SPx+WbGpmW"; // 转换成PKCS1格式 var pkcs1PubKey = ConvertOpenSshToPkcs1PublicKey(openSshPubKey); // 现在pkcs1PubKey就是API需要的格式了
验证转换结果
不管用哪种方法,你都可以用OpenSSL命令验证转换后的公钥是否有效:
openssl rsa -pubin -in id_rsa_pkcs1.pub -text -noout
如果命令能正常输出公钥的模数(Modulus)和指数(Exponent),说明转换成功,拿去调用Abenity API就不会再报错了。
内容的提问来源于stack exchange,提问作者Amit Mishra
相关产品推荐
相关产品推荐

