当前位置: 首页 > 知识库问答 >
问题:

导入OpenSSL ECDSA PEM私钥并签名

钮实
2023-03-14

要使用OpenSSL生成私钥和公钥,我已经运行

openssl ecparam -genkey -name secp256k1 -out private-key.pem
openssl ec -in private-key.pem -out public-key.pem -pubout

我将公钥上传到远程服务器。然后将private-key.pem导入。Net Framework(它必须是。Net Framework)C#服务使用它来签署API有效负载:

public string LoadFromCng(byte[] request, string privateKeyFile)
{
    CngKey cng = CngKey.Open(privateKeyFile);

    // Sign the request body with the private key.
    ECDsaCng dsa = new ECDsaCng(cng);
    byte[] signedRequest = dsa.SignData(request, HashAlgorithmName.SHA256);
    return Convert.ToBase64String(signedRequest);
}

privateKeyFile=private-key.pem上面的代码给出Keyset不存在

如果我使用mkcert并运行mkcert-ecdsa-pkcs12private-key.pem它会生成一个名为private-key.pem.p12的PKCS#12密钥,然后:

public string LoadFromX509(byte[] request, string privateKeyFile)
{
    var cert = new X509Certificate2(privateKeyFile, "changeit");
    var key = cert.GetECDsaPrivateKey();
    byte[] signedRequest = key.SignData(request, HashAlgorithmName.SHA256);
    return Convert.ToBase64String(signedRequest);
}

使用<code>privateKeyFile=private-key.pem。p12上面的代码似乎对请求进行了签名,但API响应为远程服务器返回了一个错误:(400)错误请求,这意味着API提供程序无法从公钥中解码有效负载。

在这里查看备忘单并创建X509 pfx证书时,我也会遇到同样的400错误。

openssl req -new -x509 -key private-key.pem -out cert.pem -days 360
openssl pkcs12 -export -inkey private-key.pem -in cert.pem -out cert.pfx

上面的方法似乎对有效负载进行签名,但提供者以400响应。

这里、这里、这里、这里和其他地方的建议都不起作用。

我不能使用NETCore或NET5,因此这也不起作用。ImportPkcs8PrivateKey方法在.Net Framework中不可用。

如果我尝试在这里使用Bouncy Castle per,我会发现<code>无法强制转换类型为'Org.BouncyCastle.Crypto.Parameters'的对象。ECPrivateKeyParameters'输入“Org.BouncyCastle.Crypto.Parameters.rsPrivateCrTKeyParameter”

共有1个答案

终逸仙
2023-03-14

第一个OpenSSL语句创建一个EC参数文件private-key.pem,其中包含一个SEC1格式的PEM编码私有EC密钥。

使用.NET Framework,最简单的方法是使用BouncyCastle进行密钥导入。BouncyCastle 还支持 ASN.1/DER 格式和 IEEE P1363 (r|s) 格式用于 EC 签名。

以下代码以SEC1格式导入PEM编码的私有EC密钥并对消息进行签名。

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities.Encoders;
...
string pkcs8 =  @"-----BEGIN EC PRIVATE KEY-----
                MHQCAQEEIMmN/YG6BtIqm9eAcYtKdcbJosNKbB76vGMTSltPLNiioAcGBSuBBAAK
                oUQDQgAESGnGxuBPdrwv1TkJEorsaNk74+ZFh2jzww2SpLTqQqkvOf5IP6fuODS/
                hzztSBpsBpX9LUZh8TYHX0HRMagkaA==
                -----END EC PRIVATE KEY-----";

TextReader privateKeyTextReader = new StringReader(pkcs8);
AsymmetricCipherKeyPair privateKeyParams = (AsymmetricCipherKeyPair)new PemReader(privateKeyTextReader).ReadObject();

byte[] message = Encoding.UTF8.GetBytes("The quick brown fox jumps over the lazy dog");
ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA"); // ASN.1/DER format
//ISigner signer = SignerUtilities.GetSigner("SHA-256withPLAIN-ECDSA"); // r|s format
signer.Init(true, privateKeyParams.Private);
signer.BlockUpdate(message, 0, message.Length);
byte[] signature = signer.GenerateSignature();
Console.WriteLine(Hex.ToHexString(signature)); // 3046022100967c2e890d933c75468dceaf61152add41f143568dcb967583e1b307a0b495e30221008f6837c0d9cc01fc7bfe54ed5b6267fd3e64c2d3ff771e72762f24c20071c454
 类似资料:
  • 我想通过RSACryptServiceProvider签名和验证数据 为此,我需要公钥和私钥。 在我的项目中,我将公钥和私钥存储在XML文件中。 有一次,我生成了我的公钥和私钥 在上面,我展示了“通过公钥验证数据” 我的SignData方法类似。 在那里, 我的问题是:举个例子,我认识到;通过crt/pem/cert等导入公钥和私钥。证书文件。在那里我存储了XML文件。 我的解决方案错了吗? 第二

  • 我有这样的代码来导入一个ECDH键: 这是可行的,但是它只返回私钥,而不是整个密钥对。如何从私钥中导出公钥?

  • 我有一个由openssl以以下方式生成的密钥对 openssl genrsa-out private_key.pem 2048 所以我的问题是如何使用KeyTool将现有密钥导入到BKS密钥库中? 谢谢

  • 小问题:如何使进口证书(pfx)不可出口? 是不支持这种场景还是我们缺少了什么?提前道谢!

  • 我试图从私钥中生成一个公共ECDSA密钥,但我还没有在互联网上找到多少关于如何实现这一点的帮助。几乎所有的事情都是为了从公钥规范生成公钥,我不知道如何得到它。到目前为止,我总结了以下内容: 但是,在运行时,我会出现以下错误: 我做错了什么?有更好/更简单的方法吗? 编辑:我已经设法编译了一些代码,但它不能正常工作: 当我运行它时,它会生成一个公钥,但它不是私钥对应的公钥。

  • 我正在尝试在BouncyCastle中导入公共和私有ECDH密钥。为了导入公钥,我使用了下面的C#代码,代码运行良好: 公钥:042E3E5CCF6B9AB04BE7A22F3FACCDE73C87E87155394A34815408A896CA18A374DAC669AF36220FC863767F4AF47507C5BC221FC4A19874DAF39B074E3EB8 私钥:be3f9bf