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

在中使用PEM私钥与RS256签署JWT令牌。净额4.0

赫连照
2023-03-14

我需要与GitHub集成API进行交互,但具体是从。NET 4.0,所以我不能使用Octokit。

基本上,我得到了一个PEM格式化的私有rsa密钥(标准不支持。NET API),并且必须发送RS256 jwt令牌才能获得与API交互的身份验证令牌。

提供了以下ruby示例代码:

# Private key contents
private_pem = File.read(path_to_pem)
private_key = OpenSSL::PKey::RSA.new(private_pem)

# Generate the JWT
payload = {
  # issued at time
  iat: Time.now.to_i,
  # JWT expiration time
  exp: 1.minute.from_now.to_i,
  # Integration's GitHub identifier
  iss: 42
}

jwt = JWT.encode(payload, private_key, "RS256")

使用下面的curl示例

curl -i -X POST \
-H "Authorization: Bearer $JWT" \
-H "Accept: application/vnd.github.machine-man-preview+json" \
https://api.github.com/installations/:installation_id/access_tokens

以及以下Result示例:

Status: 201 Created
{
  "token": "v1.1f699f1069f60xxx",
  "expires_at": "2016-07-11T22:14:10Z",
  "on_behalf_of": null
}

共有1个答案

诸修伟
2023-03-14

能够在上使用以下nuget包成功地与此身份验证API交互。净额4.0

  • BouncyCastle1.8.1
  • jose jwt2.1.0
  • <代码>Newtonsoft。Json9.0.1
  • <代码>FSharp。数据 2.3.2

F#代码:

open System
open System.Security.Cryptography
open Jose
open Org.BouncyCastle.Crypto
open Org.BouncyCastle.Security
open Org.BouncyCastle.OpenSsl
open Org.BouncyCastle.Crypto.Parameters
open Newtonsoft.Json
open FSharp.Data

let integrationID = 42 //sample
let installID = 10 // sample
let appUserAgent = "My-App-Name" //sample

//Result Format
type InstallToken = { token:string; expires_at:DateTime ; on_behalf_of: string}

let apiBase = "https://api.github.com"
let instBase = apiBase + sprintf "/installations/%i" installID

//.Net 4.0 doesn't have a method for seconds from Epoch
let epochSeconds (date:DateTime) =
      date.ToUniversalTime().Subtract(new DateTime(1970,1,1,0,0,0,DateTimeKind.Utc)).TotalSeconds |> Convert.ToInt64

let createBotToken (pemPath:string) =

    //Parse PEM file with BouncyCastle
    use streamRead = new StreamReader(pemPath)
    let pemRead = PemReader(streamRead)
    let bcRSA:AsymmetricCipherKeyPair = downcast (pemRead.ReadObject())

    //Convert to .NET RSA object with Bouncy Castle
    let dnRSA = bcRSA.Private :?> RsaPrivateCrtKeyParameters |> DotNetUtilities.ToRSAParameters
    use key = new RSACryptoServiceProvider()
    key.ImportParameters(dnRSA)


    //JWT needs literal Dictionary<string,obj> type
    let payload= dict [
                      "iat", (DateTime.Now |> epochSeconds) :> obj ; 
                      "exp", (DateTime.Now.AddMinutes(1.0) |> epochSeconds) :> obj;
                      "iss", integrationID :> obj; 
                     ]
                  |> Dictionary<string,obj>

    //Create token with JWT
    let bearer = JWT.Encode(payload, key, JwsAlgorithm.RS256)

    //Send Request with FSharp.Data
    let iresult = Http.RequestString( instBase + "/access_tokens", httpMethod=HttpMethod.Post ,
                                                         headers=[HttpRequestHeaders.Authorization (sprintf "Bearer %s" bearer); 
                                                                  HttpRequestHeaders.UserAgent appUserAgent;
                                                                  HttpRequestHeaders.Accept "application/vnd.github.machine-man-preview+json";
                                                                  ])
    //Use Newtonsoft.Json to convert to obj
    JsonConvert.DeserializeObject<InstallToken>(iresult)
 类似资料:
  • 我正在使用jose-jwt库,并希望使用RS256加密算法在C#中创建一个有签名的JWT。我对密码学没有经验,所以请原谅我的无知。我在文档中看到以下示例: 它显示了文件的使用,但是如何使用下面表单的RSA密钥文件呢?我正在查看X509Certificate2的文档,但我看不到RSA私钥的选项。它似乎只接受,我认为这是公钥。 最后,文档中列出的两个选项之间的区别是什么?我如何在这两个选项之间进行选择

  • 我试图测试我正在构建的一个关于JWT的软件的功能,以了解它,它使用Firebase JWT PHP包 我正在尝试创建一个使用密钥对作为编码/解码的测试用例,但无法获得http://jwt.io页面以使用我的密钥创建令牌。 这些是我使用命令创建的密钥,没有任何修改。 我转到页面,选择HS256/384/512并删除页面默认设置的键。然后我粘贴我的私钥以便对我的数据进行签名。但是,该页面不会生成任何J

  • 好吧,我已经经历了很多问题,以及他们各自的答案,大多不是私钥(从-----BEGIN RSA PRIVATE KEY开始-----) 在jwt中编码,公钥正在发送(这不是从-----BEGIN RSA PRIVATE KEY开始-----). 我已经使用python中的pyjwt库进行编码并获取所需的令牌,我使用它来发送到docuign以进行授权 它总是返回ValueError:无法反序列化数据,

  • 我正在PHP中使用私钥创建一个JWT令牌。为此,我使用OpenSSL库。在任何事情之前,我将共享我的代码: PHP 所以,这个JWT令牌将用于我试图访问的服务器中的身份验证。但我从外部服务器得到的响应是一个错误的请求,我的JWT令牌创建中出现了问题。 使用相同的凭据,我使用库尝试了javascript,然后它给了我正确的响应。 JAVASCRIPT中文 我可以清楚地看到的一个区别是,对于php端的

  • 要使用OpenSSL生成私钥和公钥,我已经运行 我将公钥上传到远程服务器。然后将导入。Net Framework(它必须是。Net Framework)C#服务使用它来签署API有效负载: 用上面的代码给出 如果我使用并运行它会生成一个名为的PKCS#12密钥,然后: 使用<code>privateKeyFile=private-key.pem。p12上面的代码似乎对请求进行了签名,但API响应为

  • 我有一个由多个客户端访问的JWT实现。从某种意义上说,多个客户端正在向我发送JWT令牌,他们正在使用我在他们之间共享的RSA公钥创建JWT令牌。我正在使用RSA私钥解码JWT令牌。 但现在由于一些安全原因,我需要向他们发送不同的公钥,并获得JWT令牌,然后使用我拥有的一个私钥对其进行解码。 简而言之,我将如何生成多个公钥和单个私钥或任何类似的方法。