仅使用私钥将RSA SHA 256的字符串签名为字符串.NET

时间:2018-10-09 08:00:10

标签: c# jwt rsa sha256 sign

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

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

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

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

  1. 其中之一属于Microsoft,并且绝对没有文档。
  2. 另一人正在使用X509Certificate2或专门用于字符串键的指向此地方http://www.donaldsbaconbytes.com/2016/08/create-jwt-with-a-private-rsa-key/的链接使用了我没有的一些证书文件,因此以错误的,无用的链接开头。
  3. #2的相同创建者还有另一个库,但它是用于手机的,实际上它具有用于RSA256签名的方法,该方法将私钥作为完全符合我格式的字符串。

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

1 个答案:

答案 0 :(得分:1)

我知道一种将其转换为可以在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来跳过它),并且我正在配置加密提供程序,例如该键可用于SHA256操作而无需C#抱怨。

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

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