Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Support .well-known delegation when issuing certificates through ACME #4652

Merged
merged 9 commits into from
Feb 19, 2019
1 change: 1 addition & 0 deletions changelog.d/4652.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Support .well-known delegation when issuing certificates through ACME
babolivier marked this conversation as resolved.
Show resolved Hide resolved
29 changes: 25 additions & 4 deletions synapse/handlers/acme.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
from twisted.web.resource import Resource

from synapse.app import check_bind_error
from synapse.crypto.context_factory import ClientTLSOptionsFactory
from synapse.http.federation.matrix_federation_agent import MatrixFederationAgent

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -123,15 +125,34 @@ def start_listening(self):
@defer.inlineCallbacks
def provision_certificate(self):

logger.warning("Reprovisioning %s", self.hs.hostname)
# Retrieve .well-known if it's in use. We do so through the federation
# agent, because that's where the .well-known logic lives.
agent = MatrixFederationAgent(
tls_client_options_factory=ClientTLSOptionsFactory(None),
reactor=self.reactor,
)
delegated = yield agent._get_well_known(bytes(self.hs.hostname, "ascii"))

# If .well-known is in use, use the delegated hostname instead of the
# homeserver's server_name.
if delegated:
cert_name = delegated.decode("ascii")
logger.info(
".well-known is in use, provisionning %s instead of %s",
babolivier marked this conversation as resolved.
Show resolved Hide resolved
cert_name, self.hs.hostname,
)
else:
cert_name = self.hs.hostname

logger.warning("Reprovisioning %s", cert_name)

try:
yield self._issuer.issue_cert(self.hs.hostname)
yield self._issuer.issue_cert(cert_name)
except Exception:
logger.exception("Fail!")
raise
logger.warning("Reprovisioned %s, saving.", self.hs.hostname)
cert_chain = self._store.certs[self.hs.hostname]
logger.warning("Reprovisioned %s, saving.", cert_name)
cert_chain = self._store.certs[cert_name]

try:
with open(self.hs.config.tls_private_key_file, "wb") as private_key_file:
Expand Down