Skip to content

Commit

Permalink
fix: certificate path construction (#135)
Browse files Browse the repository at this point in the history
Feat:
- implemented certificate path construction without using built-in
library due to #117

Fix:
- imported PFX certificate chain with leaf to root order doesn't work

Resolves #136 
Signed-off-by: Junjie Gao <[email protected]>

---------

Signed-off-by: Junjie Gao <[email protected]>
  • Loading branch information
JeyJeyGao authored Sep 5, 2023
1 parent 585ce0c commit ae2c91c
Show file tree
Hide file tree
Showing 28 changed files with 1,363 additions and 30 deletions.
Original file line number Diff line number Diff line change
@@ -1,25 +1,65 @@
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using Notation.Plugin.Protocol;
using Xunit;

namespace Notation.Plugin.AzureKeyVault.Certificate.Tests
{
public class CertificateChainTests
{
[Fact]
public void Build_WithValidLeafAndCertificateBundle_BuildsCertificateChain()
public void Build_Empty()
{
// Arrange
X509Certificate2 leafCert = new X509Certificate2(Path.Combine(Directory.GetCurrentDirectory(), "TestData", "leaf.crt"));
X509Certificate2Collection certificateBundle = CertificateBundle.Create(Path.Combine(Directory.GetCurrentDirectory(), "TestData", "root.crt"));
X509Certificate2Collection certs = new X509Certificate2Collection();

// Act
List<byte[]> certificateChain = CertificateChain.Build(leafCert, certificateBundle);
Assert.Throws<PluginException>(() => CertificateChain.Build(certs));
}

[Theory]
[InlineData("leaf.pem", "leaf.pem", false)] // 1: non-self-signed leaf cert
[InlineData("self_signed_leaf.pem", "self_signed_leaf.pem", true)] // 1: self-signed leaf cert
[InlineData("2self_signed_leaf.pem", "2self_signed_leaf.pem", false)] // 2: duplicated self-signed leaf cert
[InlineData("leaf_unknown.pem", "leaf_unknown.pem", false)] // 2: leaf + unknown cert
[InlineData("leaf_root.pem", "leaf_root.pem", true)] // 2: leaf + root certs
[InlineData("root_leaf.pem", "leaf_root.pem", true)] // 2: unordered root + leaf certs
[InlineData("leaf_root_without_inter.pem", "leaf_root_without_inter.pem", false)] // 3: leaf + root certs without intermediate cert
[InlineData("2root_leaf.pem", "2root_leaf.pem", false)] // 3: duplicated root + leaf certs
[InlineData("DN_loop.pem", "DN_loop.pem", false)] // 3: DN naming loop
[InlineData("root1_leaf_root2.pem", "root1_leaf_root2.pem", false)] // 3: root1 + root2 + leaf certs
[InlineData("root_leaf1_leaf2.pem", "root_leaf1_leaf2.pem", false)] // 3: root + leaf1 + leaf2 certs
[InlineData("leaf_root_unknown.pem", "leaf_root_unknown.pem", false)] // 3: leaf + root + unknown certs
[InlineData("leaf_inter.pem", "leaf_inter.pem", false)] // 2: leaf + intermediate certs
[InlineData("leaf_inter_root.pem", "leaf_inter_root.pem", true)] // 3: leaf + inter + root certs
[InlineData("inter_root_leaf.pem", "leaf_inter_root.pem", true)] // 3: unordered inter + root + leaf certs
[InlineData("leaf_inter_root_otherinter.pem", "leaf_inter_root_otherinter.pem", false)] // 3: leaf + inter + root + other intermediate cert certs
[InlineData("leaf_inter_root_unknown.pem", "leaf_inter_root_unknown.pem", false)] // 4: leaf + inter + root + unknown certs
[InlineData("leaf_inter2_inter1_unknown.pem", "leaf_inter2_inter1_unknown.pem", false)] // 4: leaf + inter2 + inter1 + unknown certs
[InlineData("leaf_inter2_inter1_root.pem", "leaf_inter2_inter1_root.pem", true)] // 4: leaf + inter2 + inter1 + root certs
[InlineData("inter2_inter1_root_leaf.pem", "leaf_inter2_inter1_root.pem", true)] // 4: inter2 + inter1 + root + leaf certs
[InlineData("leaf_inter_root_leaf2_root2.pem", "leaf_inter_root_leaf2_root2.pem", false)] // 5: leaf + inter + root cert chain + leaf2 + root2 cert chain
public void Build(string certName, string targetChainName, bool isValid)
{
// Arrange
X509Certificate2Collection certBundle = CertificateBundle.Create(Path.Combine(Directory.GetCurrentDirectory(), "TestData", "chain", certName));
X509Certificate2Collection targetChain = CertificateBundle.Create(Path.Combine(Directory.GetCurrentDirectory(), "TestData", "chain", targetChainName));

// Act
if (isValid)
{
var certificateChain = CertificateChain.Build(certBundle);

// Assert
Assert.NotNull(certificateChain);
Assert.True(certificateChain.Count > 0);
// Assert
for (int i = 0; i < certificateChain.Count; i++)
{
Assert.Equal(targetChain[i].Thumbprint, certificateChain[i].Thumbprint);
}
}
else
{
Assert.Throws<PluginException>(() => CertificateChain.Build(certBundle));
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
<Content Include="TestData\*.crt" CopyToOutputDirectory="PreserveNewest" />
<Content Include="TestData\*.pem" CopyToOutputDirectory="PreserveNewest" />
<Content Include="TestData\*.pfx" CopyToOutputDirectory="PreserveNewest" />
<Content Include="TestData\chain\*.pem" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

<ItemGroup>
Expand Down
58 changes: 58 additions & 0 deletions Notation.Plugin.AzureKeyVault.Tests/TestData/chain/2root_leaf.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
-----BEGIN CERTIFICATE-----
MIIDFzCCAf+gAwIBAgIUcXSzPd52oq3cTzlLBJOoO7fiprkwDQYJKoZIhvcNAQEL
BQAwEjEQMA4GA1UEAwwHVGVzdCBDQTAgFw0yMzA1MDQwNzAwNTVaGA8yMTIzMDQx
MDA3MDA1NVowEjEQMA4GA1UEAwwHVGVzdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAJoVdivOR5V/Qot+h8rwuHxYF4T0uWFF3XrIqJ3BIw7Ts8Ev
6EyIzc2oHlGOv5aM3IcW4Adn5bZgT0kPSi4ZAyxUVHG9o2TeeGIN6q8skrzP7316
hnB92shXYCgqXwo3KP5uKhbNPRTQ7OVwhGQqLaVrJXLw9rddAnLLG9AtkiuCCi+b
U7ytPeq+vsP04BX1EKMuuErOt+TJLjJ7caYN6sobjmWEIrLcB31rPNuHBGJXXLYP
LXIJ/IcnDRIeq8M28QEOiEKpIb+OR6nojnkJG2zk14RCzrM+TrudPsE9PGUojYOL
qD5iKvexVLkum2zbYEOorl6q9BK+IL88m3Yr6j0CAwEAAaNjMGEwHQYDVR0OBBYE
FFGaS7VNB8EdOojqlqqIpHjS6FggMB8GA1UdIwQYMBaAFFGaS7VNB8EdOojqlqqI
pHjS6FggMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMA0GCSqGSIb3
DQEBCwUAA4IBAQCKJsj78P6r6+NFDHfrKC730JDUeThokcYKVqSLOKm1Sc0gEAx2
wM88fZay2LRTisynt0qFxwUFcrPqlXJeob7bI+aJRGBEqyY/zDkycpEaOyHJFpiN
elrfpQ1bVjTgOpUqmG21URMenxCApbbrBiCeNmeHcIsL/MGLAU2UL1rhjG6NrZLE
IK/qRDNmDdntvn8SOHBg9nsc4u7OkNryKCTfqGwkB2TCNWB40DM6akPSRb5dVh/P
viqpIeyPYMHw+yvs74s6/xTim9/Jy9MROScurGxFb9Vrby7gjd+41WuGf1hUBQ7S
F/83FanddfSmtN/tyCz65FhyVyQJPT9oZATK
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDFzCCAf+gAwIBAgIUcXSzPd52oq3cTzlLBJOoO7fiprkwDQYJKoZIhvcNAQEL
BQAwEjEQMA4GA1UEAwwHVGVzdCBDQTAgFw0yMzA1MDQwNzAwNTVaGA8yMTIzMDQx
MDA3MDA1NVowEjEQMA4GA1UEAwwHVGVzdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAJoVdivOR5V/Qot+h8rwuHxYF4T0uWFF3XrIqJ3BIw7Ts8Ev
6EyIzc2oHlGOv5aM3IcW4Adn5bZgT0kPSi4ZAyxUVHG9o2TeeGIN6q8skrzP7316
hnB92shXYCgqXwo3KP5uKhbNPRTQ7OVwhGQqLaVrJXLw9rddAnLLG9AtkiuCCi+b
U7ytPeq+vsP04BX1EKMuuErOt+TJLjJ7caYN6sobjmWEIrLcB31rPNuHBGJXXLYP
LXIJ/IcnDRIeq8M28QEOiEKpIb+OR6nojnkJG2zk14RCzrM+TrudPsE9PGUojYOL
qD5iKvexVLkum2zbYEOorl6q9BK+IL88m3Yr6j0CAwEAAaNjMGEwHQYDVR0OBBYE
FFGaS7VNB8EdOojqlqqIpHjS6FggMB8GA1UdIwQYMBaAFFGaS7VNB8EdOojqlqqI
pHjS6FggMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMA0GCSqGSIb3
DQEBCwUAA4IBAQCKJsj78P6r6+NFDHfrKC730JDUeThokcYKVqSLOKm1Sc0gEAx2
wM88fZay2LRTisynt0qFxwUFcrPqlXJeob7bI+aJRGBEqyY/zDkycpEaOyHJFpiN
elrfpQ1bVjTgOpUqmG21URMenxCApbbrBiCeNmeHcIsL/MGLAU2UL1rhjG6NrZLE
IK/qRDNmDdntvn8SOHBg9nsc4u7OkNryKCTfqGwkB2TCNWB40DM6akPSRb5dVh/P
viqpIeyPYMHw+yvs74s6/xTim9/Jy9MROScurGxFb9Vrby7gjd+41WuGf1hUBQ7S
F/83FanddfSmtN/tyCz65FhyVyQJPT9oZATK
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDOTCCAiGgAwIBAgIBAjANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdUZXN0
IENBMCAXDTIzMDUwNDA3MDIwNloYDzIxMjMwNDEwMDcwMjA2WjBDMREwDwYDVQQK
Ewhub3RhdGlvbjELMAkGA1UECBMCV0ExCzAJBgNVBAYTAlVTMRQwEgYDVQQDEwtU
ZXN0LVNpZ25lcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOZenQqj
cimpyADt540GvlXsAwYqAyFpXmJDVsWImNMvHt+kaWabK1C5HJjTlXqGE9wIg1oY
YG20pqbFKpPwULTBA7AkZvQipvMbkrqp9fJQUDi32HBLM4yIp1rYWciHIlKnv/Rk
tSbtNxg6ES50xLJl/V0YFwgxT9JayVYk6D5BEEgXffpZsMUtuGbRe0QsHED09jaX
onCvSV+sIpn0zAF4ahcWRseoTtfLAUfk5cJpFqwYvf3eIfvjWx7fvltpcEjfBDTj
8TxPXNlst9lgn3X5z2dr2dbltXOgNzX/NfLh7MbAe3uM0AE5fkrQ4CoIm/9tFuhT
nEv28Mk3WJQquX0CAwEAAaNnMGUwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoG
CCsGAQUFBwMDMB0GA1UdDgQWBBTyceghcpaJ6QYyDNhHjIq2UkWmYzAfBgNVHSME
GDAWgBRRmku1TQfBHTqI6paqiKR40uhYIDANBgkqhkiG9w0BAQsFAAOCAQEAlzNY
LsYcV3hk22ZDFzGj8mZg6TjhHaejMgfOEm88UAUSjeHLaathV38sYHfqTwPwHjtf
lGGoSqzhiWasQ4Le4wRPraD/kFhRMRiUJ3YmW9EwwpXRDc7YexypbqVIKr/48gb3
oMtUMYEarYlAOfWfMaMPHvXBlAIOq1oGLtuZ12doNJ3NqyqPoyLXNyjwYETnq+I/
6qZQ4R1prdOwCdBuay6vn4lSrD45WxdjdWTDpAbYoT6voje+nHtH21EIxo1iWMpD
jzwp93CVbVxQnVf+dvSthHrUDPah+WPQ8yu4qhITxOrrAggCzBee3sK6WknERShf
aIZK0TY5G9C8rxUIhg==
-----END CERTIFICATE-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
-----BEGIN CERTIFICATE-----
MIIDRzCCAi+gAwIBAgIUNXnCwLi1z10bqyxXvXa8tZrKW6kwDQYJKoZIhvcNAQEL
BQAwKjEPMA0GA1UECgwGUmF0aWZ5MRcwFQYDVQQDDA5SYXRpZnkgUm9vdCBDQTAg
Fw0yMzA5MDExMDUwMzZaGA8yMTIzMDgwODEwNTAzNlowKjEPMA0GA1UECgwGUmF0
aWZ5MRcwFQYDVQQDDA5SYXRpZnkgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAKgG13pRD+ZN1OaHwRDGd5aMCYFocr7stN7hCBoqD2qDit2n
a46IkQsBdEp+EoslFDzG627exL0h57OTp4T3bREAnNPgpzQcSHfiheerW5/iIP2m
NFswfc4bwlhWBzlKcWXChzp7WX40H1DdjipktFyFgWhTwU7HJBW8smPO5NYGs2Yk
68BIvS5RHhdlAFu88KvEbOrrfBptT1DBAL4CIS36TMQznZbu6FxAAXDfYKbE/4SL
mpHUsAoOZVPer0sWOVEe7YVp1RZMwVzNnLPsb8gjlKxJwpYjeC0d6Il4b5hVgppy
lu+rkxXc+ZYUccnWBy9yxHPsU65KdAxRo9YwbecCAwEAAaNjMGEwHQYDVR0OBBYE
FJSoL6jK75sG1UbURor0xcxhjTX6MB8GA1UdIwQYMBaAFJSoL6jK75sG1UbURor0
xcxhjTX6MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMA0GCSqGSIb3
DQEBCwUAA4IBAQB9oc5382B22ltr856jXxtHJVMDJ0JoZ5jZSFSfvJCked7gpW5p
SA5OSL++0HLa9naM7wAETFw3lMERJ8zDvl9cVi9NFXdvk6aIiPYDnhbviM6pr3d9
NzvumM1tNtZG8OP5hVNUHvZEvijInBRLaJQKvSunZwosoMcIL27RFMicteOnNBy6
My81rbZDRNhnEU/FX4fnyMH3+Eyv2eMEj9cHPOS7aANq3Y8sNveaW85e+4GPwfU7
XuWqDGLusupgY2yulrBPqJp7JpgkIPhY/wkZ8ttBymdxmTGGdFH0hDqhy1TF6Ujd
9JbDe0j+cgU9C70fY+tCH6qBkDqYD/OUUOtt
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDRzCCAi+gAwIBAgIUNXnCwLi1z10bqyxXvXa8tZrKW6kwDQYJKoZIhvcNAQEL
BQAwKjEPMA0GA1UECgwGUmF0aWZ5MRcwFQYDVQQDDA5SYXRpZnkgUm9vdCBDQTAg
Fw0yMzA5MDExMDUwMzZaGA8yMTIzMDgwODEwNTAzNlowKjEPMA0GA1UECgwGUmF0
aWZ5MRcwFQYDVQQDDA5SYXRpZnkgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAKgG13pRD+ZN1OaHwRDGd5aMCYFocr7stN7hCBoqD2qDit2n
a46IkQsBdEp+EoslFDzG627exL0h57OTp4T3bREAnNPgpzQcSHfiheerW5/iIP2m
NFswfc4bwlhWBzlKcWXChzp7WX40H1DdjipktFyFgWhTwU7HJBW8smPO5NYGs2Yk
68BIvS5RHhdlAFu88KvEbOrrfBptT1DBAL4CIS36TMQznZbu6FxAAXDfYKbE/4SL
mpHUsAoOZVPer0sWOVEe7YVp1RZMwVzNnLPsb8gjlKxJwpYjeC0d6Il4b5hVgppy
lu+rkxXc+ZYUccnWBy9yxHPsU65KdAxRo9YwbecCAwEAAaNjMGEwHQYDVR0OBBYE
FJSoL6jK75sG1UbURor0xcxhjTX6MB8GA1UdIwQYMBaAFJSoL6jK75sG1UbURor0
xcxhjTX6MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMA0GCSqGSIb3
DQEBCwUAA4IBAQB9oc5382B22ltr856jXxtHJVMDJ0JoZ5jZSFSfvJCked7gpW5p
SA5OSL++0HLa9naM7wAETFw3lMERJ8zDvl9cVi9NFXdvk6aIiPYDnhbviM6pr3d9
NzvumM1tNtZG8OP5hVNUHvZEvijInBRLaJQKvSunZwosoMcIL27RFMicteOnNBy6
My81rbZDRNhnEU/FX4fnyMH3+Eyv2eMEj9cHPOS7aANq3Y8sNveaW85e+4GPwfU7
XuWqDGLusupgY2yulrBPqJp7JpgkIPhY/wkZ8ttBymdxmTGGdFH0hDqhy1TF6Ujd
9JbDe0j+cgU9C70fY+tCH6qBkDqYD/OUUOtt
-----END CERTIFICATE-----
57 changes: 57 additions & 0 deletions Notation.Plugin.AzureKeyVault.Tests/TestData/chain/DN_loop.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
-----BEGIN CERTIFICATE-----
MIIDITCCAgmgAwIBAgIUPK45Qm7RR4wZoQjscXpVXKut7M4wDQYJKoZIhvcNAQEL
BQAwGDEWMBQGA1UEAwwNcmF0aWZ5LmludGVyMTAeFw0yMzA5MDQxNDEyMjNaFw0y
MzEwMDQxNDEyMjNaMBgxFjAUBgNVBAMMDXJhdGlmeS5pbnRlcjIwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDeIlcvhTD/aXBKPuP0Cx9v4bFjJMmT88Qq
Ua3z1IGn7QLXprwoOHJzHm36xwEnb64UnfZHBkpddiiFllcPMaKo+QLQ3lvO8AX6
P5tgQyyfnkDJ9Et8jFMMal4JygOl8HX6RrqiQakU0P7tnwoE8ghvLBncfDfwHS3H
vevZFdDi51KJIt2ZOnnoA+oOqVWtUx2H9CRHeEF2OaVMnQemo+9sDDtFrFALPdVZ
coWWHJdA6g7xgb+OLtydQg1cJJdAlUiWwAV6CxlgS3lGZAfZV6enU2/fJNIszEcA
jZnTxbaao6aY/UF5kZ6BPbNGyuDBA57qDrStpzovJPct5e2nAL3jAgMBAAGjYzBh
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMB0GA1UdDgQWBBTYyOol
YvPBcOz4gzyEpvjjrt7trDAfBgNVHSMEGDAWgBRc6cYN2Kng0oWFBKgTVePd8dBU
UzANBgkqhkiG9w0BAQsFAAOCAQEAYLMHCP3QNE4HBf35y/k9kEeBvyFBh7IFC4P0
jyyhmwTiX9YRD5jiV/n2dYSXXuMDuJd52oq/drgUD3dINJ0ZCYlhkEN+5oNbqsTl
ISOjeBCjIPLyCCQAUOF4WlZqaUu/Q42deHpAok73mdcNIFK0XRwkFF8dAGQ8hcU1
gYsJbm1SuUcUqBvqomzQAHyGyAboOmFZiS4ePFqJMkt5L47Vhw2AZY+xn0GgAous
laaA+TpptKvO0hNV8kYoJ084KYyMU7bsKsrA3nbkAnSvTfx5a8fD+5eLf0fQZb4j
L9j6ijZ8oi+W0KDgPfFhtDMMPHqSmqh0mZ9HGR3VewQUR+F1Og==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDITCCAgmgAwIBAgIUI1tC37NFchWmsNpzPrEVhA4SSHMwDQYJKoZIhvcNAQEL
BQAwGDEWMBQGA1UEAwwNcmF0aWZ5LmludGVyMjAeFw0yMzA5MDQxNDIyNTNaFw0y
MzEwMDQxNDIyNTNaMBgxFjAUBgNVBAMMDXJhdGlmeS5pbnRlcjEwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYhjxclbLrIrTUHXgVh86V3IFsurejjG6F
2O3h0GofQAy7V11AUr8egJXfBMYGJ5nECwMpjFsgG2PPFtxDZfvg2709pXAQ6zQL
DpW2c1xAHxBAf7Hfgsy1lLQtMRWDuKQIgp4V13CHxK0mS3QuqTZlNdygbnI4SNvb
C61oY+hUJbgBdBHuxRnGC5OY2+tqCO3bPFlHQ7jn5hSb/0h+3x1g1hqEtBkrd2ub
AdgDMsTCqxkKOH4ococxLxerIJEq/4/vSPoX+cqarldEEL1pTOyLJtJHn7mVJ3Xa
btTriUkUR+jNtbSCjQKOju8I8ZJq4GMzXqaIJ+3XYU9gAazuXdwJAgMBAAGjYzBh
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMB0GA1UdDgQWBBSR3Hpr
qkqxfJ6kqYw2qly8t/1CZzAfBgNVHSMEGDAWgBRWBu/fCpHWdX6wVEDrgWDhU1Kv
2DANBgkqhkiG9w0BAQsFAAOCAQEAgN+sLwG87Ko1qykJIDnOTcVDHvqOU01klTgo
GAD/k+KrNinOnQ8z0kMFHXmWYeGs2sWYn+0XHYgufr9//0Zo3bthXS1t9XB6qzyM
hOiVVMcJWcjQBzJtyZANk7cGF9rrVcvjzd0vxECwaehcaP8b//HonCqoOwjnN8Oq
4rZe0H1e110nnamva8mS/6kcwZp/nukIATp2L1A2gniysboRPdnSTMeVwj1XEj3I
XZanrQ6UQLsM9YFwBCpyUVYuCk0FDH7+q9Eg+xT1NBloiZ1wbuFYOUIukbqtpc9D
/0HZyZHdILZc7jAwKK3GhqmKGyRaCPKSbnrSRUjSwYNdsWWcUQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDITCCAgmgAwIBAgIUIsazvzFvmJkutImL9Idp6CCmfsEwDQYJKoZIhvcNAQEL
BQAwGDEWMBQGA1UEAwwNcmF0aWZ5LmludGVyMjAgFw0yMzA5MDQxNDIyNTRaGA8y
MTIzMDgxMTE0MjI1NFowGTEXMBUGA1UEAwwOcmF0aWZ5LmRlZmF1bHQwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsQdWar/Cr32J0nDglXP04PLm8jiEC
U5gYui0hsX+Rs8z7CNvmruBC1Lftg/AJQgcgWQNi2EIbVA6APb4N3n/IeaREV0MW
naAcz4Tv+YZAHwaBw96aynAOs2SbXB/xU1DcW+9LqNJhFkHLMLwPOMS1r+B7Nu2S
G/Uq87pMXvcxtkT/RoHYs9x7aEnIKDKKA20iTBwKo3UeSxPMDzUqnSilZ9LS/oxF
V5D51LjSxtz/WcnrXyE/q/mY4vtH3eF8onB4Mh2DM/MS+HXPi6wn0KVHX4/e7jZe
qfkgoL5doAAv+54Aq0lHPJ9ZKepIQZu5MWtYgIxeUmkIG7Df2iYvprFdAgMBAAGj
YDBeMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMB0GA1UdDgQWBBT5kbQ0
Y0VnA7K47Ijs6qe9dJo7ajAfBgNVHSMEGDAWgBTYyOolYvPBcOz4gzyEpvjjrt7t
rDANBgkqhkiG9w0BAQsFAAOCAQEAjxZSppgaCJG23Z7KPLuOWQr6ALTiWQ7L+fOY
8MTtmujageV+uevbNK8h/B7qXitJ68DYSSCqLp4uO1W+PGC3nKwzt4szL2y2tlqd
cLklzAYhKqWZ/e3v/7exdqogxAtyjoa6P6a7nvnNiMEvSSAb9lgz7gGXI2rs6D/c
TUuiFldxflaqxOGbG2S4k2MNCDV1FhG3vmMLN4DCd26rHxtm/onE76fVN18BdV9y
AefsGWB4337WW9m0O1n5k/Xwvi4NXfow5o3d9jbKtIqUI9U6oCw6gkqnWYbPW9wi
cqWlFtqZE0ioM8snDyV+WHz04m6xjJ/F5vhgZh2/Fb8/+yh9Wg==
-----END CERTIFICATE-----
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
-----BEGIN CERTIFICATE-----
MIIDITCCAgmgAwIBAgIUEOAI0YVqF+ekkskGAq5+dJ3LUkowDQYJKoZIhvcNAQEL
BQAwGDEWMBQGA1UEAwwNcmF0aWZ5LmludGVyMTAeFw0yMzA5MDQwNjIwMjFaFw0y
MzEwMDQwNjIwMjFaMBgxFjAUBgNVBAMMDXJhdGlmeS5pbnRlcjIwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfjb0zculL/tVGxg2hFXvDUdJ6BmPwSCq2
lJiH1SoRBFIbSXRk+MZFvk4dEK4rcIfh96UQr3EsnMEHUjHzI3oJ5PR2upS+vD+2
IlLGW/SPtZgEDkSh6c9uGU9lx/DVLO2ZZrhckMq2IxpMiTM3TocTKwzoO+ccY805
LXVKEhbqk8PyO33Jhv2JDZtC8/NfQVQdkUTRUh0cGtoRG+PeI8EA0iU4JhJ9YWoy
wzuCrsqhhkBXwGDIkbq7a2avupL7ENirItm20LN//hny1ZjwBLE0eqO2VpbXn+gE
M8Xgp6ijGh2XPrWU+YbLv5K89hQ5wi61QjUXo0DNFTgREjaNFuETAgMBAAGjYzBh
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMB0GA1UdDgQWBBRp0AmE
b91kIObTWLSZYLCWTSaO1zAfBgNVHSMEGDAWgBReRIer4BfYN1IofVtvc92eEAPE
izANBgkqhkiG9w0BAQsFAAOCAQEARdQO0CspA3reD1Ws8Bj0sMaubNsieyup+zYa
BjuTCsqGLve50kR5WRmq5ayqeBOYtB1+ksjZc7MEv4aysk+6+uJTgIToQhb/scGs
om/lJQnXWZHOohniw/4gA2Y4RfT2BBI9CO7OEjVdcHgXhweADWV72Yp6/3TOlIVP
7THycrUi8Pz0WpQJLnN0fq9PpvgG6cvhjWiIEoC4T8IJK8pIPx1CPT/WkBIE8cS3
5yIDsZbJOQ/M3yRRd7f/nmGPHAdn+fId5T2jX+Hh+isQhVas57yzZjokYIVy/dOw
QZeR2p/LsEKb+ebqOzeMNU3Ir/KUdohrxescBw8xW2JR2XXVIA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDMzCCAhugAwIBAgIUY9SnCSWXwc5Jrqj+mLKnzwASHywwDQYJKoZIhvcNAQEL
BQAwKjEPMA0GA1UECgwGUmF0aWZ5MRcwFQYDVQQDDA5SYXRpZnkgUm9vdCBDQTAe
Fw0yMzA5MDQwNjIwMjBaFw0yMzEwMDQwNjIwMjBaMBgxFjAUBgNVBAMMDXJhdGlm
eS5pbnRlcjEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzeV+1gfkx
BIVdsntcs0QOJSp2qC0W2K241EaimPcVxFmDmKweJtuX1WOHqmQHoRdYVYqlFP8r
GNc0jTxF1dizhGaC7W/I+KThyWOwa9r0JDrSSLap/piTrM0hE+OHCL7cbCI0znr3
Z+MsiXA41oTZeZd7H9U3tObgiWFaUqoaEbNTN0f20RgHC8QZrFNHxj0OphtgA7RG
xqAt5qHD35XqR5skYyKGk9lNy6B4sJ+5kCOmXKvI7wsJpEcO2rvsdGpaSpnHX/V/
pC/BaurvFnbI4mUkTdETX30+KtpIgexbqg33xvKt3BUo4waCaVmV3AK0EE7MxInm
4aWGwguG1kZ9AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
AgIEMB0GA1UdDgQWBBReRIer4BfYN1IofVtvc92eEAPEizAfBgNVHSMEGDAWgBQo
IQk1tdF2EtspOFPCremuCntvrTANBgkqhkiG9w0BAQsFAAOCAQEATUU0EZ/FPecm
jSvI7DJ2wlN0SyHuBumf0w+iXXPu5IE6x5G6zZss7dvbem1QGm6UcMDyeM6deAt+
LHPIUpqK6eRflolMbrvHU1CAHzrCOAyBof7vGJxPPYOgmMykF+e/QSNmpi2mukM1
DeG4Ao1099C/a3P2LcT5gdocGLNrcDywE2t///TeLMUvjrQ0YmOR6TzcZYYUxgAI
yGY4yNmfsk3DaacN+sB9e0IlsIGyDnOWETSLvvJ5vhiAo3CVjgjjiUVWVUwHpEJp
AXQH+fcao23DLhVFr00+lM9IzhzAVmSRRd+qK7bScuTviDeBoh1cv4wEsH+XQTdH
fFYB6pyUsg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDRzCCAi+gAwIBAgIUXUWcqeMN5dXBgjcLwUmaD1PZf3kwDQYJKoZIhvcNAQEL
BQAwKjEPMA0GA1UECgwGUmF0aWZ5MRcwFQYDVQQDDA5SYXRpZnkgUm9vdCBDQTAg
Fw0yMzA5MDQwNjIwMjBaGA8yMTIzMDgxMTA2MjAyMFowKjEPMA0GA1UECgwGUmF0
aWZ5MRcwFQYDVQQDDA5SYXRpZnkgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBALD9s+pF4us6SDnFNXwzwiRHFecSIaLfh/epdRws0jDd8ly0
v4Y000OQcqGwc3f888H3uLYJScuUlNmOfKpHhCpi5wDLMIZzxK7UfV//9R8Xon5L
QcGw0tPeyMp6IxNduLxe5wbiLjuwsPXsYluxdBCJCgsO3tMl/rvCopjrI6yxeR8K
UZK1OrsTOENDBbc9+jAQ81hVR6fY24EQ4bVaqxCH+ZbtafpQBpH6NOkCVen29JgM
DWKqBJvq0NtqdyfgiE6WV0nhNspGGqk+VMSUG2Jb55EAEQt1UU/Us77KVMs32+kr
/EIqq2JbuVRmRaAocrhZSxabg3z0qokrv+qdXZUCAwEAAaNjMGEwHQYDVR0OBBYE
FCghCTW10XYS2yk4U8Kt6a4Ke2+tMB8GA1UdIwQYMBaAFCghCTW10XYS2yk4U8Kt
6a4Ke2+tMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMA0GCSqGSIb3
DQEBCwUAA4IBAQCkgHj4OOAmp5QAMAe09qYNTiwyHgK3tYmiuc9+Brl8lcuYeRQb
nBllI9cFZ226AziVpy6rbfKNzh/WpfG0gEVMOa3NnOfJI3gqa6ajrHRSC3Yc8LDO
VaLUdUB+Tjnw/dKvPfcoGyn5UK0UHJJwBOmlpDiY57qpLG2qUROW6V56SJ+MDtVQ
XR8sQxbXTVNIOrnLiUYML8UKWwWcnbR4FK6ShZDHoLAofGJ68wguRGFLhLX2lOE3
C0FcP7R0b9cGYTeQMKSbYvb4628ltRGWsJYA8opunN/c6ydsj9+DYx1FOcH+OLon
Yy4fIsb33S0MS/lKz0HrELZevVY1Eeu7i5Yg
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDITCCAgmgAwIBAgIUcIJtSZ/A8Mswp/c8Pv3OB9CIAycwDQYJKoZIhvcNAQEL
BQAwGDEWMBQGA1UEAwwNcmF0aWZ5LmludGVyMjAgFw0yMzA5MDQwNjIwMjFaGA8y
MTIzMDgxMTA2MjAyMVowGTEXMBUGA1UEAwwOcmF0aWZ5LmRlZmF1bHQwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCY+15WH6uY+YBx/wGZfcO0m2ApcpwB
dKudpjB72IYaRbL2lxQK05U0F3n0H+oaqABx1QbUWVW/DfC5MNkbs4CQFp2TlIIc
R7D+CmbCvJ+03HKU6L7CLjLDwisyYSFJw3rW8qhvM1OTDX1Icjas8MS2ijsW4hJ/
T+pM84gCD8IrzdRrRsPSHcP/lMafzdADaeKC2GLsJ4FXXFnmzW0XiyzG9HVEjHP3
XjliDNHQDE4ePfRsmubRkl3zfFlt8Nfp/6W2/5fLGaz2v41IxzxjeKwWvZM4UQQg
OVEKe/+OHMHUfeXWXhj8UDhq8uXHVIPMO2bbtJ2TLRnPQ+gx8L8yIIylAgMBAAGj
YDBeMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMB0GA1UdDgQWBBQvZODV
Nkeng9kqb0jHYZtf+XWbHTAfBgNVHSMEGDAWgBRp0AmEb91kIObTWLSZYLCWTSaO
1zANBgkqhkiG9w0BAQsFAAOCAQEAF7w0oztrfiWPLacWVEHq54vryuT9QnHJZKON
f/jiYviSIsdnSo2/Hi8jSusmCW+Z49sfIdhUUqlSqNMDCpnmIGsyaF5pWaqUNYEC
StVJ8X1BxbybrzZg7ZOdhXW3RwGTeGEB1WikyzJoBHHrpCm3DPn/kyvCpKJ8CrG7
Pe9Xpocm+pqm2aZjyAuHiiOrz1tNx1HKl2vi/vC+0R64aSMWBzR38XhDsoes3MEs
oN2HA8g6DZXNVERqo4KGfHavh8nDYV2bhASNdLryjoSaYZe/pUJrIrIriUf52Wo7
N3aSWoinYUuAOwTYwm5MPxW+JU1PbBJ0/AVcXb6RYWSmhp1ImA==
-----END CERTIFICATE-----
Loading

0 comments on commit ae2c91c

Please sign in to comment.