diff --git a/acme/acme/challenges.py b/acme/acme/challenges.py index f32783830..cf9573c5c 100644 --- a/acme/acme/challenges.py +++ b/acme/acme/challenges.py @@ -211,7 +211,7 @@ class SimpleHTTPResponse(ChallengeResponse): http_response.text, http_response.headers) if self.CONTENT_TYPE != http_response.headers.get( - "Content-Type", self.CONTENT_TYPE): + "Content-Type", self.CONTENT_TYPE): return False try: diff --git a/acme/acme/challenges_test.py b/acme/acme/challenges_test.py index 61cca498c..ab7cba03e 100644 --- a/acme/acme/challenges_test.py +++ b/acme/acme/challenges_test.py @@ -145,28 +145,34 @@ class SimpleHTTPResponseTest(unittest.TestCase): @mock.patch("acme.challenges.requests.get") def test_simple_verify_good_token(self, mock_get): + account_key = jose.JWKRSA.load(test_util.load_vector('rsa512_key.pem')) for resp in self.resp_http, self.resp_https: mock_get.reset_mock() + validation = resp.gen_validation(self.chall, account_key) mock_get.return_value = mock.MagicMock( - text=self.chall.token, headers=self.good_headers) - self.assertTrue(resp.simple_verify(self.chall, "local")) - mock_get.assert_called_once_with(resp.uri("local"), verify=False) + text=validation.json_dumps(), headers=self.good_headers) + self.assertTrue(resp.simple_verify(self.chall, "local", None)) + mock_get.assert_called_once_with(resp.uri( + "local", self.chall), verify=False) @mock.patch("acme.challenges.requests.get") def test_simple_verify_bad_token(self, mock_get): mock_get.return_value = mock.MagicMock( text=self.chall.token + "!", headers=self.good_headers) - self.assertFalse(self.resp_http.simple_verify(self.chall, "local")) + self.assertFalse(self.resp_http.simple_verify( + self.chall, "local", None)) @mock.patch("acme.challenges.requests.get") def test_simple_verify_bad_content_type(self, mock_get): mock_get().text = self.chall.token - self.assertFalse(self.resp_http.simple_verify(self.chall, "local")) + self.assertFalse(self.resp_http.simple_verify( + self.chall, "local", None)) @mock.patch("acme.challenges.requests.get") def test_simple_verify_connection_error(self, mock_get): mock_get.side_effect = requests.exceptions.RequestException - self.assertFalse(self.resp_http.simple_verify(self.chall, "local")) + self.assertFalse(self.resp_http.simple_verify( + self.chall, "local", None)) @mock.patch("acme.challenges.requests.get") def test_simple_verify_port(self, mock_get): diff --git a/acme/acme/fields.py b/acme/acme/fields.py index 1e4d3a822..002240b23 100644 --- a/acme/acme/fields.py +++ b/acme/acme/fields.py @@ -24,8 +24,8 @@ class Fixed(jose.Field): def encode(self, value): if value != self.value: - logger.warn('Overriding fixed field ({0}) with {1}'.format( - self.json_name, value)) + logger.warn( + 'Overriding fixed field (%s) with %r', self.json_name, value) return value diff --git a/letsencrypt-apache/letsencrypt_apache/dvsni.py b/letsencrypt-apache/letsencrypt_apache/dvsni.py index fbe30b1a6..93fbea57e 100644 --- a/letsencrypt-apache/letsencrypt_apache/dvsni.py +++ b/letsencrypt-apache/letsencrypt_apache/dvsni.py @@ -163,7 +163,8 @@ class ApacheDvsni(common.Dvsni): # parses it as "\n"... c.f.: # https://docs.python.org/2.7/reference/lexical_analysis.html return self.VHOST_TEMPLATE.format( - vhost=ips, server_name=achall.nonce_domain, + vhost=ips, + server_name=achall.gen_response(achall.account.key).z_domain, ssl_options_conf_path=self.configurator.mod_ssl_conf, cert_path=self.get_cert_path(achall), key_path=self.get_key_path(achall), diff --git a/letsencrypt-apache/letsencrypt_apache/tests/configurator_test.py b/letsencrypt-apache/letsencrypt_apache/tests/configurator_test.py index 8c59147a3..bbccff239 100644 --- a/letsencrypt-apache/letsencrypt_apache/tests/configurator_test.py +++ b/letsencrypt-apache/letsencrypt_apache/tests/configurator_test.py @@ -11,7 +11,6 @@ from acme import challenges from letsencrypt import achallenges from letsencrypt import errors -from letsencrypt import le_util from letsencrypt.tests import acme_util @@ -374,11 +373,11 @@ class TwoVhost80Test(util.ApacheTest): def test_perform(self, mock_restart, mock_dvsni_perform): # Only tests functionality specific to configurator.perform # Note: As more challenges are offered this will have to be expanded - _, achall1, achall2 = self.get_achalls() + account_key, achall1, achall2 = self.get_achalls() dvsni_ret_val = [ - challenges.DVSNIResponse(s="randomS1"), - challenges.DVSNIResponse(s="randomS2"), + achall1.gen_response(account_key.key), + achall2.gen_response(account_key.key), ] mock_dvsni_perform.return_value = dvsni_ret_val @@ -585,23 +584,21 @@ class TwoVhost80Test(util.ApacheTest): def get_achalls(self): """Return testing achallenges.""" - auth_key = le_util.Key(self.rsa256_file, self.rsa256_pem) + account = mock.MagicMock(key=self.rsa512jwk) achall1 = achallenges.DVSNI( challb=acme_util.chall_to_challb( challenges.DVSNI( - r="jIq_Xy1mXGN37tb4L6Xj_es58fW571ZNyXekdZzhh7Q", - nonce="37bc5eb75d3e00a19b4f6355845e5a18"), + token="jIq_Xy1mXGN37tb4L6Xj_es58fW571ZNyXekdZzhh7Q"), "pending"), - domain="encryption-example.demo", key=auth_key) + domain="encryption-example.demo", account=account) achall2 = achallenges.DVSNI( challb=acme_util.chall_to_challb( challenges.DVSNI( - r="uqnaPzxtrndteOqtrXb0Asl5gOJfWAnnx6QJyvcmlDU", - nonce="59ed014cac95f77057b1d7a1b2c596ba"), + token="uqnaPzxtrndteOqtrXb0Asl5gOJfWAnnx6QJyvcmlDU"), "pending"), - domain="letsencrypt.demo", key=auth_key) + domain="letsencrypt.demo", account=account) - return auth_key, achall1, achall2 + return account, achall1, achall2 def test_make_addrs_sni_ready(self): self.config.version = (2, 2) diff --git a/letsencrypt-apache/letsencrypt_apache/tests/dvsni_test.py b/letsencrypt-apache/letsencrypt_apache/tests/dvsni_test.py index 329a5439b..9a7f6cb43 100644 --- a/letsencrypt-apache/letsencrypt_apache/tests/dvsni_test.py +++ b/letsencrypt-apache/letsencrypt_apache/tests/dvsni_test.py @@ -4,8 +4,6 @@ import shutil import mock -from acme import challenges - from letsencrypt.plugins import common_test from letsencrypt_apache import obj @@ -15,6 +13,7 @@ from letsencrypt_apache.tests import util class DvsniPerformTest(util.ApacheTest): """Test the ApacheDVSNI challenge.""" + auth_key = common_test.DvsniTest.auth_key achalls = common_test.DvsniTest.achalls def setUp(self): # pylint: disable=arguments-differ @@ -44,8 +43,8 @@ class DvsniPerformTest(util.ApacheTest): achall = self.achalls[0] self.sni.add_chall(achall) - mock_setup_cert = mock.MagicMock( - return_value=challenges.DVSNIResponse(s="randomS1")) + response = self.achalls[0].gen_response(self.auth_key) + mock_setup_cert = mock.MagicMock(return_value=response) # pylint: disable=protected-access self.sni._setup_challenge_cert = mock_setup_cert @@ -58,22 +57,22 @@ class DvsniPerformTest(util.ApacheTest): len(self.sni.configurator.parser.find_dir( "Include", self.sni.challenge_conf)), 1) self.assertEqual(len(responses), 1) - self.assertEqual(responses[0].s, "randomS1") + self.assertEqual(responses[0], response) def test_perform2(self): # Avoid load module self.sni.configurator.parser.modules.add("ssl_module") + acme_responses = [] for achall in self.achalls: self.sni.add_chall(achall) + acme_responses.append(achall.gen_response(self.auth_key)) - mock_setup_cert = mock.MagicMock(side_effect=[ - challenges.DVSNIResponse(s="randomS0"), - challenges.DVSNIResponse(s="randomS1")]) + mock_setup_cert = mock.MagicMock(side_effect=acme_responses) # pylint: disable=protected-access self.sni._setup_challenge_cert = mock_setup_cert - responses = self.sni.perform() + sni_responses = self.sni.perform() self.assertEqual(mock_setup_cert.call_count, 2) @@ -87,13 +86,16 @@ class DvsniPerformTest(util.ApacheTest): len(self.sni.configurator.parser.find_dir( "Include", self.sni.challenge_conf)), 1) - self.assertEqual(len(responses), 2) + self.assertEqual(len(sni_responses), 2) for i in xrange(2): - self.assertEqual(responses[i].s, "randomS%d" % i) + self.assertEqual(sni_responses[i], acme_responses[i]) def test_mod_config(self): + z_domains = [] for achall in self.achalls: self.sni.add_chall(achall) + z_domain = achall.gen_response(self.auth_key).z_domain + z_domains.append(set([z_domain])) self.sni._mod_config() # pylint: disable=protected-access self.sni.configurator.save() @@ -111,9 +113,7 @@ class DvsniPerformTest(util.ApacheTest): for vhost in vhs: self.assertEqual(vhost.addrs, set([obj.Addr.fromstring("*:443")])) names = vhost.get_names() - self.assertTrue( - names == set([self.achalls[0].nonce_domain]) or - names == set([self.achalls[1].nonce_domain])) + self.assertTrue(names in z_domains) def test_get_dvsni_addrs_default(self): self.sni.configurator.choose_vhost = mock.Mock( diff --git a/letsencrypt-apache/letsencrypt_apache/tests/util.py b/letsencrypt-apache/letsencrypt_apache/tests/util.py index b1cb25050..b544e06ee 100644 --- a/letsencrypt-apache/letsencrypt_apache/tests/util.py +++ b/letsencrypt-apache/letsencrypt_apache/tests/util.py @@ -1,6 +1,5 @@ """Common utilities for letsencrypt_apache.""" import os -import pkg_resources import sys import unittest @@ -8,10 +7,14 @@ import augeas import mock import zope.component +from acme import jose + from letsencrypt.display import util as display_util from letsencrypt.plugins import common +from letsencrypt.tests import test_util + from letsencrypt_apache import configurator from letsencrypt_apache import constants from letsencrypt_apache import obj @@ -34,10 +37,8 @@ class ApacheTest(unittest.TestCase): # pylint: disable=too-few-public-methods self.config_path = os.path.join(self.temp_dir, config_root) - self.rsa256_file = pkg_resources.resource_filename( - "letsencrypt.tests", os.path.join("testdata", "rsa256_key.pem")) - self.rsa256_pem = pkg_resources.resource_string( - "letsencrypt.tests", os.path.join("testdata", "rsa256_key.pem")) + self.rsa512jwk = jose.JWKRSA.load(test_util.load_vector( + "rsa512_key.pem")) class ParserTest(ApacheTest): # pytlint: disable=too-few-public-methods diff --git a/letsencrypt-nginx/letsencrypt_nginx/dvsni.py b/letsencrypt-nginx/letsencrypt_nginx/dvsni.py index bdf8d4487..3ac5e788f 100644 --- a/letsencrypt-nginx/letsencrypt_nginx/dvsni.py +++ b/letsencrypt-nginx/letsencrypt_nginx/dvsni.py @@ -132,7 +132,8 @@ class NginxDvsni(common.Dvsni): block = [['listen', str(addr)] for addr in addrs] - block.extend([['server_name', achall.nonce_domain], + block.extend([['server_name', + achall.gen_response(achall.account.key).z_domain], ['include', self.configurator.parser.loc["ssl_options"]], # access and error logs necessary for # integration testing (non-root) diff --git a/letsencrypt-nginx/letsencrypt_nginx/tests/configurator_test.py b/letsencrypt-nginx/letsencrypt_nginx/tests/configurator_test.py index 3703a8201..0f92a387c 100644 --- a/letsencrypt-nginx/letsencrypt_nginx/tests/configurator_test.py +++ b/letsencrypt-nginx/letsencrypt_nginx/tests/configurator_test.py @@ -11,7 +11,6 @@ from acme import messages from letsencrypt import achallenges from letsencrypt import errors -from letsencrypt import le_util from letsencrypt_nginx.tests import util @@ -174,27 +173,23 @@ class NginxConfiguratorTest(util.NginxTest): def test_perform(self, mock_restart, mock_dvsni_perform): # Only tests functionality specific to configurator.perform # Note: As more challenges are offered this will have to be expanded - auth_key = le_util.Key(self.rsa256_file, self.rsa256_pem) + account = mock.MagicMock(key=self.rsa512jwk) achall1 = achallenges.DVSNI( challb=messages.ChallengeBody( - chall=challenges.DVSNI( - r="foo", - nonce="bar"), + chall=challenges.DVSNI(token="kNdwjwOeX0I_A8DXt9Msmg"), uri="https://ca.org/chall0_uri", status=messages.Status("pending"), - ), domain="localhost", key=auth_key) + ), domain="localhost", account=account) achall2 = achallenges.DVSNI( challb=messages.ChallengeBody( - chall=challenges.DVSNI( - r="abc", - nonce="def"), + chall=challenges.DVSNI(token="m8TdO1qik4JVFtgPPurJmg"), uri="https://ca.org/chall1_uri", status=messages.Status("pending"), - ), domain="example.com", key=auth_key) + ), domain="example.com", account=account) dvsni_ret_val = [ - challenges.DVSNIResponse(s="irrelevant"), - challenges.DVSNIResponse(s="arbitrary"), + achall1.gen_response(account.key), + achall2.gen_response(account.key), ] mock_dvsni_perform.return_value = dvsni_ret_val diff --git a/letsencrypt-nginx/letsencrypt_nginx/tests/dvsni_test.py b/letsencrypt-nginx/letsencrypt_nginx/tests/dvsni_test.py index 4680c5c1e..b1612a097 100644 --- a/letsencrypt-nginx/letsencrypt_nginx/tests/dvsni_test.py +++ b/letsencrypt-nginx/letsencrypt_nginx/tests/dvsni_test.py @@ -19,31 +19,26 @@ from letsencrypt_nginx.tests import util class DvsniPerformTest(util.NginxTest): """Test the NginxDVSNI challenge.""" + account = mock.MagicMock(key=common_test.DvsniTest.auth_key) achalls = [ achallenges.DVSNI( challb=acme_util.chall_to_challb( - challenges.DVSNI( - r="foo", - nonce="bar" - ), "pending"), - domain="www.example.com", key=common_test.DvsniTest.auth_key), + challenges.DVSNI(token="kNdwjwOeX0I_A8DXt9Msmg"), "pending"), + domain="www.example.com", account=account), achallenges.DVSNI( challb=acme_util.chall_to_challb( challenges.DVSNI( - r="\xba\xa9\xda?