| # test wildcard certifcates |
| import os |
| |
| import pytest |
| |
| from .md_conf import MDConf, MDConf |
| from .md_env import MDTestEnv |
| |
| |
| @pytest.mark.skipif(condition=not MDTestEnv.has_acme_server(), |
| reason="no ACME test server configured") |
| class TestWildcard: |
| |
| @pytest.fixture(autouse=True, scope='class') |
| def _class_scope(self, env, acme): |
| env.APACHE_CONF_SRC = "data/test_auto" |
| acme.start(config='default') |
| env.check_acme() |
| env.clear_store() |
| MDConf(env).install() |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' |
| |
| @pytest.fixture(autouse=True, scope='function') |
| def _method_scope(self, env, request): |
| env.clear_store() |
| self.test_domain = env.get_request_domain(request) |
| |
| # test case: a wildcard certificate with ACMEv2, no dns-01 supported |
| def test_md_720_001(self, env): |
| domain = self.test_domain |
| |
| # generate config with DNS wildcard |
| domains = [domain, "*." + domain] |
| conf = MDConf(env) |
| conf.add_md(domains) |
| conf.add_vhost(domains) |
| conf.install() |
| |
| # restart, check that md is in store |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' |
| env.check_md(domains) |
| # await drive completion |
| md = env.await_error(domain) |
| assert md |
| assert md['renewal']['errors'] > 0 |
| assert md['renewal']['last']['problem'] == 'challenge-mismatch' |
| # |
| env.httpd_error_log.ignore_recent( |
| lognos = [ |
| "AH10056" # None of offered challenge types |
| ], |
| matches = [ |
| r'.*problem\[challenge-mismatch\].*' |
| ] |
| ) |
| |
| # test case: a wildcard certificate with ACMEv2, only dns-01 configured, invalid command path |
| def test_md_720_002(self, env): |
| dns01cmd = os.path.join(env.test_dir, "../modules/md/dns01-not-found.py") |
| |
| domain = self.test_domain |
| domains = [domain, "*." + domain] |
| |
| conf = MDConf(env) |
| conf.add("MDCAChallenges dns-01") |
| conf.add(f"MDChallengeDns01 {dns01cmd}") |
| conf.add_md(domains) |
| conf.add_vhost(domains) |
| conf.install() |
| |
| # restart, check that md is in store |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' |
| env.check_md(domains) |
| # await drive completion |
| md = env.await_error(domain) |
| assert md |
| assert md['renewal']['errors'] > 0 |
| assert md['renewal']['last']['problem'] == 'challenge-setup-failure' |
| # |
| env.httpd_error_log.ignore_recent( |
| lognos = [ |
| "AH10056" # None of offered challenge types |
| ], |
| matches = [ |
| r'.*problem\[challenge-setup-failure\].*', |
| r'.*setup command failed to execute.*' |
| ] |
| ) |
| |
| # variation, invalid cmd path, other challenges still get certificate for non-wildcard |
| def test_md_720_002b(self, env): |
| dns01cmd = os.path.join(env.test_dir, "../modules/md/dns01-not-found.py") |
| domain = self.test_domain |
| domains = [domain, "xxx." + domain] |
| |
| conf = MDConf(env) |
| conf.add(f"MDChallengeDns01 {dns01cmd}") |
| conf.add_md(domains) |
| conf.add_vhost(domains) |
| conf.install() |
| |
| # restart, check that md is in store |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' |
| env.check_md(domains) |
| # await drive completion |
| assert env.await_completion([domain]) |
| env.check_md_complete(domain) |
| # check: SSL is running OK |
| cert_a = env.get_cert(domain) |
| altnames = cert_a.get_san_list() |
| for domain in domains: |
| assert domain in altnames |
| |
| # test case: a wildcard certificate with ACMEv2, only dns-01 configured, invalid command option |
| def test_md_720_003(self, env): |
| dns01cmd = os.path.join(env.test_dir, "../modules/md/dns01.py fail") |
| domain = self.test_domain |
| domains = [domain, "*." + domain] |
| |
| conf = MDConf(env) |
| conf.add("MDCAChallenges dns-01") |
| conf.add(f"MDChallengeDns01 {dns01cmd}") |
| conf.add_md(domains) |
| conf.add_vhost(domains) |
| conf.install() |
| |
| # restart, check that md is in store |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' |
| env.check_md(domains) |
| # await drive completion |
| md = env.await_error(domain) |
| assert md |
| assert md['renewal']['errors'] > 0 |
| assert md['renewal']['last']['problem'] == 'challenge-setup-failure' |
| # |
| env.httpd_error_log.ignore_recent( |
| lognos = [ |
| "AH10056" # None of offered challenge types |
| ], |
| matches = [ |
| r'.*problem\[challenge-setup-failure\].*' |
| ] |
| ) |
| |
| # test case: a wildcard name certificate with ACMEv2, only dns-01 configured |
| def test_md_720_004(self, env): |
| dns01cmd = os.path.join(env.test_dir, "../modules/md/dns01.py") |
| domain = self.test_domain |
| domains = [domain, "*." + domain] |
| |
| conf = MDConf(env) |
| conf.add("MDCAChallenges dns-01") |
| conf.add(f"MDChallengeDns01 {dns01cmd}") |
| conf.add_md(domains) |
| conf.add_vhost(domains) |
| conf.install() |
| |
| # restart, check that md is in store |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' |
| env.check_md(domains) |
| # await drive completion |
| assert env.await_completion([domain]) |
| env.check_md_complete(domain) |
| # check: SSL is running OK |
| cert_a = env.get_cert(domain) |
| altnames = cert_a.get_san_list() |
| for domain in domains: |
| assert domain in altnames |
| |
| # test case: a wildcard name and 2nd normal vhost, not overlapping |
| def test_md_720_005(self, env): |
| dns01cmd = os.path.join(env.test_dir, "../modules/md/dns01.py") |
| domain = self.test_domain |
| domain2 = "www.x" + domain |
| domains = [domain, "*." + domain, domain2] |
| |
| conf = MDConf(env) |
| conf.add("MDCAChallenges dns-01") |
| conf.add(f"MDChallengeDns01 {dns01cmd}") |
| conf.add_md(domains) |
| conf.add_vhost(domain2) |
| conf.add_vhost(domains) |
| conf.install() |
| |
| # restart, check that md is in store |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' |
| env.check_md(domains) |
| # await drive completion |
| assert env.await_completion([domain]) |
| env.check_md_complete(domain) |
| # check: SSL is running OK |
| cert_a = env.get_cert(domain) |
| altnames = cert_a.get_san_list() |
| for domain in domains: |
| assert domain in altnames |
| |
| # test case: a wildcard name and 2nd normal vhost, overlapping |
| def test_md_720_006(self, env): |
| dns01cmd = os.path.join(env.test_dir, "../modules/md/dns01.py") |
| domain = self.test_domain |
| dwild = "*." + domain |
| domain2 = "www." + domain |
| domains = [domain, dwild, domain2] |
| |
| conf = MDConf(env) |
| conf.add("MDCAChallenges dns-01") |
| conf.add(f"MDChallengeDns01 {dns01cmd}") |
| conf.add_md(domains) |
| conf.add_vhost(domain2) |
| conf.add_vhost([domain, dwild]) |
| conf.install() |
| |
| # restart, check that md is in store |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' |
| env.check_md(domains) |
| # await drive completion |
| assert env.await_completion([domain]) |
| env.check_md_complete(domain) |
| # check: SSL is running OK |
| cert_a = env.get_cert(domain) |
| altnames = cert_a.get_san_list() |
| for domain in [domain, dwild]: |
| assert domain in altnames |
| |
| # test case: a MDomain with just a wildcard, see #239 |
| def test_md_720_007(self, env): |
| dns01cmd = os.path.join(env.test_dir, "../modules/md/dns01.py") |
| domain = self.test_domain |
| dwild = "*." + domain |
| wwwdomain = "www." + domain |
| domains = [dwild] |
| |
| conf = MDConf(env) |
| conf.add("MDCAChallenges dns-01") |
| conf.add(f"MDChallengeDns01 {dns01cmd}") |
| conf.add_md(domains) |
| conf.add_vhost(wwwdomain) |
| conf.install() |
| |
| # restart, check that md is in store |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' |
| env.check_md(domains) |
| # await drive completion |
| assert env.await_completion([wwwdomain]) |
| env.check_md_complete(dwild) |
| # check: SSL is running OK |
| cert_a = env.get_cert(wwwdomain) |
| altnames = cert_a.get_san_list() |
| assert domains == altnames |
| |
| # test case: a plain name, only dns-01 configured, |
| # http-01 should not be intercepted. See #279 |
| def test_md_720_008(self, env): |
| dns01cmd = os.path.join(env.test_dir, "../modules/md/dns01.py") |
| domain = self.test_domain |
| domains = [domain] |
| |
| conf = MDConf(env) |
| conf.add("MDCAChallenges dns-01") |
| conf.add(f"MDChallengeDns01 {dns01cmd}") |
| conf.add_md(domains) |
| conf.add_vhost(domains) |
| conf.add("LogLevel http:trace4") |
| conf.install() |
| |
| challengedir = os.path.join(env.server_dir, "htdocs/test1/.well-known/acme-challenge") |
| env.mkpath(challengedir) |
| content = b'not a challenge' |
| with open(os.path.join(challengedir, "123456"), "wb") as fd: |
| fd.write(content) |
| |
| # restart, check that md is in store |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' |
| env.check_md(domains) |
| # await drive completion |
| assert env.await_completion([domain], restart=False) |
| # access a fake http-01 challenge on the domain |
| r = env.curl_get(f"http://{domain}:{env.http_port}/.well-known/acme-challenge/123456") |
| assert r.response['status'] == 200 |
| assert r.response['body'] == content |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' |
| env.check_md_complete(domain) |