mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-08-14 06:15:24 -04:00
Stop hardcoding trust of old matrix.org key (#5374)
There are a few changes going on here: * We make checking the signature on a key server response optional: if no verify_keys are specified, we trust to TLS to validate the connection. * We change the default config so that it does not require responses to be signed by the old key. * We replace the old 'perspectives' config with 'trusted_key_servers', which is also formatted slightly differently. * We emit a warning to the logs every time we trust a key server response signed by the old key.
This commit is contained in:
parent
833c406b9b
commit
9fbb20a531
6 changed files with 294 additions and 96 deletions
|
@ -19,7 +19,7 @@ from mock import Mock
|
|||
import canonicaljson
|
||||
import signedjson.key
|
||||
import signedjson.sign
|
||||
from signedjson.key import get_verify_key
|
||||
from signedjson.key import encode_verify_key_base64, get_verify_key
|
||||
|
||||
from twisted.internet import defer
|
||||
|
||||
|
@ -40,7 +40,7 @@ class MockPerspectiveServer(object):
|
|||
|
||||
def get_verify_keys(self):
|
||||
vk = signedjson.key.get_verify_key(self.key)
|
||||
return {"%s:%s" % (vk.alg, vk.version): vk}
|
||||
return {"%s:%s" % (vk.alg, vk.version): encode_verify_key_base64(vk)}
|
||||
|
||||
def get_signed_key(self, server_name, verify_key):
|
||||
key_id = "%s:%s" % (verify_key.alg, verify_key.version)
|
||||
|
@ -48,9 +48,7 @@ class MockPerspectiveServer(object):
|
|||
"server_name": server_name,
|
||||
"old_verify_keys": {},
|
||||
"valid_until_ts": time.time() * 1000 + 3600,
|
||||
"verify_keys": {
|
||||
key_id: {"key": signedjson.key.encode_verify_key_base64(verify_key)}
|
||||
},
|
||||
"verify_keys": {key_id: {"key": encode_verify_key_base64(verify_key)}},
|
||||
}
|
||||
self.sign_response(res)
|
||||
return res
|
||||
|
@ -63,10 +61,18 @@ class KeyringTestCase(unittest.HomeserverTestCase):
|
|||
def make_homeserver(self, reactor, clock):
|
||||
self.mock_perspective_server = MockPerspectiveServer()
|
||||
self.http_client = Mock()
|
||||
hs = self.setup_test_homeserver(handlers=None, http_client=self.http_client)
|
||||
keys = self.mock_perspective_server.get_verify_keys()
|
||||
hs.config.perspectives = {self.mock_perspective_server.server_name: keys}
|
||||
return hs
|
||||
|
||||
config = self.default_config()
|
||||
config["trusted_key_servers"] = [
|
||||
{
|
||||
"server_name": self.mock_perspective_server.server_name,
|
||||
"verify_keys": self.mock_perspective_server.get_verify_keys(),
|
||||
}
|
||||
]
|
||||
|
||||
return self.setup_test_homeserver(
|
||||
handlers=None, http_client=self.http_client, config=config
|
||||
)
|
||||
|
||||
def check_context(self, _, expected):
|
||||
self.assertEquals(
|
||||
|
@ -371,10 +377,18 @@ class PerspectivesKeyFetcherTestCase(unittest.HomeserverTestCase):
|
|||
def make_homeserver(self, reactor, clock):
|
||||
self.mock_perspective_server = MockPerspectiveServer()
|
||||
self.http_client = Mock()
|
||||
hs = self.setup_test_homeserver(handlers=None, http_client=self.http_client)
|
||||
keys = self.mock_perspective_server.get_verify_keys()
|
||||
hs.config.perspectives = {self.mock_perspective_server.server_name: keys}
|
||||
return hs
|
||||
|
||||
config = self.default_config()
|
||||
config["trusted_key_servers"] = [
|
||||
{
|
||||
"server_name": self.mock_perspective_server.server_name,
|
||||
"verify_keys": self.mock_perspective_server.get_verify_keys(),
|
||||
}
|
||||
]
|
||||
|
||||
return self.setup_test_homeserver(
|
||||
handlers=None, http_client=self.http_client, config=config
|
||||
)
|
||||
|
||||
def test_get_keys_from_perspectives(self):
|
||||
# arbitrarily advance the clock a bit
|
||||
|
@ -439,8 +453,7 @@ class PerspectivesKeyFetcherTestCase(unittest.HomeserverTestCase):
|
|||
self.assertEqual(res["ts_valid_until_ms"], VALID_UNTIL_TS)
|
||||
|
||||
self.assertEqual(
|
||||
bytes(res["key_json"]),
|
||||
canonicaljson.encode_canonical_json(response),
|
||||
bytes(res["key_json"]), canonicaljson.encode_canonical_json(response)
|
||||
)
|
||||
|
||||
def test_invalid_perspectives_responses(self):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue