Я работаю над проектом по созданию соединителя JWT с Box, который несколько команд могут использовать для своих собственных приложений.
У меня проблема с Закрытым ключом и при создании подписи. У меня нет четкого понимания сертификатов и что делать здесь. Может ли кто-нибудь объяснить, что я делаю неправильно и что мне нужно делать?
Вот код, который я пишу:
class BoxJWT
{
[string]$url;
[string]$clientID;
[string]$clientSecret;
[string]$enterpriseID;
[string]$publicKeyID;
[string]$privateKeyID;
[string]$passphrase;
<# ========&&==========&&==========&&==========&&======== #>
<# ========&&========= Connect to Box =========&&======== #>
<# ========&&==========&&==========&&==========&&======== #>
[object]BoxConnect()
{
#Get the bytes of the PrivateKey
$prik = [System.Text.Encoding]::UTF8.GetBytes($this.privateKeyID)
$exp = [int][double]::parse((Get-Date -Date $((Get-Date).AddSeconds(60).ToUniversalTime()) -UFormat %s))
#Create the header
$headers = @{
"alg" = "RS256";
"typ" = "JWT";
} | ConvertTo-Json -Compress
#Create the claim
$claim = @{
"iss" = $this.clientID;
"sub" = $this.enterpriseID;
"box_sub_type" = "enterprise";
"aud" = 'https://api.box.com/oauth2/token';
"exp" = $exp;
"jti" = (1..20 | %{ '{0:X}' -f (Get-Random -Max 128) }) -join ''
} | ConvertTo-Json -Compress
$headers_base64 = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($headers)).Split('=')[0].Replace('+', '-').Replace('/', '_')
$claim_base64 = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($claim)).Split('=')[0].Replace('+', '-').Replace('/', '_')
#Prepare the signature.
$pre_signature = ($headers_base64 + "." + $claim_base64)
$encyption = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2
$encyption.Import($prik)
#$JWTAssertion = "$headers_base64.$claim_base64.$signature"
#$body = 'grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&client_id=' + $this.clientID + '&client_secret=' + $this.clientSecret + '&assertion='+ $JWTAssertion
#Invoke-RestMethod -Uri $this.url -Body $body -Method Post -ContentType "application/x-www-form-urlencoded"
return '';
}
}
$file = "$env:userprofile\Desktop\box_config.json"
$cont = Get-Content $file | ConvertFrom-Json
$v = New-Object -TypeName BoxJWT
$v.url = "https://api.box.com/oauth2/token";
$v.clientID = $cont.boxAppSettings.clientID
$v.clientSecret = $cont.boxAppSettings.clientSecret
$v.enterpriseID = $cont.enterpriseID
$v.passphrase = $cont.boxAppSettings.appAuth.passphrase
$v.privateKeyID = $cont.boxAppSettings.appAuth.privateKey
$v.publicKeyID = $cont.boxAppSettings.appAuth.publicKeyID
$v.BoxConnect()
Ошибка:
Exception calling "Import" with "1" argument(s): "Cannot find the requested
object.
"
At C:\Users\username\Box\username\object-jwt.ps1:44 char:9
+ $encyption.Import($prik)
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : CryptographicException
Любая помощь очень ценится.
Спасибо!