Compare commits

...

6 Commits

Author SHA1 Message Date
Erica Portnoy
bd5df38394 coverage 2018-02-16 15:44:35 -08:00
Erica Portnoy
40cbfe1a0d lint 2018-02-16 15:25:33 -08:00
Erica Portnoy
02363f3fc8 move certbot.crypto_util._get_names_from_loaded_cert_or_req functionality to acme.crypto_util._pyopenssl_cert_or_req_all_names 2018-02-16 15:21:28 -08:00
Erica Portnoy
e096952b2f switch new_order to use crypto_util._pyopenssl_cert_or_req_san 2018-02-16 15:17:45 -08:00
Erica Portnoy
9f6d096e9d Revert "beautiful way that doesn't work"
This reverts commit b70a07dd1e.
2018-02-16 15:13:12 -08:00
Erica Portnoy
b70a07dd1e beautiful way that doesn't work 2018-02-16 15:11:46 -08:00
5 changed files with 38 additions and 13 deletions

View File

@@ -1,7 +1,6 @@
"""ACME client API."""
import base64
import collections
import cryptography
import datetime
from email.utils import parsedate_tz
import heapq
@@ -17,6 +16,7 @@ import re
import requests
import sys
from acme import crypto_util
from acme import errors
from acme import jws
from acme import messages
@@ -568,11 +568,9 @@ class ClientV2(ClientBase):
:returns: The newly created order.
:rtype: OrderResource
"""
csr = cryptography.x509.load_pem_x509_csr(csr_pem,
cryptography.hazmat.backends.default_backend())
san_extension = next(ext for ext in csr.extensions
if ext.oid == cryptography.x509.oid.ExtensionOID.SUBJECT_ALTERNATIVE_NAME)
dnsNames = san_extension.value.get_values_for_type(cryptography.x509.DNSName)
csr = OpenSSL.crypto.load_certificate_request(OpenSSL.crypto.FILETYPE_PEM, csr_pem)
# pylint: disable=protected-access
dnsNames = crypto_util._pyopenssl_cert_or_req_all_names(csr)
identifiers = []
for name in dnsNames:

View File

@@ -186,6 +186,15 @@ def make_csr(private_key_pem, domains, must_staple=False):
return OpenSSL.crypto.dump_certificate_request(
OpenSSL.crypto.FILETYPE_PEM, csr)
def _pyopenssl_cert_or_req_all_names(loaded_cert_or_req):
common_name = loaded_cert_or_req.get_subject().CN
sans = _pyopenssl_cert_or_req_san(loaded_cert_or_req)
if common_name is None:
return sans
else:
return [common_name] + [d for d in sans if d != common_name]
def _pyopenssl_cert_or_req_san(cert_or_req):
"""Get Subject Alternative Names from certificate or CSR using pyOpenSSL.

View File

@@ -65,6 +65,30 @@ class SSLSocketAndProbeSNITest(unittest.TestCase):
# self.assertRaises(errors.Error, self._probe, b'bar')
class PyOpenSSLCertOrReqAllNamesTest(unittest.TestCase):
"""Test for acme.crypto_util._pyopenssl_cert_or_req_all_names."""
@classmethod
def _call(cls, loader, name):
# pylint: disable=protected-access
from acme.crypto_util import _pyopenssl_cert_or_req_all_names
return _pyopenssl_cert_or_req_all_names(loader(name))
def _call_cert(self, name):
return self._call(test_util.load_cert, name)
def test_cert_one_san_no_common(self):
self.assertEqual(self._call_cert('cert-nocn.der'),
['no-common-name.badssl.com'])
def test_cert_no_sans_yes_common(self):
self.assertEqual(self._call_cert('cert.pem'), ['example.com'])
def test_cert_two_sans_yes_common(self):
self.assertEqual(self._call_cert('cert-san.pem'),
['example.com', 'www.example.com'])
class PyOpenSSLCertOrReqSANTest(unittest.TestCase):
"""Test for acme.crypto_util._pyopenssl_cert_or_req_san."""

BIN
acme/acme/testdata/cert-nocn.der vendored Normal file

Binary file not shown.

View File

@@ -340,14 +340,8 @@ def _get_names_from_cert_or_req(cert_or_req, load_func, typ):
def _get_names_from_loaded_cert_or_req(loaded_cert_or_req):
common_name = loaded_cert_or_req.get_subject().CN
# pylint: disable=protected-access
sans = acme_crypto_util._pyopenssl_cert_or_req_san(loaded_cert_or_req)
if common_name is None:
return sans
else:
return [common_name] + [d for d in sans if d != common_name]
return acme_crypto_util._pyopenssl_cert_or_req_all_names(loaded_cert_or_req)
def get_names_from_cert(csr, typ=OpenSSL.crypto.FILETYPE_PEM):