Last active
August 1, 2024 15:13
-
-
Save Nillth/032e7ae397fb886c37f380c9047b2f75 to your computer and use it in GitHub Desktop.
PowerShell function to Convert PEM files to X509 (PFX) Certificate
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# | |
.NOTES | |
=========================================================================== | |
Created by: Marc Collins ([email protected]) | |
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Does this work when key length is 3072 bits?