Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用RSA SHA 256对字符串进行签名,仅将私钥作为字符串.NET_C#_Jwt_Rsa_Sha256_Sign - Fatal编程技术网

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

C# 使用RSA SHA 256对字符串进行签名,仅将私钥作为字符串.NET,c#,jwt,rsa,sha256,sign,C#,Jwt,Rsa,Sha256,Sign,我们正在通过RESTful API与Google进行集成,我需要用RSA-SHA256对JWT的有效负载进行签名,我所拥有的只是一个字符串形式的私钥,看起来像 -----BEGIN PRIVATE KEY----- MIIEvgIBfADANBg9qhkdsiG9w0BAQEFAASCBKgw ...... -----END PRIVATE KEY----- 我一直在到处寻找解决方案,但每个人都在谈论X509Certificate2,它需要一个p12文件或一些证书。现在我没有这两个,我只有一个

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

-----BEGIN PRIVATE KEY-----
MIIEvgIBfADANBg9qhkdsiG9w0BAQEFAASCBKgw
......
-----END PRIVATE KEY-----
我一直在到处寻找解决方案,但每个人都在谈论
X509Certificate2
,它需要一个p12文件或一些证书。现在我没有这两个,我只有一个字符串作为私钥

谷歌推荐,它可以使用键字符串,但我需要我的代码来完成。页面中列出了3个库:

  • 其中一个属于微软,并且完全没有文档
  • 另一个是使用
    X509Certificate2
    ,或者专门针对字符串密钥,它只有一个指向此位置的链接,该位置使用了一些我没有的证书文件,这使得它从一开始就是一个错误且没有帮助的链接
  • #2的同一个创建者有另一个lib,但它是针对手机的,它实际上有一个RSA256签名方法,该方法将私钥作为一个与我的格式完全相同的字符串

  • 所以我的问题是,我的案例是否有可行的解决方案?因为我不敢相信没有其他人能与Google集成。

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

    首先,如果尚未安装OpenSSL,请安装OpenSSL。(您可以从中获得最新的“Win64 OpenSSL v#.#.#.#x Light”,但我对此来源不承担任何责任。)

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

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

    # 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(这是可选的-我相信您可以用
    -nodes
    替换
    -aes256
    以跳过它),并且我正在配置加密提供程序,以便密钥可以用于SHA256操作,而无需C

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

    我倾向于将此备忘单用于常见的OpenSSL命令:

    钥匙到底有多长?还有更多关于
    的内容,对吗?您可以使用Convert.FromBase64String将其转换为字节,然后查看X509类是否喜欢将其作为rawData.bommelding,整个密钥(带有“-----开始私钥----”和结尾)是1676个字符,长度约为1k字节,足以用于证书。现在找出它的格式。在Visual studio中检查字节可能是一个快速的开始。@bommelding:几乎可以肯定这是PKCS8私钥,而不是证书。他没有证书,只有私钥。@JamesKPolk我的说明包括基于该私钥创建证书,特别是允许我们创建pfx。