import base64 import json import os.path import re from datetime import timedelta
import pytest from pyhttpd.certs import CertificateSpec
from .md_conf import MDConf from .md_cert_util import MDCertUtil from .md_env import MDTestEnv
@pytest.mark.skipif(condition=not MDTestEnv.has_a2md(), reason="no a2md available")
@pytest.mark.skipif(condition=not MDTestEnv.has_acme_server(),
reason="no ACME test server configured") class TestDrivev2:
def test_md_502_000(self, env): # test case: md without contact info
domain = self.test_domain
name = "www." + domain assert env.a2md(["add", name]).exit_code == 0
r = env.a2md(["drive", name]) assert r.exit_code == 1 assert re.search("No contact information", r.stderr)
def test_md_502_001(self, env): # test case: md with contact, but without TOS
domain = self.test_domain
name = "www." + domain assert env.a2md(["add", name]).exit_code == 0 assert env.a2md(
["update", name, "contacts", "admin@test1.not-forbidden.org"]
).exit_code == 0
r = env.a2md(["drive", name]) assert r.exit_code == 1 assert re.search("the CA requires you to accept the terms-of-service as specified in ", r.stderr)
# test_102 removed, was based on false assumption def test_md_502_003(self, env): # test case: md with unknown protocol FOO
domain = self.test_domain
name = "www." + domain
self._prepare_md(env, [name]) assert env.a2md(
["update", name, "ca", env.acme_url, "FOO"]
).exit_code == 0
r = env.a2md(["drive", name]) assert r.exit_code == 1 assert re.search("Unknown CA protocol", r.stderr)
# --------- driving OK ---------
def test_md_502_100(self, env): # test case: md with one domain
domain = self.test_domain
name = "www." + domain
self._prepare_md(env, [name]) assert env.apache_restart() == 0, f'{env.apachectl_stderr}' # drive
prev_md = env.a2md(["list", name]).json['output'][0]
r = env.a2md(["-vv", "drive", "-c", "http-01", name]) assert r.exit_code == 0, "a2md drive failed: {0}".format(r.stderr)
env.check_md_credentials([name])
self._check_account_key(env, name)
# check archive content
store_md = json.loads(open(env.store_archived_file(name, 1, 'md.json')).read()) for f in ['name', 'ca', 'domains', 'contacts', 'renew-mode', 'renew-window', 'must-staple']: assert store_md[f] == prev_md[f]
# check file system permissions:
env.check_file_permissions(name) # check: challenges removed
env.check_dir_empty(env.store_challenges()) # check how the challenge resources are answered in sevceral combinations
r = env.get_meta(domain, "/.well-known/acme-challenge", False) assert r.exit_code == 0 assert r.response['status'] == 404
r = env.get_meta(domain, "/.well-known/acme-challenge/", False) assert r.exit_code == 0 assert r.response['status'] == 404
r = env.get_meta(domain, "/.well-known/acme-challenge/123", False) assert r.exit_code == 0 assert r.response['status'] == 404 assert r.exit_code == 0
cdir = os.path.join(env.store_challenges(), domain)
os.makedirs(cdir)
open(os.path.join(cdir, 'acme-http-01.txt'), "w").write("content-of-123")
r = env.get_meta(domain, "/.well-known/acme-challenge/123", False) assert r.exit_code == 0 assert r.response['status'] == 200 assert r.response['header']['content-length'] == '14'
# drive it assert env.a2md(["drive", name]).exit_code == 0 assert env.apache_restart() == 0, f'{env.apachectl_stderr}' # test HTTP access - no redirect
jdata = env.get_json_content(f"test1.{env.http_tld}", "/alive.json", use_https=False) assert jdata['host']== "test1" assert env.get_content(name, "/name.txt", use_https=False) == name
r = env.get_meta(name, "/name.txt", use_https=False) assert int(r.response['header']['content-length']) == len(name) assert"Location"notin r.response['header'] # test HTTPS access assert env.get_content(name, "/name.txt", use_https=True) == name
# test HTTP access again -> redirect to default HTTPS port
conf.add("MDRequireHttps temporary")
conf.install() assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
r = env.get_meta(name, "/name.txt", use_https=False) assert r.response['status'] == 302
exp_location = "https://%s/name.txt" % name assert r.response['header']['location'] == exp_location # should not see this assert'strict-transport-security'notin r.response['header'] # test default HTTP vhost -> still no redirect
jdata = env.get_json_content(f"test1.{env.http_tld}", "/alive.json", use_https=False) assert jdata['host']== "test1"
r = env.get_meta(name, "/name.txt", use_https=True) # also not for this assert'strict-transport-security'notin r.response['header']
# test HTTP access again -> redirect permanent
conf.add("MDRequireHttps permanent")
conf.install() assert env.apache_restart() == 0, f'{env.apachectl_stderr}'
r = env.get_meta(name, "/name.txt", use_https=False) assert r.response['status'] == 301
exp_location = "https://%s/name.txt" % name assert r.response['header']['location'] == exp_location assert'strict-transport-security'notin r.response['header'] # should see this
r = env.get_meta(name, "/name.txt", use_https=True) assert r.response['header']['strict-transport-security'] == 'max-age=15768000'
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.