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

标签 c# jwt rsa sha256 sign

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

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

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

Google 推荐 https://jwt.io/它可以与 key 字符串一起使用,但是,我需要我的代码来完成它。页面中列出了 3 个库:

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

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

最佳答案

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

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

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

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

# 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 来跳过它),我正在配置加密提供程序,以便 key 可以用于 SHA256 操作,而不会出现 C# 提示。

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

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

关于c# - 使用 RSA SHA 256 对字符串进行签名,仅使用私钥作为字符串 .NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52716046/

相关文章:

c# - 获取 OAuth2 刷新 token

c# - 是否有可能在 VS 2010 中将 C# 应用程序的发布版本设置为 "debug"

java - 如何在 jose4j 中从 X.509 PEM 证书生成 JWK?

authentication - 没有从 JWT token 创建用户身份

Python RSA加密消息传给其他语言解密

Python3 Cryptodome - 如何解密pem?

c# - 弹出启用

c# - URL 已被 CORS 策略阻止

go - dgrijalva/jwt-go 可以将声明转换到 MapClaims 而不是 StandardClaims?

go - 如何在golang中将65537转换为AQAB