使用 RSA SHA 256 对字符串进行签名,仅将私钥作为字符串 .NET

Posted

技术标签:

【中文标题】使用 RSA SHA 256 对字符串进行签名,仅将私钥作为字符串 .NET【英文标题】:Sign a string with RSA SHA 256 with ONLY the Private Key as a String .NET 【发布时间】:2019-03-13 22:30:42 【问题描述】:

我们正在通过 RESTful API 与 Google 进行集成,我需要使用 RSA-SHA256 对 JWT 的有效负载进行签名,而我所拥有的只是一个字符串形式的私钥,看起来像

-----BEGIN PRIVATE KEY-----
MIIEvgIBfADANBg9qhkdsiG9w0BAQEFAASCBKgw
......
-----END PRIVATE KEY-----

我一直在到处寻找解决方案,但每个人都在谈论X509Certificate2,它需要一个 p12 文件或一些证书。现在我一个都没有,我只有一个字符串就是私钥。

Google 推荐使用https://jwt.io/,它可以与密钥字符串一起使用,但是,我需要我的 CODE 才能做到这一点。页面中列出了 3 个库:

    其中一个属于 Microsoft,完全没有文档。 另一个使用 X509Certificate2 或专门用于字符串键,只有一个链接到这个地方 http://www.donaldsbaconbytes.com/2016/08/create-jwt-with-a-private-rsa-key/,它使用了一些我没有的证书文件,因此它是一个错误且无用的链接。 #2 的同一创建者有另一个库,但它是用于手机的,它实际上有一个 RSA256 签名方法,它将私钥作为我的格式的字符串。

所以我的问题是 - 我的情况有一些可行的解决方案吗?因为我不敢相信没有其他人与 Google 集成。

【问题讨论】:

密钥到底有多长?还有更多关于.... 的内容吗? 你可以用 Convert.FromBase64String 把它变成字节,然后看看 X509 类是否喜欢它作为 rawData。 bommelding,整个键(带有“-----BEGIN PRIVATE KEY----”和结尾)是 1676 个字符长 这将是大约 1k 字节,足够长的证书。现在找出它是什么格式。在 Visual Studio 中检查字节可能是一个快速入门。 @bommelding:几乎可以肯定它是 PKCS8 私钥,而不是证书。 【参考方案1】:

我知道有一种方法可以将其转换为可在 C# 中使用的 pfx。

首先,如果您还没有安装 OpenSSL。 (您可以从http://slproweb.com/products/Win32OpenSSL.html 获得最新的“Win64 OpenSSL v#.#.#x Light”,尽管我对此来源不承担任何责任。)

您可能希望将“C:\Program Files\OpenSSL\bin\”添加到您帐户的路径变量中,以便可以在命令行中的任何位置使用“openssl.exe”。

在命令窗口中,导航到您的私钥文件所在的位置。我们称之为“priv.key”。发出以下两个命令,忽略 cmets:

# Create public self-signed certificate CRT file (with 7000yr validity) from private key (may leave all info empty)
openssl req -x509 -sha256 -new -key priv.pem -out pub.crt -days 2555000

# Combine into PFX container (encrypted with AES-256) (certificate needs to be included for .NET to read successfully)
openssl pkcs12 -export -aes256 -CSP "Microsoft Enhanced RSA and AES Cryptographic Provider" -inkey priv.pem -in pub.crt -out priv.pfx

请注意,在最后一个命令中,我正在创建一个加密的 pfx(这是可选的 - 我相信您可以将 -aes256 替换为 -nodes 以跳过它),并且我正在配置加密提供程序,以便密钥可以用于 SHA256 操作而不会引起 C# 抱怨。

您现在有一个 pfx 文件,您可以使用 X509Certificate2 的构造函数加载该文件。

我倾向于将此备忘单用于常见的 OpenSSL 命令: https://www.sslshopper.com/article-most-common-openssl-commands.html

【讨论】:

他没有证书,他只有一个私钥。 @JamesKPolk 我的指示包括创建证书基于该私钥,特别是允许我们创建一个pfx。

以上是关于使用 RSA SHA 256 对字符串进行签名,仅将私钥作为字符串 .NET的主要内容,如果未能解决你的问题,请参考以下文章

使用SHA-256和RSA 2048进行加密和签名

AES128_CBC_NoPading加密、sha256withRSA签名

为啥我使用 OpenSSL 和 Java 生成的 RSA-SHA256 签名不同?

支付宝签名

如何在 python 中使用 RSA SHA-256 签署令牌?

OpenSSL和Java产生不同的SHA256 RSA签名