mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-12-15 15:48:53 -05:00
Update the TLS cipher string and provide configurability for TLS on outgoing federation (#5550)
This commit is contained in:
parent
9646a593ac
commit
be3b901ccd
7 changed files with 190 additions and 9 deletions
|
|
@ -23,7 +23,7 @@ import six
|
|||
|
||||
from unpaddedbase64 import encode_base64
|
||||
|
||||
from OpenSSL import crypto
|
||||
from OpenSSL import SSL, crypto
|
||||
from twisted.internet._sslverify import Certificate, trustRootFromCertificates
|
||||
|
||||
from synapse.config._base import Config, ConfigError
|
||||
|
|
@ -81,6 +81,27 @@ class TlsConfig(Config):
|
|||
"federation_verify_certificates", True
|
||||
)
|
||||
|
||||
# Minimum TLS version to use for outbound federation traffic
|
||||
self.federation_client_minimum_tls_version = str(
|
||||
config.get("federation_client_minimum_tls_version", 1)
|
||||
)
|
||||
|
||||
if self.federation_client_minimum_tls_version not in ["1", "1.1", "1.2", "1.3"]:
|
||||
raise ConfigError(
|
||||
"federation_client_minimum_tls_version must be one of: 1, 1.1, 1.2, 1.3"
|
||||
)
|
||||
|
||||
# Prevent people shooting themselves in the foot here by setting it to
|
||||
# the biggest number blindly
|
||||
if self.federation_client_minimum_tls_version == "1.3":
|
||||
if getattr(SSL, "OP_NO_TLSv1_3", None) is None:
|
||||
raise ConfigError(
|
||||
(
|
||||
"federation_client_minimum_tls_version cannot be 1.3, "
|
||||
"your OpenSSL does not support it"
|
||||
)
|
||||
)
|
||||
|
||||
# Whitelist of domains to not verify certificates for
|
||||
fed_whitelist_entries = config.get(
|
||||
"federation_certificate_verification_whitelist", []
|
||||
|
|
@ -261,6 +282,15 @@ class TlsConfig(Config):
|
|||
#
|
||||
#federation_verify_certificates: false
|
||||
|
||||
# The minimum TLS version that will be used for outbound federation requests.
|
||||
#
|
||||
# Defaults to `1`. Configurable to `1`, `1.1`, `1.2`, or `1.3`. Note
|
||||
# that setting this value higher than `1.2` will prevent federation to most
|
||||
# of the public Matrix network: only configure it to `1.3` if you have an
|
||||
# entirely private federation setup and you can ensure TLS 1.3 support.
|
||||
#
|
||||
#federation_client_minimum_tls_version: 1.2
|
||||
|
||||
# Skip federation certificate verification on the following whitelist
|
||||
# of domains.
|
||||
#
|
||||
|
|
|
|||
|
|
@ -24,12 +24,25 @@ from OpenSSL import SSL, crypto
|
|||
from twisted.internet._sslverify import _defaultCurveName
|
||||
from twisted.internet.abstract import isIPAddress, isIPv6Address
|
||||
from twisted.internet.interfaces import IOpenSSLClientConnectionCreator
|
||||
from twisted.internet.ssl import CertificateOptions, ContextFactory, platformTrust
|
||||
from twisted.internet.ssl import (
|
||||
CertificateOptions,
|
||||
ContextFactory,
|
||||
TLSVersion,
|
||||
platformTrust,
|
||||
)
|
||||
from twisted.python.failure import Failure
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
_TLS_VERSION_MAP = {
|
||||
"1": TLSVersion.TLSv1_0,
|
||||
"1.1": TLSVersion.TLSv1_1,
|
||||
"1.2": TLSVersion.TLSv1_2,
|
||||
"1.3": TLSVersion.TLSv1_3,
|
||||
}
|
||||
|
||||
|
||||
class ServerContextFactory(ContextFactory):
|
||||
"""Factory for PyOpenSSL SSL contexts that are used to handle incoming
|
||||
connections."""
|
||||
|
|
@ -43,16 +56,18 @@ class ServerContextFactory(ContextFactory):
|
|||
try:
|
||||
_ecCurve = crypto.get_elliptic_curve(_defaultCurveName)
|
||||
context.set_tmp_ecdh(_ecCurve)
|
||||
|
||||
except Exception:
|
||||
logger.exception("Failed to enable elliptic curve for TLS")
|
||||
context.set_options(SSL.OP_NO_SSLv2 | SSL.OP_NO_SSLv3)
|
||||
|
||||
context.set_options(
|
||||
SSL.OP_NO_SSLv2 | SSL.OP_NO_SSLv3 | SSL.OP_NO_TLSv1 | SSL.OP_NO_TLSv1_1
|
||||
)
|
||||
context.use_certificate_chain_file(config.tls_certificate_file)
|
||||
context.use_privatekey(config.tls_private_key)
|
||||
|
||||
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
|
||||
context.set_cipher_list(
|
||||
"ECDH+AESGCM:ECDH+CHACHA20:ECDH+AES256:ECDH+AES128:!aNULL:!SHA1"
|
||||
"ECDH+AESGCM:ECDH+CHACHA20:ECDH+AES256:ECDH+AES128:!aNULL:!SHA1:!AESCCM"
|
||||
)
|
||||
|
||||
def getContext(self):
|
||||
|
|
@ -79,10 +94,22 @@ class ClientTLSOptionsFactory(object):
|
|||
# Use CA root certs provided by OpenSSL
|
||||
trust_root = platformTrust()
|
||||
|
||||
self._verify_ssl_context = CertificateOptions(trustRoot=trust_root).getContext()
|
||||
# "insecurelyLowerMinimumTo" is the argument that will go lower than
|
||||
# Twisted's default, which is why it is marked as "insecure" (since
|
||||
# Twisted's defaults are reasonably secure). But, since Twisted is
|
||||
# moving to TLS 1.2 by default, we want to respect the config option if
|
||||
# it is set to 1.0 (which the alternate option, raiseMinimumTo, will not
|
||||
# let us do).
|
||||
minTLS = _TLS_VERSION_MAP[config.federation_client_minimum_tls_version]
|
||||
|
||||
self._verify_ssl = CertificateOptions(
|
||||
trustRoot=trust_root, insecurelyLowerMinimumTo=minTLS
|
||||
)
|
||||
self._verify_ssl_context = self._verify_ssl.getContext()
|
||||
self._verify_ssl_context.set_info_callback(self._context_info_cb)
|
||||
|
||||
self._no_verify_ssl_context = CertificateOptions().getContext()
|
||||
self._no_verify_ssl = CertificateOptions(insecurelyLowerMinimumTo=minTLS)
|
||||
self._no_verify_ssl_context = self._no_verify_ssl.getContext()
|
||||
self._no_verify_ssl_context.set_info_callback(self._context_info_cb)
|
||||
|
||||
def get_options(self, host):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue