Skip to content

Commit 298c0d8

Browse files
committed
Test VerifyCertificate()
1 parent d55c364 commit 298c0d8

File tree

3 files changed

+172
-0
lines changed

3 files changed

+172
-0
lines changed

test/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,10 @@ add_boost_test(base
175175
base_tlsutility/iscertuptodate_ok
176176
base_tlsutility/iscertuptodate_expiring
177177
base_tlsutility/iscertuptodate_old
178+
base_tlsutility/verifycertificate_ok
179+
base_tlsutility/verifycertificate_leafexpired
180+
base_tlsutility/verifycertificate_caexpired
181+
base_tlsutility/verifycertificate_sigmismatch
178182
base_utility/parse_version
179183
base_utility/compare_version
180184
base_utility/comparepasswords_works

test/base-tlsutility-certs.hpp

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/* Icinga 2 | (c) 2025 Icinga GmbH | GPLv2+ */
2+
3+
// openssl req -x509 -subj /CN=IcingaCA -days 1000000 -newkey rsa:2048 -keyout IcingaCA.key -out IcingaCA.crt -nodes
4+
static const auto l_IcingaCa = R"(
5+
-----BEGIN CERTIFICATE-----
6+
MIIDCTCCAfGgAwIBAgIUdgi1ZtjKYbwQLTgZK3uEesJ7bLMwDQYJKoZIhvcNAQEL
7+
BQAwEzERMA8GA1UEAwwISWNpbmdhQ0EwIBcNMjUwMTI5MTExMjI3WhgPNDc2MjEy
8+
MjcxMTEyMjdaMBMxETAPBgNVBAMMCEljaW5nYUNBMIIBIjANBgkqhkiG9w0BAQEF
9+
AAOCAQ8AMIIBCgKCAQEAx3gRHqvT78saJhmuB0IIMy6LsKASh7T/JV/MDLqPYRBM
10+
JyyuEJUWfxc7M7vQsd7VIKbalcdP7+5q1ChCyef68mwmKHMgxjVytmnlaFp06m6b
11+
bHKW4CPPbcAVJA5J6IOMjbYoJJb3B+D92MCj+cA/1TBOMRYNPumjlKn2S7zdeas7
12+
YdQcoO9IT66jp+2+olYfEm/Feef9q0tFlaDnBSD8Fi06O2S7yOv1smUvbUjO27Bp
13+
t5ISVYGAYjPTMfNw9T2YiKcmwtcXi1uwFVdlcyzCyI1uOsJKrqU8wL6vbcTbTJmk
14+
mJuk6EzvGIK5gYKys1swfPkBqTPrQ9bAwsrFMo2wNQIDAQABo1MwUTAdBgNVHQ4E
15+
FgQU6FNaouiwNt1OpoxxxBHx5zx21VEwHwYDVR0jBBgwFoAU6FNaouiwNt1Opoxx
16+
xBHx5zx21VEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAE50o
17+
aLhRrQo0OONxHgZin1azVhCwvEhDdvpREgPMx8RIIkACbpTBc1qD+5Td3/OOi7TF
18+
OanoHyOkPHyjBIlp55iHPEWBTBLBtO9Q5wyv/cg6tNt3xm8P1x0vxS+TrIKhtPzF
19+
IkiJULki4fJARuFj8f/E2kwu+EA3swwqSfAeRUzY8yChdyWyVn+s17ll5OOjjZCA
20+
q1CodrFEk0ZuH5qNTmcLk5GUdUnZEISmRiOcsG66uSzl7WpWGECtK4amRFv+XTij
21+
bRANBuRWGyaw1UpD2RnJKvbTjURbdI8/4ZcgBNk0rbaJQZhRcN59y1wbXp6OYVdE
22+
mB3zuwxqEBlWqr6J6A==
23+
-----END CERTIFICATE-----
24+
)";
25+
26+
// openssl req -x509 -subj /CN=example.com -CA IcingaCA.crt -CAkey IcingaCA.key -days 1000000 -newkey rsa:2048 -keyout example.key -out example.crt -nodes
27+
static const auto l_ExampleCrt = R"(
28+
-----BEGIN CERTIFICATE-----
29+
MIIDDDCCAfSgAwIBAgIUCBXnZvr6kQAzDUEI8y32Dfv0RZIwDQYJKoZIhvcNAQEL
30+
BQAwEzERMA8GA1UEAwwISWNpbmdhQ0EwIBcNMjUwMTI5MTExNTQwWhgPNDc2MjEy
31+
MjcxMTE1NDBaMBYxFDASBgNVBAMMC2V4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0B
32+
AQEFAAOCAQ8AMIIBCgKCAQEAqCcKAjgS5bKbyn3IC9Yj2UB7dVRlNCZTRt+w6US1
33+
OtCPyhfK+V2IWHG52FZMX3xWEbzwkli9T7BSsTWqsG7nh5luuXkJSiBGaBFDTrHh
34+
TgSEKYIrAv6RXExMmSH9wbrwlSObckVK0ao3cGAu5wOP6pQFJXhBcxfR8Bb0Tmys
35+
IK8TeCWs5dw9+uL6naqhA7PXScmglxn0wt3Jq5HQvcLP9Q47boNvNRsdsH96UKYL
36+
ParA/+VYN24G//K8SvdEauKLBWexs3deUIpvQ9XBZgi4TxhtLmGrSOD+BSRmZtbS
37+
mrJ8teYa8Wn8UqSHn0XkmcJYc4Id5iR8LWjW0K+7+5W1AQIDAQABo1MwUTAdBgNV
38+
HQ4EFgQUCMkOtURchQvy5TD26SERzcPDIBEwHwYDVR0jBBgwFoAU6FNaouiwNt1O
39+
poxxxBHx5zx21VEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEA
40+
kS9cavcMaGIVmAu3zg9yJ2RTwn5sdVjnIdFtm2GdtFYXqCuy8cltGYBZa3ksq60k
41+
2E0OuAzM2gnD2xCET+8Kv5SqhM5E/JSVsxp31siBR6Mn23scM16AGK+rThSYYjKU
42+
NiFf0nWhTGZFXQQ+QpLeVbzxgZpy/6I2ae1uDZraSXkd+sChDE9jPTpYliOm2X6A
43+
2r4VK8rtYCxvOy+mUsto37NiAVITXwnPRlKmOatv1Hh9kAhwK+qA0nyykIuef3NZ
44+
uoTqHtDPAOSLBdtCNFh7HW2EuQSU3PLZ2xket8kqURTxxaLSkbsRSG7TqrLfBjMn
45+
YFlQO4soVkFeFifh/aEQEw==
46+
-----END CERTIFICATE-----
47+
)";
48+
49+
// faketime -f -101d openssl req -x509 -subj /CN=example.com -CA IcingaCA.crt -CAkey IcingaCA.key -days 100 -newkey rsa:2048 -keyout expired.key -out expired.crt -nodes
50+
static const auto l_ExpiredCrt = R"(
51+
-----BEGIN CERTIFICATE-----
52+
MIIDCjCCAfKgAwIBAgIUTRwVekfrn1W/65HaURylmpCD5q8wDQYJKoZIhvcNAQEL
53+
BQAwEzERMA8GA1UEAwwISWNpbmdhQ0EwHhcNMjQxMDIwMTEzOTU1WhcNMjUwMTI4
54+
MTEzOTU1WjAWMRQwEgYDVQQDDAtleGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEB
55+
BQADggEPADCCAQoCggEBALJYc86mEP0k2f1YCxYjm0UMR05PBh8FHqzhj6KiBPCE
56+
rNzKUHJ3mwh4x7lNZtsQuYb2oLTbwvdPp8pBRSO1cDEPLMPl6KdmyfW/6nE4aOnd
57+
4odX+nQXpwU5+fgsdHi9H796/CETzo7zYt1ZOegHPlXNVOCAWKpuwpM4wpD2Jc/U
58+
18nOcPLc+gUyHHkFWnZG3R0RAzBM+Y6tyuTSua1Md+lZLYZbdR+TUlI+iQUVpS5L
59+
VVlfMuvF1goqEGeFd995LDe1iAsaYeb0cwylANaE8Ntw1Y58F1YUeGp2nUQwitwn
60+
cGkEtWW4aYpHmlLz0NWwi4VooBrfOE2e2vuHoTWdn4MCAwEAAaNTMFEwHQYDVR0O
61+
BBYEFPy1bdiqQ77+R9wffW8byBI7m+IWMB8GA1UdIwQYMBaAFOhTWqLosDbdTqaM
62+
ccQR8ec8dtVRMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAAYQ
63+
VWlT9HHgE6NxFwRdo6Pdyw7izzTDjQFgfWIFQN7PIXMriP3uCzoZ1lUeJShH4V8C
64+
hliQIVbdH00oVK14H0WI+8pFIFtriVuYcwop93BOKZb7dGv6yPX0tjmWM03G7ykJ
65+
o9HfIycRCUfvyY8++OO4oXiCIXbv0EefCd9GWP9IS1n0EK39L0QBbLp1pYbCJ4U3
66+
LyDa/sHEflHdTUu+do1kCC9f8gnccw6oHwg/GNC3r5/FYBFKddDMsr49xNZCUlS7
67+
CYoTlRVLcKCOxGOU7j1f2Vh0lbrCs9S8qMmyygutl5BSp8QH4XqXGAA3XcU91cc2
68+
Rs6wtqbtpehBKbNCZew=
69+
-----END CERTIFICATE-----
70+
)";
71+
72+
// faketime -f -1001d openssl req -x509 -subj /CN=IcingaCA -days 1000 -newkey rsa:2048 -keyout expiredCA.key -out expiredCA.crt -nodes
73+
static const auto l_ExpiredCa = R"(
74+
-----BEGIN CERTIFICATE-----
75+
MIIDBzCCAe+gAwIBAgIUIFiIyafR/fOJgdcPtE/2cMVzO5wwDQYJKoZIhvcNAQEL
76+
BQAwEzERMA8GA1UEAwwISWNpbmdhQ0EwHhcNMjIwNTA0MTE0NzQyWhcNMjUwMTI4
77+
MTE0NzQyWjATMREwDwYDVQQDDAhJY2luZ2FDQTCCASIwDQYJKoZIhvcNAQEBBQAD
78+
ggEPADCCAQoCggEBAMt4h56Ykpv5mImpnaTfnZBgDCwZj6+OTFIOhqE/Hcwb+rw3
79+
EXiIzOuAj/3SOKJDIJHo7BAoZJ0IFl4+/hldim3EVp4i8xjrDL3vww8fyUXJliuO
80+
Li/meuWmO2uTWaMNdXWiIvUYf1gIfBD1hIU2vznTca6NrRmTPLGGYRtV86HhM+tZ
81+
IyWF3O7VmNZBpuj/kHAUQT+RBXxP3J3rf73ICTJvVGBpQshlnxE1uFiEXPfhk2LJ
82+
AXtXmVMXDNaVsNT8kv7hUsKwtpNrmIpAM//kJZl42qEmG/dJ4JYIgU+wy54b/gEM
83+
tWcit9/4Dz7dO4dJPyd1RXRkRLJ1yoXATVuR/kECAwEAAaNTMFEwHQYDVR0OBBYE
84+
FMD7oeGGYaB8CDTzHNaqfJ4pJDW+MB8GA1UdIwQYMBaAFMD7oeGGYaB8CDTzHNaq
85+
fJ4pJDW+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAER61Zzv
86+
Cta8soW4pac9tX3MpTqHvGer/H8gxpRc3hAMBYBdHH9iToRv2e1B8XAr1aD9nDTZ
87+
kpSxrQ6QcIvcNaopZ+4BpgQA0OcnpiJvy1NrzJy4/OXsCwhss4TCi3iGrRFeRscj
88+
1bNRqF6uQUSpGO3Pyr9NRI7uKCxLx0GebjI3m7I1XtdbhO+pCGJxIX7BBgBCyg2S
89+
Rg3NO6D62M2CIXMzmNkUOuEPP8X04gHJG8lenTj/4XA2FRtl3BDkmpgNT+EvXgrE
90+
iKN5RJmanof6Cl3i+5z2G9EE78IKKc1lwIMGEl3TBwBc9vbLGXnyxhQ1KYmdYdMk
91+
qk/B5CUJdl6x4SU=
92+
-----END CERTIFICATE-----
93+
)";
94+
95+
// faketime -f -1001d openssl req -x509 -subj /CN=example.com -CA expiredCA.crt -CAkey expiredCA.key -days 1000000 -newkey rsa:2048 -keyout expiredCAleaf.key -out expiredCAleaf.crt -nodes
96+
static const auto l_ExpiredCaLeaf = R"(
97+
-----BEGIN CERTIFICATE-----
98+
MIIDDDCCAfSgAwIBAgIUdHDoIg27fMxCE8+8qVKG6bkbgAAwDQYJKoZIhvcNAQEL
99+
BQAwEzERMA8GA1UEAwwISWNpbmdhQ0EwIBcNMjIwNTA0MTE1MTEyWhgPNDc2MDAz
100+
MzExMTUxMTJaMBYxFDASBgNVBAMMC2V4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0B
101+
AQEFAAOCAQ8AMIIBCgKCAQEAv0Fy1zM4r6cs/L4ijHNijQBS0bZPdw+oJQ6wuHS2
102+
wWvSu3rEd42SkwPHb6l5xnazpNiJ6e/QsgjNAe/O2fe2FdShvAQpTEEZDWG5YUHQ
103+
CUULHiLIL3WE7+QbE/L+qv0eeTHsGRvdqlyJfSF6dNpCpfAI+/cwvaQ9+ISGnlyo
104+
xQsvW2oirPJL2Op9UGhA4GuUbjA63W8wZTVnb7WGXpBpUx8igwrEO8cmAgNqDf8a
105+
QuOBcwncbHRiLn+OOFbQ09+PfyqIWsY+HEdSarKsfTcKCH3bdbX1mB3FuPBlioVk
106+
jzo28QvRXrsRVmLdO1Z8KwtDO1J3K+lIlD8ciSIyfkAmeQIDAQABo1MwUTAdBgNV
107+
HQ4EFgQUGM6M1c/X4oIQW6iulEu4v8pgANgwHwYDVR0jBBgwFoAUwPuh4YZhoHwI
108+
NPMc1qp8nikkNb4wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEA
109+
wuCTz+iBNm/0K4No1nNDg+CZ6Efh2aGYdd0ra568Q0qaUZvJBkDwHaV62x8c+7oy
110+
g09CSVb5cxjukNak/1z0sArtxOSSPvQr8ZxAbIlBsJLHlUt5qxIDpFar/AUvejPW
111+
SRwXfXoqZvxhvotIVDpC7LyzLv1uGEVC2ut/mdKSRdfC8bjNgvDPueix2IiLuqwD
112+
axtsq0DNuLCml/rFaDpv9GhjEd2BHtd9WkkBE0aZkr7riCVVU+G4333V1lhepmM4
113+
OEDL0q8bF+us7OOBcnKTf8/Z2FBSChX+iBmUx49bYbu+zsB7rd8bRctQ2QsBWrjE
114+
0T27ijYgvlDxVhZkvgGjKg==
115+
-----END CERTIFICATE-----
116+
)";
117+
118+
// openssl req -x509 -subj /CN=IcingaCA -days 1000000 -newkey rsa:2048 -keyout IcingaCA2.key -out IcingaCA2.crt -nodes
119+
static const auto l_IcingaCa2 = R"(
120+
-----BEGIN CERTIFICATE-----
121+
MIIDCTCCAfGgAwIBAgIUOpzxwnBk0qyMmc4kEQM27KXhkNEwDQYJKoZIhvcNAQEL
122+
BQAwEzERMA8GA1UEAwwISWNpbmdhQ0EwIBcNMjUwMTI5MTExMjI5WhgPNDc2MjEy
123+
MjcxMTEyMjlaMBMxETAPBgNVBAMMCEljaW5nYUNBMIIBIjANBgkqhkiG9w0BAQEF
124+
AAOCAQ8AMIIBCgKCAQEAwOn0l2/lU3LG8U6vZLhpQp/3FJL3oKtEeH+sRvnPF2cU
125+
PaUWhpS5oHTJyLlVyTDc8kzr4kteyI5vsB9y9hC9yCKoo/gfo/+qrBrmuB8lDoeQ
126+
LEtpPAD3K09HiTJbHqTxgKj+krRlKj29yyrieR9MYB/gpm73J1qVByLdsImfORQ0
127+
ycllxmr/mcDcpgVzanKaTTo0HXVb9BxuvwWo0eMz8IAqEcoqxcYdBOlRtWE8CINE
128+
rAHCFWnHSBiqQvysBMbdMI0B/n7GWm/KVLGu2jIDMsz8PbiQJ9sbBUAL0FTcXQAf
129+
InxcEAmwSEhnA7qFyJO7XjQG35IJvHWIklDXmneWmwIDAQABo1MwUTAdBgNVHQ4E
130+
FgQU5ZPq54i662pKEJuVpatrx2spEfYwHwYDVR0jBBgwFoAU5ZPq54i662pKEJuV
131+
patrx2spEfYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAS4cj
132+
EucqjyxP+Sisj61Q2fVy+pLvQkqC/fOXTo3KuJX/asWsmxdIrVRyRKfnXxNwdNO5
133+
v6dcEHO0fDU9GmVAYa1JKiKDByjWElh175KqETl4ZSVXod/AX1k1lyYlKaEs2S2T
134+
uzJ5O57IO9AMzDR8IQDTztApkp7si2A3f+ihHLdsZfwnf+4ectTixgxVCy6+3x0t
135+
po7veItIw2L8YRbiVGzpzUe20A/qVxjp7ZswQr6ZI7Zqvs10Na+jK7+xlLf875lk
136+
CTbr/uo8qBLDUf3dXPTWJww4uMiJUvQOasbYg8wXkw9OS2uktjHOjwgLWMoxt5u3
137+
JYdh7REN+0OfpIqdSA==
138+
-----END CERTIFICATE-----
139+
)";

