Skip to content

Commit 2e1f5cd

Browse files
Kishi85moepman
authored andcommitted
acertmgr/v2: Handle CA certificate chains properly
1 parent ce157a5 commit 2e1f5cd

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

acertmgr/authority/v2.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,8 +260,8 @@ def get_crt_from_csr(self, csr, domains, challenge_handlers):
260260
if code >= 400:
261261
raise ValueError("Error downloading certificate chain: {0} {1}".format(code, certificate))
262262

263-
cert_dict = re.match((r'(?P<cert>-----BEGIN CERTIFICATE-----[^\-]+-----END CERTIFICATE-----)\n\n'
264-
r'(?P<ca>-----BEGIN CERTIFICATE-----[^\-]+-----END CERTIFICATE-----)?'),
263+
cert_dict = re.match((r'(?P<cert>^-----BEGIN CERTIFICATE-----\n[^\-]+\n-----END CERTIFICATE-----)\n*'
264+
r'(?P<ca>-----BEGIN CERTIFICATE-----\n.+\n-----END CERTIFICATE-----)?$'),
265265
certificate, re.DOTALL).groupdict()
266266
cert = tools.convert_pem_str_to_cert(cert_dict['cert'])
267267
if cert_dict['ca'] is None:

acertmgr/tools.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import datetime
1111
import io
1212
import os
13+
import re
1314
import stat
1415
import sys
1516
import traceback
@@ -257,15 +258,26 @@ def get_cert_valid_until(cert):
257258

258259

259260
# @brief convert certificate to PEM format
260-
# @param cert certificate object in pyopenssl format
261+
# @param cert certificate object or a list thereof
261262
# @return the certificate in PEM format
262263
def convert_cert_to_pem_str(cert):
263-
return cert.public_bytes(serialization.Encoding.PEM).decode('utf8')
264+
if not isinstance(cert, list):
265+
cert = [cert]
266+
result = list()
267+
for data in cert:
268+
result.append(data.public_bytes(serialization.Encoding.PEM).decode('utf8'))
269+
return '\n'.join(result)
264270

265271

266272
# @brief load a PEM certificate from str
273+
# @return a certificate object or a list of objects if multiple are in the string
267274
def convert_pem_str_to_cert(certdata):
268-
return x509.load_pem_x509_certificate(certdata.encode('utf8'), default_backend())
275+
certs = re.findall(r'(-----BEGIN CERTIFICATE-----\n[^\-]+\n-----END CERTIFICATE-----)',
276+
certdata, re.DOTALL)
277+
result = list()
278+
for data in certs:
279+
result.append(x509.load_pem_x509_certificate(data.encode('utf8'), default_backend()))
280+
return result[0] if len(result) == 1 else result
269281

270282

271283
# @brief serialize cert/csr to DER bytes
@@ -411,6 +423,9 @@ def is_ocsp_valid(cert, issuer, hash_algo):
411423
log("Invalid hash algorithm '{}' used for OCSP validation. Validation ignored.".format(hash_algo), warning=True)
412424
return True
413425

426+
if isinstance(issuer, list):
427+
issuer = issuer[0] # First certificate in the CA chain is the immediate issuer
428+
414429
try:
415430
ocsp_urls = []
416431
aia = cert.extensions.get_extension_for_oid(ExtensionOID.AUTHORITY_INFORMATION_ACCESS)

0 commit comments

Comments
 (0)