Consolidate SSL ciphers and use them in SslTransport (#1798)
Some checks failed
CI / Perform Lint Checks (3.14) (push) Has been cancelled
CodeQL Checks / Analyze (python) (push) Has been cancelled
CI / Python 3.11 on macos-latest (push) Has been cancelled
CI / Python 3.12 on macos-latest (push) Has been cancelled
CI / Python 3.13 on macos-latest (push) Has been cancelled
CI / Python 3.14 on macos-latest (push) Has been cancelled
CI / Python 3.11 on ubuntu-latest (push) Has been cancelled
CI / Python 3.12 on ubuntu-latest (push) Has been cancelled
CI / Python 3.13 on ubuntu-latest (push) Has been cancelled
CI / Python 3.14 on ubuntu-latest (push) Has been cancelled
CI / Python 3.11 on windows-latest (push) Has been cancelled
CI / Python 3.12 on windows-latest (push) Has been cancelled
CI / Python 3.13 on windows-latest (push) Has been cancelled
CI / Python 3.14 on windows-latest (push) Has been cancelled

- Add `kasa/transports/sslcontext.py` with one shared SSL context for
the https transports to avoid copies across transports.
- Use it in `SslTransport`, and convert KLAP and Linkie also to use it.
- Extend Python's default ciphers with the legacy suites instead of
replacing accepted ciphers for future compatibility.
This commit is contained in:
Teemu R.
2026-10-14 23:16:56 +02:00
committed by GitHub
parent d6e80d2c78
commit 2a81f74e9c
7 changed files with 65 additions and 100 deletions

View File

@@ -48,12 +48,6 @@ MOCK_STOCK = "abcdefghijklmnopqrstuvwxyz1234)("
MOCK_UNENCRYPTED_PASSTHROUGH_STOK = "32charLowerCaseHexStok"
def test_ssl_ciphers_include_modern_tapo_suites() -> None:
"""Keep compatibility with cameras that dropped legacy RSA ciphers."""
assert "ECDHE-RSA-AES128-GCM-SHA256" in SslAesTransport.CIPHERS
assert "ECDHE-RSA-AES256-GCM-SHA384" in SslAesTransport.CIPHERS
@pytest.mark.parametrize(
(
"status_code",

View File

@@ -0,0 +1,11 @@
import ssl
from kasa.transports.sslcontext import get_ssl_context
async def test_ssl_context_extends_python_defaults_with_legacy_suites() -> None:
"""Some ciphers are added on top of Python's defaults for compatibility."""
default = {c["name"] for c in ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT).get_ciphers()}
enabled = {c["name"] for c in (await get_ssl_context()).get_ciphers()}
assert default <= enabled
assert {"AES128-GCM-SHA256", "AES256-SHA"} <= enabled