test/base-tlsutility.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* Icinga 2 | (c) 2021 Icinga GmbH | GPLv2+ */
22

33
#include "base/tlsutility.hpp"
4+
#include "base-tlsutility-certs.hpp"
45
#include <BoostTestTargetConfig.h>
56
#include <functional>
67
#include <memory>
@@ -132,4 +133,32 @@ BOOST_AUTO_TEST_CASE(iscertuptodate_old)
132133
})));
133134
}
134135

136+
BOOST_AUTO_TEST_CASE(verifycertificate_ok)
137+
{
138+
BOOST_CHECK(VerifyCertificate(
139+
StringToCertificate(l_IcingaCa), StringToCertificate(l_ExampleCrt), String()
140+
));
141+
}
142+
143+
BOOST_AUTO_TEST_CASE(verifycertificate_leafexpired)
144+
{
145+
BOOST_CHECK_THROW(VerifyCertificate(
146+
StringToCertificate(l_IcingaCa), StringToCertificate(l_ExpiredCrt), String()
147+
), openssl_error);
148+
}
149+
150+
BOOST_AUTO_TEST_CASE(verifycertificate_caexpired)
151+
{
152+
BOOST_CHECK_THROW(VerifyCertificate(
153+
StringToCertificate(l_ExpiredCa), StringToCertificate(l_ExpiredCaLeaf), String()
154+
), openssl_error);
155+
}
156+
157+
BOOST_AUTO_TEST_CASE(verifycertificate_sigmismatch)
158+
{
159+
BOOST_CHECK_THROW(VerifyCertificate(
160+
StringToCertificate(l_IcingaCa2), StringToCertificate(l_ExampleCrt), String()
161+
), openssl_error);
162+
}
163+
135164
BOOST_AUTO_TEST_SUITE_END()

0 commit comments

Comments
 (0)