Skip to content

Instantly share code, notes, and snippets.

@Nillth
Last active May 8, 2023 07:27
Show Gist options
  • Save Nillth/032e7ae397fb886c37f380c9047b2f75 to your computer and use it in GitHub Desktop.
Save Nillth/032e7ae397fb886c37f380c9047b2f75 to your computer and use it in GitHub Desktop.
PowerShell function to Convert PEM files to X509 (PFX) Certificate
<#
.NOTES
===========================================================================
Created by: Marc Collins (Marc.Collins@Qlik.com)
Organization: Qlik Professional Services
Filename: Convert-PemtoX509.ps1
===========================================================================
.DESCRIPTION
Converts PEM files to X509 Certificates
Can be used with QlikClient.pems
.Example
$PublicKey = 'C:\ProgramData\Qlik\Sense\Repository\Exported Certificates\.Local Certificates\client.pem'
$PrivateKey = 'C:\ProgramData\Qlik\Sense\Repository\Exported Certificates\.Local Certificates\client_key.pem'
$Cert = Convert-PemtoX509 -PublicKey $PublicKey -PrivateKey $PrivateKey
#>
function Convert-PemtoX509
{
param
(
[Parameter(Mandatory = $true)]
[System.IO.FileInfo]$PublicKey,
[System.IO.FileInfo]$PrivateKey,
[System.IO.FileInfo]$OutPFX,
[securestring]$PFXPassword,
[switch]$NoPassword
)
BEGIN
{
if ($PFXPassword.Length -eq 0 -and $null -ne $OutPFX -and $NoPassword.IsPresent -eq $false)
{
$PFXPassword = Read-Host -Prompt "Enter PFX Password" -AsSecureString
}
[string]$KEY_HEADER = "-----BEGIN RSA PRIVATE KEY-----"
[string]$KEY_FOOTER = "-----END RSA PRIVATE KEY-----";
[System.Security.Cryptography.X509Certificates.X509Certificate2]$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
function Get-RSA
{
param
(
[Parameter(Mandatory = $false)]
[string]$PEM
)
if (Test-IsRSAPrivateKeyAvailable -PEM $PEM)
{
[System.Security.Cryptography.RSAParameters]$PrivateKey = Convert-PEMToRSAParameters -PEM $PEM
[System.Security.Principal.SecurityIdentifier]$everyoneSI = New-Object System.Security.Principal.SecurityIdentifier([System.Security.Principal.WellKnownSidType]::WorldSid, $null)
[System.Security.AccessControl.CryptoKeyAccessRule]$rule = New-Object System.Security.AccessControl.CryptoKeyAccessRule($everyoneSI, [System.Security.AccessControl.CryptoKeyRights]::FullControl, [System.Security.AccessControl.AccessControlType]::Allow)
[System.Security.Cryptography.CspParameters]$cspParameters = New-Object System.Security.Cryptography.CspParameters;
$cspParameters.KeyContainerName = "MY_C_NAME";
$cspParameters.ProviderName = "Microsoft Enhanced RSA and AES Cryptographic Provider";
$cspParameters.ProviderType = 24;
#$cspParameters.Flags = [System.Security.Cryptography.CspProviderFlags]::UseMachineKeyStore;
#$cspParameters.CryptoKeySecurity = New-Object System.Security.AccessControl.CryptoKeySecurity
#$cspParameters.CryptoKeySecurity.SetAccessRule($rule);
[System.Security.Cryptography.RSACryptoServiceProvider]$rsa = New-Object System.Security.Cryptography.RSACryptoServiceProvider($cspParameters);
$rsa.PersistKeyInCsp = $true;
$rsa.ImportParameters($privateKey);
}
return $rsa;
}
function Convert-PEMToRSAParameters
{
param
(
[Parameter(Mandatory = $true)]
[string]$PEM
)
if (Test-IsRSAPrivateKeyAvailable -PEM $PEM)
{
$keyFormatted = $PEM
[int]$cutIndex = $keyFormatted.IndexOf($KEY_HEADER);
$keyFormatted = $keyFormatted.Substring($cutIndex, $keyFormatted.Length - $cutIndex);
$cutIndex = $keyFormatted.IndexOf($KEY_FOOTER);
$keyFormatted = $keyFormatted.Substring(0, $cutIndex + $KEY_FOOTER.Length);
$keyFormatted = $keyFormatted.Replace($KEY_HEADER, "");
$keyFormatted = $keyFormatted.Replace($KEY_FOOTER, "");
$keyFormatted = $keyFormatted.Replace("\r", "");
$keyFormatted = $keyFormatted.Replace("\n", "");
$keyFormatted = $keyFormatted.Trim();
[byte[]]$privateKeyInDER = [System.Convert]::FromBase64String($keyFormatted);
$MemoryStream = New-Object System.IO.MemoryStream( , $privateKeyInDER)
$BinaryReader = New-Object System.IO.BinaryReader( , $MemoryStream)
[System.UInt16]$twobytes = 0;
[int]$elements = 0;
[byte]$bt = 0;
try
{
$twobytes = $binaryReader.ReadUInt16();
if ($twobytes -eq 0x8130)
{
$binaryReader.ReadByte() | Out-Null
}
elseif ($twobytes -eq 0x8230)
{
$binaryReader.ReadInt16() | Out-Null
}
else
{
throw "Wrong data";
}
$twobytes = $binaryReader.ReadUInt16();
if ($twobytes -ne 0x0102)
{
throw "Wrong data";
}
$bt = $binaryReader.ReadByte();
if ($bt -ne 0x00)
{
throw "Wrong data"
}
$elements = Get-IntegerSize($binaryReader)
$paramModulus = $binaryReader.ReadBytes($elements);
$elements = Get-IntegerSize($binaryReader)
$paramE = $binaryReader.ReadBytes($elements);
$elements = Get-IntegerSize($binaryReader)
$paramD = $binaryReader.ReadBytes($elements);
$elements = Get-IntegerSize($binaryReader)
$paramP = $binaryReader.ReadBytes($elements);
$elements = Get-IntegerSize($binaryReader)
$paramQ = $binaryReader.ReadBytes($elements);
$elements = Get-IntegerSize($binaryReader)
$paramDP = $binaryReader.ReadBytes($elements);
$elements = Get-IntegerSize($binaryReader)
$paramDQ = $binaryReader.ReadBytes($elements);
$elements = Get-IntegerSize($binaryReader)
$paramIQ = $binaryReader.ReadBytes($elements);
Assert-Length -Data ([ref]$paramD) -DesiredLength 256
Assert-Length -Data ([ref]$paramDP) -DesiredLength 128
Assert-Length -Data ([ref]$paramDQ) -DesiredLength 128
Assert-Length -Data ([ref]$paramE) -DesiredLength 3
Assert-Length -Data ([ref]$paramIQ) -DesiredLength 128
Assert-Length -Data ([ref]$paramModulus) -DesiredLength 256
Assert-Length -Data ([ref]$paramP) -DesiredLength 128
Assert-Length -Data ([ref]$paramQ) -DesiredLength 128
[System.Security.Cryptography.RSAParameters]$rsaParameters = New-Object System.Security.Cryptography.RSAParameters
$rsaParameters.Modulus = $paramModulus;
$rsaParameters.Exponent = $paramE;
$rsaParameters.D = $paramD;
$rsaParameters.P = $paramP;
$rsaParameters.Q = $paramQ;
$rsaParameters.DP = $paramDP;
$rsaParameters.DQ = $paramDQ;
$rsaParameters.InverseQ = $paramIQ;
return $rsaParameters;
}
finally
{
$BinaryReader.Close() | Out-Null
}
}
}
function Get-IntegerSize
{
param
(
[Parameter(Mandatory = $true)]
[System.IO.BinaryReader]$Binary
)
[byte]$bt = 0;
[byte]$lowbyte = 0x00;
[byte]$highbyte = 0x00;
[int]$count = 0;
$bt = $binary.ReadByte();
if ($bt -ne 0x02)
{
return 0
}
$bt = $binary.ReadByte();
if ($bt -eq 0x81)
{
$count = $binary.ReadByte()
}
elseif ($bt -eq 0x82)
{
$highbyte = $binary.ReadByte();
$lowbyte = $binary.ReadByte();
[byte[]]$modint = $lowbyte, $highbyte, 0x00, 0x00;
$count = [System.BitConverter]::ToInt32($modint, 0);
}
else
{
$count = $bt;
}
while ($binary.ReadByte() -eq 0x00)
{
$count -= 1;
}
$binary.BaseStream.Seek(-1, [System.IO.SeekOrigin]::Current) | Out-Null
return $count;
}
function Assert-Length
{
param
(
[Parameter(Mandatory = $true)]
[ref]$Data,
[Parameter(Mandatory = $true)]
[int]$DesiredLength
)
if ($null -eq $data -or $data.Value.Length -ge $desiredLength)
{
return;
}
[int]$zeros = $desiredLength - $data.Value.Length;
[byte[]]$newData = [byte[]]::new($desiredLength)
[System.Array]::Copy($data.Value, 0, $newData, $zeros, $data.Value.Length);
$data.Value = $newData;
}
function Test-IsRSAPrivateKeyAvailable
{
param
(
[Parameter(Mandatory = $false)]
[string]$PEM
)
return (($null -ne $PEM) -and $PEM.Contains($KEY_HEADER) -and $PEM.Contains($KEY_FOOTER))
}
}
PROCESS
{
if ($PublicKey.Exists)
{
[string]$PEMPublicKey = [System.IO.File]::ReadAllText($PublicKey)
}
if ($PrivateKey.Exists)
{
[string]$PEMPrivateKey = [System.IO.File]::ReadAllText($PrivateKey)
}
[byte[]]$pemCertWithPrivateKey = [System.Text.Encoding]::ASCII.GetBytes($PEMPublicKey)
[System.Security.Cryptography.RSACryptoServiceProvider]$rsaPK = Get-RSA -PEM $PEMPrivateKey
$cert.Import($pemCertWithPrivateKey, "", ([System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::MachineKeySet, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::PersistKeySet, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable))
if ($null -ne $rsaPK)
{
$cert.PrivateKey = $rsaPK;
}
}
END
{
if ($null -ne $OutPFX)
{
if ($PFXPassword.Length -gt 0 -and $NoPassword.IsPresent -eq $false)
{
[system.io.file]::WriteAllBytes($OutPFX.fullname, $Cert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pfx, $PFXPassword))
}
else
{
[system.io.file]::WriteAllBytes($OutPFX.fullname, $Cert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pfx))
}
}
else
{
return $cert;
}
}
}
# SIG # Begin signature block
# MIIrmgYJKoZIhvcNAQcCoIIrizCCK4cCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCD/L6ozJ0FquUsB
# om8coZ7xoD5VIUNPtHyKGL6fEgw+RaCCJHwwggNfMIICR6ADAgECAgsEAAAAAAEh
# WFMIojANBgkqhkiG9w0BAQsFADBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3Qg
# Q0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
# bjAeFw0wOTAzMTgxMDAwMDBaFw0yOTAzMTgxMDAwMDBaMEwxIDAeBgNVBAsTF0ds
# b2JhbFNpZ24gUm9vdCBDQSAtIFIzMRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYD
# VQQDEwpHbG9iYWxTaWduMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
# zCV2kHkGeCIW9cCDtoTKKJ79BXYRxa2IcvxGAkPHsoqdBF8kyy5L4WCCRuFSqwyB
# R3Bs3WTR6/Usow+CPQwrrpfXthSGEHm7OxOAd4wI4UnSamIvH176lmjfiSeVOJ8G
# 1z7JyyZZDXPesMjpJg6DFcbvW4vSBGDKSaYo9mk79svIKJHlnYphVzesdBTcdOA6
# 7nIvLpz70Lu/9T0A4QYz6IIrrlOmOhZzjN1BDiA6wLSnoemyT5AuMmDpV8u5BJJo
# aOU4JmB1sp93/5EU764gSfytQBVI0QIxYRleuJfvrXe3ZJp6v1/BE++bYvsNbOBU
# aRapA9pu6YOTcXbGaYWCFwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
# AQH/BAUwAwEB/zAdBgNVHQ4EFgQUj/BLf6guRSSuTVD6Y5qL3uLdG7wwDQYJKoZI
# hvcNAQELBQADggEBAEtA28BQqv7IDO/3llRFSbuWAAlBrLMThoYoBzPKa+Z0uboA
# La6kCtP18fEPir9zZ0qDx0R7eOCvbmxvAymOMzlFw47kuVdsqvwSluxTxi3kJGy5
# lGP73FNoZ1Y+g7jPNSHDyWj+ztrCU6rMkIrp8F1GjJXdelgoGi8d3s0AN0GP7URt
# 11Mol37zZwQeFdeKlrTT3kwnpEwbc3N29BeZwh96DuMtCK0KHCz/PKtVDg+Rfjbr
# w1dJvuEuLXxgi8NBURMjnc73MmuUAaiZ5ywzHzo7JdKGQM47LIZ4yWEvFLru21Vv
# 34TuBQlNvSjYcs7TYlBlHuuSl4Mx2bO1ykdYP18wggO3MIICn6ADAgECAhAM5+Dl
# F9hG/o/lYPwb8DA5MA0GCSqGSIb3DQEBBQUAMGUxCzAJBgNVBAYTAlVTMRUwEwYD
# VQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAi
# BgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0wNjExMTAwMDAw
# MDBaFw0zMTExMTAwMDAwMDBaMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdp
# Q2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0Rp
# Z2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
# ADCCAQoCggEBAK0OFc7kQ4BcsYfzt2D5cRKlrtwmlIiq9M71IDkoWGAM+IDaqRWV
# MmE8tbEohIqK3J8KDIMXeo+QrIrneVNcMYQq9g+YMjZ2zN7dPKii72r7IfJSYd+f
# INcf4rHZ/hhk0hJbX/lYGDW8R82hNvlrf9SwOD7BG8OMM9nYLxj+KA+zp4PWw25E
# wGE1lhb+WZyLdm3X8aJLDSv/C3LanmDQjpA1xnhVhyChz+VtCshJfDGYM2wi6YfQ
# MlqiuhOCEe05F52ZOnKh5vqk2dUXMXWuhX0irj8BRob2KHnIsdrkVxfEfhwOsLSS
# plazvbKX7aqn8LfFqD+VFtD/oZbrCF8Yd08CAwEAAaNjMGEwDgYDVR0PAQH/BAQD
# AgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEXroq/0ksuCMS1Ri6enIZ3z
# bcgPMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEB
# BQUAA4IBAQCiDrzf4u3w43JzemSUv/dyZtgy5EJ1Yq6H6/LV2d5Ws5/MzhQouQ2X
# YFwSTFjk0z2DSUVYlzVpGqhH6lbGeasS2GeBhN9/CTyU5rgmLCC9PbMoifdf/yLi
# l4Qf6WXvh+DfwWdJs13rsgkq6ybteL59PyvztyY1bV+JAbZJW58BBZurPSXBzLZ/
# wvFvhsb6ZGjrgS2U60K3+owe3WLxvlBnt2y98/Efaww2BxZ/N3ypW2168RJGYIPX
# JwS+S86XvsNnKmgR34DnDDNmvxMNFG7zfx9jEB76jRslbWyPpbdhAbHSoyahEHGd
# reLD+cOZUbcrBwjOLuZQsqf6CkUvovDyMIIFMDCCBBigAwIBAgIQBAkYG1/Vu2Z1
# U0O1b5VQCDANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM
# RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQD
# ExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMTMxMDIyMTIwMDAwWhcN
# MjgxMDIyMTIwMDAwWjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg
# SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2Vy
# dCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B
# AQEFAAOCAQ8AMIIBCgKCAQEA+NOzHH8OEa9ndwfTCzFJGc/Q+0WZsTrbRPV/5aid
# 2zLXcep2nQUut4/6kkPApfmJ1DcZ17aq8JyGpdglrA55KDp+6dFn08b7KSfH03sj
# lOSRI5aQd4L5oYQjZhJUM1B0sSgmuyRpwsJS8hRniolF1C2ho+mILCCVrhxKhwjf
# DPXiTWAYvqrEsq5wMWYzcT6scKKrzn/pfMuSoeU7MRzP6vIK5Fe7SrXpdOYr/mzL
# fnQ5Ng2Q7+S1TqSp6moKq4TzrGdOtcT3jNEgJSPrCGQ+UpbB8g8S9MWOD8Gi6CxR
# 93O8vYWxYoNzQYIH5DiLanMg0A9kczyen6Yzqf0Z3yWT0QIDAQABo4IBzTCCAckw
# EgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYI
# KwYBBQUHAwMweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz
# cC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2lj
# ZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgw
# OqA4oDaGNGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJ
# RFJvb3RDQS5jcmwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdp
# Q2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwTwYDVR0gBEgwRjA4BgpghkgBhv1sAAIE
# MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYI
# YIZIAYb9bAMwHQYDVR0OBBYEFFrEuXsqCqOl6nEDwGD5LfZldQ5YMB8GA1UdIwQY
# MBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEBCwUAA4IBAQA+7A1a
# JLPzItEVyCx8JSl2qB1dHC06GsTvMGHXfgtg/cM9D8Svi/3vKt8gVTew4fbRknUP
# UbRupY5a4l4kgU4QpO4/cY5jDhNLrddfRHnzNhQGivecRk5c/5CxGwcOkRX7uq+1
# UcKNJK4kxscnKqEpKBo6cSgCPC6Ro8AlEeKcFEehemhor5unXCBc2XGxDI+7qPjF
# Emifz0DLQESlE/DmZAwlCEIysjaKJAL+L3J+HNdJRZboWR3p+nRka7LrZkPas7CM
# 1ekN3fYBIM6ZMWM9CBoYs4GbT8aTEAb8B4H6i9r5gkn3Ym6hU/oSlBiFLpKR6mhs
# RDKyZqHnGKSaZFHvMIIFRzCCBC+gAwIBAgINAfJAQkDO/SLb6Wxx/DANBgkqhkiG
# 9w0BAQwFADBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
# A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xOTAyMjAw
# MDAwMDBaFw0yOTAzMTgxMDAwMDBaMEwxIDAeBgNVBAsTF0dsb2JhbFNpZ24gUm9v
# dCBDQSAtIFI2MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxT
# aWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlQfoc8pm+ewUyns8
# 9w0I8bRFCyyCtEjG61s8roO4QZIzFKRvf+kqzMawiGvFtonRxrL/FM5RFCHsSt0b
# WsbWh+5NOhUG7WRmC5KAykTec5RO86eJf094YwjIElBtQmYvTbl5KE1SGooagLcZ
# gQ5+xIq8ZEwhHENo1z08isWyZtWQmrcxBsW+4m0yBqYe+bnrqqO4v76CY1DQ8BiJ
# 3+QPefXqoh8q0nAue+e8k7ttU+JIfIwQBzj/ZrJ3YX7g6ow8qrSk9vOVShIHbf2M
# sonP0KBhd8hYdLDUIzr3XTrKotudCd5dRC2Q8YHNV5L6frxQBGM032uTGL5rNrI5
# 5KwkNrfw77YcE1eTtt6y+OKFt3OiuDWqRfLgnTahb1SK8XJWbi6IxVFCRBWU7qPF
# OJabTk5aC0fzBjZJdzC8cTflpuwhCHX85mEWP3fV2ZGXhAps1AJNdMAU7f05+4Py
# XhShBLAL6f7uj+FuC7IIs2FmCWqxBjplllnA8DX9ydoojRoRh3CBCqiadR2eOoYF
# AJ7bgNYl+dwFnidZTHY5W+r5paHYgw/R/98wEfmFzzNI9cptZBQselhP00sIScWV
# ZBpjDnk99bOMylitnEJFeW4OhxlcVLFltr+Mm9wT6Q1vuC7cZ27JixG1hBSKABlw
# g3mRl5HUGie/Nx4yB9gUYzwoTK8CAwEAAaOCASYwggEiMA4GA1UdDwEB/wQEAwIB
# BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdT
# oDAfBgNVHSMEGDAWgBSP8Et/qC5FJK5NUPpjmove4t0bvDA+BggrBgEFBQcBAQQy
# MDAwLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3NwMi5nbG9iYWxzaWduLmNvbS9yb290
# cjMwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9y
# b290LXIzLmNybDBHBgNVHSAEQDA+MDwGBFUdIAAwNDAyBggrBgEFBQcCARYmaHR0
# cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wDQYJKoZIhvcNAQEM
# BQADggEBAEmsXsWD81rLYSpNl0oVKZ/kFJCqCfnEep81GIoKMxVtcociTkE/bQqe
# GK7b4l/8ldEsmBQ7jsHwNll5842Bz3T2GKTk4WjP739lWULpylU5vNPFJu5xOPrX
# IQMPt07ZW2BqQ7R9CdBgYd2q7QBeTjIe4LJsnjyywruY05B2ammtGtyoidpYT9LC
# izJKzlT7OOk7Bwt1ChHbC3wlJ/GsJs8RU+bcxuJhNTL0zt2D4xk668Joo3IAyCQ8
# TrhTPLEXq+Y1LPnTQinmX2ADrEJhprFXajNC3zUxhso+NyvaxNok9U4S8ra5t0fq
# uyCtYRa3oDPjLYmnvLM8AX8jGoAJNOkwggYVMIIE/aADAgECAhAFRTa04g6mPPeC
# iV1MUKqsMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxE
# aWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMT
# KERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EwHhcNMTkw
# NzIyMDAwMDAwWhcNMjIwNzEzMTIwMDAwWjBSMQswCQYDVQQGEwJBVTERMA8GA1UE
# CBMIVmljdG9yaWExEjAQBgNVBAcTCU1lbGJvdXJuZTENMAsGA1UEChMETk5ldDEN
# MAsGA1UEAxMETk5ldDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANK1
# /Hj/BqB63rqE3dowq0x7apSIKaKaC6QyjdTcElpJKbmcociClLRF36Svz6CSCd6O
# YfBFC6HCQjeWcBgC+dJ9bbEa4nOTBgS6U2p1QzJiBsjueZtctZiqZCf6K1N8ZzDV
# NU/mDzHU6Ekrd33cP8pMB/fafDAffkVu9ImT8UW7sYkH8m35S5cZ/dNHXEUCaa6S
# jNksmOjZOuHV1aDbBnilw+6ebZkd6bZABalQlZiXnt5vSmUwkpxTMAEULy3pcLLK
# gumJ/Y+gj6ER3NcdcaXs0AHNthNe9GhRPtskNbcNDqENcvDkyTwKmiplrStAKszi
# I/sSw4vdvtuqsDKBu1WVXtjoJdJF09AJ7dnv1cWXTdpoXU6b3KZKVE9e5j1JeN3F
# tgE5SgOulIAKMB4or+krtw4yL0qbrMHbvWn/Q3ZIIG+Bj4vHpJ2XghXXSjvskrRz
# jHKYgW3nGYaTth/HRI0HJbuOXgHLuKJ3qDsyRZElG7Amfq4mFEnIkJ2yLooImJqz
# T6zaD6DgDSEHBiEs53Wn2cNCTytmJxSIUkjUkmiP+QaaOI2hnlkmi6XbsEjt3ajV
# QYS5FM6Di8P9LQ2WuB6CiiXUXqyrimoG0xWQubx8iEUp0pGtS534nOrok2eKxPRm
# 4IZQo5GWNsJgMsfjHq0iuJzxFu45DKP+fQAL9kPtAgMBAAGjggHFMIIBwTAfBgNV
# HSMEGDAWgBRaxLl7KgqjpepxA8Bg+S32ZXUOWDAdBgNVHQ4EFgQUFSv0DHHkjRjR
# JwaFIc02WgvWhFUwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMD
# MHcGA1UdHwRwMG4wNaAzoDGGL2h0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9zaGEy
# LWFzc3VyZWQtY3MtZzEuY3JsMDWgM6Axhi9odHRwOi8vY3JsNC5kaWdpY2VydC5j
# b20vc2hhMi1hc3N1cmVkLWNzLWcxLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG/WwD
# ATAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAgG
# BmeBDAEEATCBhAYIKwYBBQUHAQEEeDB2MCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz
# cC5kaWdpY2VydC5jb20wTgYIKwYBBQUHMAKGQmh0dHA6Ly9jYWNlcnRzLmRpZ2lj
# ZXJ0LmNvbS9EaWdpQ2VydFNIQTJBc3N1cmVkSURDb2RlU2lnbmluZ0NBLmNydDAM
# BgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQDdAL691XRUPt1IwCuENKw6
# n1sfTD7AAEzD6zhprUrV6JWPFzJ4z/YgZp2LPYZDnh4m16/UI2O9pNMhykG3mg1I
# CJ45hTGZvRY+cM8aTV/ioG3lADJQ2Z9H624SKfLf+q/dT2Cq6Nv/9syj2PGx0POn
# uLHgz4c2VGVTbc3DdhSHRpikjisSl9JPUjpFjqlT/UTWfgLoMvv/D4p17EOZarT4
# ykAgE47zJbWJS0cj3O1lnShDO7Xk+H/cv982frwWc2akrROov2deZ1uw/BcJ6AnC
# yX+gZkACtetd0SmjQgOCUi/gVZUSIkWhSxJmj5wEV0IdJjKJLrafac5YtKXWlDuM
# MIIGWTCCBEGgAwIBAgINAewckkDe/S5AXXxHdDANBgkqhkiG9w0BAQwFADBMMSAw
# HgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFs
# U2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xODA2MjAwMDAwMDBaFw0zNDEy
# MTAwMDAwMDBaMFsxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52
# LXNhMTEwLwYDVQQDEyhHbG9iYWxTaWduIFRpbWVzdGFtcGluZyBDQSAtIFNIQTM4
# NCAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA8ALiMCP64Bvh
# mnSzr3WDX6lHUsdhOmN8OSN5bXT8MeR0EhmW+s4nYluuB4on7lejxDXtszTHrMMM
# 64BmbdEoSsEsu7lw8nKujPeZWl12rr9EqHxBJI6PusVP/zZBq6ct/XhOQ4j+kxkX
# 2e4xz7yKO25qxIjw7pf23PMYoEuZHA6HpybhiMmg5ZninvScTD9dW+y279Jlz0UL
# VD2xVFMHi5luuFSZiqgxkjvyen38DljfgWrhsGweZYIq1CHHlP5CljvxC7F/f0aY
# Doc9emXr0VapLr37WD21hfpTmU1bdO1yS6INgjcZDNCr6lrB7w/Vmbk/9E818ZwP
# 0zcTUtklNO2W7/hn6gi+j0l6/5Cx1PcpFdf5DV3Wh0MedMRwKLSAe70qm7uE4Q6s
# bw25tfZtVv6KHQk+JA5nJsf8sg2glLCylMx75mf+pliy1NhBEsFV/W6RxbuxTAhL
# ntRCBm8bGNU26mSuzv31BebiZtAOBSGssREGIxnk+wU0ROoIrp1JZxGLguWtWoan
# Zv0zAwHemSX5cW7pnF0CTGA8zwKPAf1y7pLxpxLeQhJN7Kkm5XcCrA5XDAnRYZ4m
# iPzIsk3bZPBFn7rBP1Sj2HYClWxqjcoiXPYMBOMp+kuwHNM3dITZHWarNHOPHn18
# XpbWPRmwl+qMUJFtr1eGfhA3HWsaFN8CAwEAAaOCASkwggElMA4GA1UdDwEB/wQE
# AwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTqFsZp5+PLV0U5M6Tw
# QL7Qw71lljAfBgNVHSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDA+BggrBgEF
# BQcBAQQyMDAwLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3NwMi5nbG9iYWxzaWduLmNv
# bS9yb290cjYwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9iYWxzaWdu
# LmNvbS9yb290LXI2LmNybDBHBgNVHSAEQDA+MDwGBFUdIAAwNDAyBggrBgEFBQcC
# ARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wDQYJKoZI
# hvcNAQEMBQADggIBAH/iiNlXZytCX4GnCQu6xLsoGFbWTL/bGwdwxvsLCa0AOmAz
# HznGFmsZQEklCB7km/fWpA2PHpbyhqIX3kG/T+G8q83uwCOMxoX+SxUk+RhE7B/C
# pKzQss/swlZlHb1/9t6CyLefYdO1RkiYlwJnehaVSttixtCzAsw0SEVV3ezpSp9e
# FO1yEHF2cNIPlvPqN1eUkRiv3I2ZOBlYwqmhfqJuFSbqtPl/KufnSGRpL9KaoXL2
# 9yRLdFp9coY1swJXH4uc/LusTN763lNMg/0SsbZJVU91naxvSsguarnKiMMSME6y
# CHOfXqHWmc7pfUuWLMwWaxjN5Fk3hgks4kXWss1ugnWl2o0et1sviC49ffHykTAF
# nM57fKDFrK9RBvARxx0wxVFWYOh8lT0i49UKJFMnl4D6SIknLHniPOWbHuOqhIKJ
# PsBK9SH+YhDtHTD89szqSCd8i3VCf2vL86VrlR8EWDQKie2CUOTRe6jJ5r5IqitV
# 2Y23JSAOG1Gg1GOqg+pscmFKyfpDxMZXxZ22PLCLsLkcMe+97xTYFEBsIB3CLegL
# xo1tjLZx7VIh/j72n585Gq6s0i96ILH0rKod4i0UnfqWah3GPMrz2Ry/U02kR1l8
# lcRDQfkl4iwQfoH5DZSnffK1CfXYYHJAUJUg1ENEvvqglecgWbZ4xqRqqiKbMIIG
# ZTCCBE2gAwIBAgIQAYTTqM43getX9P2He4OusjANBgkqhkiG9w0BAQsFADBbMQsw
# CQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTExMC8GA1UEAxMo
# R2xvYmFsU2lnbiBUaW1lc3RhbXBpbmcgQ0EgLSBTSEEzODQgLSBHNDAeFw0yMTA1
# MjcxMDAwMTZaFw0zMjA2MjgxMDAwMTVaMGMxCzAJBgNVBAYTAkJFMRkwFwYDVQQK
# DBBHbG9iYWxTaWduIG52LXNhMTkwNwYDVQQDDDBHbG9iYWxzaWduIFRTQSBmb3Ig
# TVMgQXV0aGVudGljb2RlIEFkdmFuY2VkIC0gRzQwggGiMA0GCSqGSIb3DQEBAQUA
# A4IBjwAwggGKAoIBgQDiopu2Sfs0SCgjB4b9UhNNusuqNeL5QBwbe2nFmCrMyVzv
# J8bsuCVlwz8dROfe4QjvBBcAlZcM/dtdg7SI66COm0+DuvnfXhhUagIODuZU8Dek
# HpxnMQW1N3F8en7YgWUz5JrqsDE3x2a0o7oFJ+puUoJY2YJWJI3567MU+2QAoXsq
# H3qeqGOR5tjRIsY/0p04P6+VaVsnv+hAJJnHH9l7kgUCfSjGPDn3es33ZSagN68y
# BXeXauEQG5iFLISt5SWGfHOezYiNSyp6nQ9Zeb3y2jZ+Zqwu+LuIl8ltefKz1NXM
# GvRPi0WVdvKHlYCOKHm6/cVwr7waFAKQfCZbEYtd9brkEQLFgRxmaEveaM6dDIhh
# qraUI53gpDxGXQRR2z9ZC+fsvtLZEypH70sSEm7INc/uFjK20F+FuE/yfNgJKxJe
# wMLvEzFwNnPc1ldU01dgnhwQlfDmqi8Qiht+yc2PzlBLHCWowBdkURULjM/XyV1K
# bEl0rlrxagZ1Pok3O5ECAwEAAaOCAZswggGXMA4GA1UdDwEB/wQEAwIHgDAWBgNV
# HSUBAf8EDDAKBggrBgEFBQcDCDAdBgNVHQ4EFgQUda8nP7jbmuxvHO7DamT2v4Q1
# sM4wTAYDVR0gBEUwQzBBBgkrBgEEAaAyAR4wNDAyBggrBgEFBQcCARYmaHR0cHM6
# Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCQYDVR0TBAIwADCBkAYI
# KwYBBQUHAQEEgYMwgYAwOQYIKwYBBQUHMAGGLWh0dHA6Ly9vY3NwLmdsb2JhbHNp
# Z24uY29tL2NhL2dzdHNhY2FzaGEzODRnNDBDBggrBgEFBQcwAoY3aHR0cDovL3Nl
# Y3VyZS5nbG9iYWxzaWduLmNvbS9jYWNlcnQvZ3N0c2FjYXNoYTM4NGc0LmNydDAf
# BgNVHSMEGDAWgBTqFsZp5+PLV0U5M6TwQL7Qw71lljBBBgNVHR8EOjA4MDagNKAy
# hjBodHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL2NhL2dzdHNhY2FzaGEzODRnNC5j
# cmwwDQYJKoZIhvcNAQELBQADggIBADiTt301iTTqGtaqes6NhNvhNLd0pf/YXZQ2
# JY/SgH6hZbGbzzVRXdugS273IUAu7E9vFkByHHUbMAAXOY/IL6RxziQzJpDV5P85
# uWHvC8o58y1ejaD/TuFWZB/UnHYEpERcPWKFcC/5TqT3hlbbekkmQy0Fm+LDibc6
# oS0nJxjGQ4vcQ6G2ci0/2cY0igLTYjkp8H0o0KnDZIpGbbNDHHSL3bmmCyF7Eacf
# XaLbjOBV02n6d9FdFLmW7JFFGxtsfkJAJKTtQMZl+kGPSDGc47izF1eCecrMHsLQ
# T08FDg1512ndlaFxXYqe51rCT6gGDwiJe9tYyCV9/2i8KKJwnLsMtVPojgaxsoKB
# hxKpXndMk6sY+ERXWBHL9pMVSTG3U1Ah2tX8YH/dMMWsUUQLZ6X61nc0rRIfKPuI
# 2lGbRJredw7uMhJgVgyRnViPvJlX8r7NucNzJBnad6bk7PHeb+C8hB1vw/Hb4dVC
# UYZREkImPtPqE/QonK1NereiuhRqP0BVWE6MZRyz9nXWf64PhIAvvoh4XCcfRxfC
# PeRpnsuunu8CaIg3EMJsJorIjGWQU02uXdq4RhDUkAqK//QoQIHgUsjyAWRIGIR4
# aiL6ypyqDh3FjnLDNiIZ6/iUH7/CxQFW6aaA6gEdEzUH4rl0FP2aOJ4D0kn2TOuh
# vRwU0uOZMYIGdDCCBnACAQEwgYYwcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERp
# Z2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMo
# RGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQQIQBUU2tOIO
# pjz3goldTFCqrDANBglghkgBZQMEAgEFAKBMMBkGCSqGSIb3DQEJAzEMBgorBgEE
# AYI3AgEEMC8GCSqGSIb3DQEJBDEiBCCiVdpNtrqvZupZVwpILkYG02LzwDMVziQT
# MZ3uSkyrJzANBgkqhkiG9w0BAQEFAASCAgA3GNw1XmiSJdhRqAVZsXM2Rztb/we9
# HKivh4JJ6N6NfVKhax+oYNXYbTnTMn3UwRXAXwJEVB6pPbzYeI5ZA2UWrP5CH1lb
# n40t733dU7+xPOvEdXrg50uCohXADhSisIin0Vj25wmua3ubtd+YHPe0sNoKLPHA
# xaiptSRKykuwogS/JFH1JTtlmwDyLRXNLSnG4SNwyC5Wf8puvN3NeFu1uzHYINd3
# H4B1Eaqps4wdsJW0azUnYK+IBuVw6OaxdilLc5Z50UqsRkm9H4qXsjILRx0t4naB
# y04+cNTMMydQRG69QMfuDCtYGi6NQ7W/077bVR+JtmetSTuW2d3cVzvy7v8H0jWt
# HPMdLNNC1PwDXx3tmaPnqv8/vCwSlz5wzJuggUrloCl5rS47PomP/DZAveWLGt/A
# G2YSTbYDButJfTzhRe3rTtYD8KJPjLkCVhQcYcxe/AJDMx88Wo8Iojj37Nx5L8DS
# hdurFgr6W2wh8CeXml1rQvXoJo9h9blVfgfJ0msYqkWsqhXfidPnDOeFVX3dDKA9
# B7DS6lx+DoPRVR4S9EcEOcSQIsaDyZU8bfpPg6KAVASclYFJrVrFsQy7kXQ9D8p8
# nJwUSEnwzor6kYA7RKYOhREg0po7b2cXOE9apH0Ysd/tll0Aacbp/mpiZxtR/M5w
# 1w0hIfEYR0L2N6GCA3AwggNsBgkqhkiG9w0BCQYxggNdMIIDWQIBATBvMFsxCzAJ
# BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTEwLwYDVQQDEyhH
# bG9iYWxTaWduIFRpbWVzdGFtcGluZyBDQSAtIFNIQTM4NCAtIEc0AhABhNOozjeB
# 61f0/Yd7g66yMA0GCWCGSAFlAwQCAQUAoIIBPzAYBgkqhkiG9w0BCQMxCwYJKoZI
# hvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yMjAxMTkwMjA0MTNaMC0GCSqGSIb3DQEJ
# NDEgMB4wDQYJYIZIAWUDBAIBBQChDQYJKoZIhvcNAQELBQAwLwYJKoZIhvcNAQkE
# MSIEIJmcAdQnCKv7j3HjpDSVSmQJrPNDKhOCZOrkg1LUwi6gMIGkBgsqhkiG9w0B
# CRACDDGBlDCBkTCBjjCBiwQU3Ve1s4c8hhspxq7Ecxr76I11wUkwczBfpF0wWzEL
# MAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExMTAvBgNVBAMT
# KEdsb2JhbFNpZ24gVGltZXN0YW1waW5nIENBIC0gU0hBMzg0IC0gRzQCEAGE06jO
# N4HrV/T9h3uDrrIwDQYJKoZIhvcNAQELBQAEggGAWscAx8Asp0k/OIZe9aSMVEpP
# rrwDVV54QmVnF/wtcNhNdhLOk0FdgHgUMPB40yi8Ct+ZWUpQ73MTlQMcidxv7HYQ
# WVGIZS84n/KKqPDL07iEhxZ/SUUMrBNtdgRKo1pgsdGyKAu+DxYp5p3j4PAoShXv
# BGpwsHtypLykL3WoZ0gax1/p2Wnt8DX8QVSXtdGoNhh6mvwhISf0PAIbPSps3ikY
# keHdi4p0IDhw4P2s9yh9/RqAIgPpprXrU2/yZKhLyjGMWHtBM/ujgr/QhSwJyUBG
# R/KUV20Tn1YJkkNSnNHQYB5PNN2xFbZrno7xlTrfHunElyTRX/kxYBMwtE8IGP6H
# AxprFh4wlXB/xFfW9N9jwRDfwCKcJ+Uv3ueLTsIXUXFaHAsgcYxM2ikbbGqYpIW+
# OR5aZF/QxcHD8UCcMTXhlSiuCq3Q1Q105TZcxep0ykPOUxpDTiqcUQhevHj1lumo
# A5ZpApo5UtyBuInMKXCU3t1oWpV62S/otRR/+0bY
# SIG # End signature block
@shivakirankonduru
Copy link

Does this work when key length is 3072 bits?

@Nillth
Copy link
Author

Nillth commented Jan 19, 2022

if it is a RSA Key, yes it does

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment