diff --git a/acme/acme/client.py b/acme/acme/client.py index 28ed4f5bb..93816abfb 100644 --- a/acme/acme/client.py +++ b/acme/acme/client.py @@ -1149,13 +1149,23 @@ class ClientNetwork: host, path, _err_no, err_msg = m.groups() raise ValueError("Requesting {0}{1}:{2}".format(host, path, err_msg)) - # If content is DER, log the base64 of it instead of raw bytes, to keep - # binary data out of the logs. + # If the Content-Type is DER or an Accept header was sent in the + # request, the response may not be UTF-8 encoded. In this case, we + # don't set response.encoding and log the base64 response instead of + # raw bytes to keep binary data out of the logs. This code can be + # simplified to only check for an Accept header in the request when + # ACMEv1 support is dropped. debug_content: Union[bytes, str] - if response.headers.get("Content-Type") == DER_CONTENT_TYPE: + if (response.headers.get("Content-Type") == DER_CONTENT_TYPE or + "Accept" in kwargs["headers"]): debug_content = base64.b64encode(response.content) else: - debug_content = response.content.decode("utf-8") + # We set response.encoding so response.text knows the response is + # UTF-8 encoded instead of trying to guess the encoding that was + # used which is error prone. This setting affects all future + # accesses of .text made on the returned response object as well. + response.encoding = "utf-8" + debug_content = response.text logger.debug('Received response:\nHTTP %d\n%s\n\n%s', response.status_code, "\n".join("{0}: {1}".format(k, v) diff --git a/acme/setup.py b/acme/setup.py index a38a64efb..baed93c65 100644 --- a/acme/setup.py +++ b/acme/setup.py @@ -6,10 +6,6 @@ from setuptools import setup version = '1.19.0.dev0' install_requires = [ - # This dependency just exists to ensure that chardet is installed along - # with requests so it will use it instead of charset_normalizer. See - # https://github.com/certbot/certbot/issues/8964 for more info. - 'chardet', 'cryptography>=2.1.4', # formerly known as acme.jose: # 1.1.0+ is required to avoid the warnings described at diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 88e5e84b4..5e86b470e 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -18,6 +18,9 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). * `zope` based interfaces in `certbot.interfaces` module are deprecated and will be removed in a future release of Certbot. Any import of these interfaces will emit a warning to prepare the transition for developers. +* We removed the dependency on `chardet` from our acme library. Except for when + downloading a certificate in an alternate format, our acme library now + assumes all server responses are UTF-8 encoded which is required by RFC 8555. ### Fixed