Skip to main content

BoringSSL-backed TLS for CPython, with Chrome impersonation

Drop-in replacement for the ssl stdlib with a Fingerprint API for Chrome impersonation. Built on stock BoringSSL through boring-sys - no curl-impersonate, no Go runtime at import time. Use it with any known Python http client you like or used to.

Supports CPython 3.7 onward, including freethreaded builds.

Why this exists

We sat on this for a long time, kept it private as we needed to think longer about whether the world really needed one more TLS library.

The initial thinking was: why do I have to install yet whole another http client just because we need to look like a real browser? The Python ecosystem already ships perfectly fine http clients - urllib3, niquests, httpx, aiohttp - and all of them ride on top of ssl. If the impersonation lives one layer down, in the SSL layer itself, every one of them gets it for free. No fork of curl, no Go runtime imported at module load, no second http client to teach your codebase, no patched BoringSSL to maintain across CVE cycles.

That is what utls is: the ClientHello machinery, plugged in exactly where the rest of Python already plugs in.

It was private until now. Enjoy it, but with care - browser impersonation has legitimate uses (interop testing, anti-bot researches, making sure your own service still answers a real Chrome correctly) and it has illegitimate ones. The license forbids nothing; your judgment does.

Contributions are welcome. New Chrome versions are one profile module plus one registry line; platform fixes, bug reports and CI cleanups are read and merged.

Getting Started

Install from PyPI (pre-built wheels for Linux, macOS, Windows):

pip install xutls

The distribution name is xutls; the import name is still utls. Upstream PyPI (pip install utls) is the original jawah/utls package and does not include these Chrome 152 changes. Do not install both utls and xutls in the same environment; they both provide the utls module.

From source, initialize the BoringSSL checkout first (Chrome 152 GREASE in signature_algorithms needs a snapshot newer than the one bundled with cloudflare/boring):

git submodule update --init --recursive

Then swap ssl for utls anywhere in your code:

import utls as ssl

ctx = ssl.create_default_context()

Or use it alongside the stdlib:

from utls import SSLContext, PROTOCOL_TLS_CLIENT

ctx = SSLContext(PROTOCOL_TLS_CLIENT)
ctx.load_default_certs()

import socket
sock = socket.create_connection(("example.com", 443))
ssock = ctx.wrap_socket(sock, server_hostname="example.com")
ssock.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
print(ssock.recv(4096).decode())

It works with asyncio out of the box:

import asyncio
import utls as ssl

async def main():
    ctx = ssl.create_default_context()
    reader, writer = await asyncio.open_connection("example.com", 443, ssl=ctx)
    writer.write(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
    await writer.drain()
    print((await reader.read(4096)).decode())
    writer.close()

asyncio.run(main())

Browser impersonation

import utls, socket

ctx = utls.create_default_context()
ctx.set_fingerprint("chrome:stable")

with socket.create_connection(("www.google.com", 443)) as raw:
    with ctx.wrap_socket(raw, server_hostname="www.google.com") as s:
        s.sendall(b"GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n")
        print(s.recv(4096))

The bundled profile registry can be inspected at runtime:

from utls import Fingerprint, presets

print(presets())
# ['chrome:131', 'chrome:142', 'chrome:146', 'chrome:148', 'chrome:150', 'chrome:152', 'chrome:stable']

fp = Fingerprint.from_preset("chrome:stable")
print(fp.ja3_hash, fp.ja4_hash)

Profiles ship as plain Python modules under utls.profiles.*. utls is Chrome-only by design. Adding a new Chrome version is one .py file plus one registry line.

What impersonation actually rewrites

set_fingerprint controls the TLS ClientHello bytes: cipher suite list and order, extension list and order, named groups, key shares, signature algorithms, ALPN/ALPS payloads, GREASE placement, certificate compression, explicit ECH GREASE or real config, and so on. Everything that goes into a JA3 or JA4 hash, utls drives.

What it does not rewrite, because they live above TLS:

  • The HTTP request line, method, path, and body.
  • HTTP/2 SETTINGS frames, WINDOW_UPDATE values, HEADERS frame priority flags, and the Akamai HTTP/2 fingerprint that some bot-detection vendors track. Those belong to your HTTP client; pair utls with niquests or urllib3-future if you need them honored end-to-end.

Carrying the canonical Chrome header set

Each profile also publishes the exact HTTP request-header set Chrome sends on a top-level navigation, in the on-the-wire insertion order. The HTTP layer is yours to drive, but the headers are right there if you want matched cosmetics:

from utls import Fingerprint

fp = Fingerprint.from_preset("chrome:stable")
for name, value in fp.http_headers.items():
    print(f"{name}: {value}")
# sec-ch-ua: "Chromium";v="148", "Google Chrome";v="148", "Not/A)Brand";v="99"
# sec-ch-ua-mobile: ?0
# sec-ch-ua-platform: "Linux"
# User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 ...
# Accept: text/html,application/xhtml+xml,...
# ...

Request- or session-dependent headers (Host, Cookie, Referer, Content-Length, Content-Type) are deliberately omitted from the dict; the HTTP client is responsible for emitting those. For HTTP/1.1, prepend Host at position 0 to preserve Chrome's wire order.

Choosing a profile

  • chrome:stable always tracks the newest Chrome major shipped in a utls release. Use this if you want to drift with Chrome without code changes.
  • chrome:152, chrome:150, chrome:148, chrome:146, chrome:142, chrome:131 pin to specific Chrome majors. Use these when reproducibility matters - e.g. a long-running scraper that should not silently change shape when utls is upgraded.

The JA4 hash is the fingerprint identity that bot-detection vendors and TLS observatories actually index on. chrome:142 / chrome:146 / chrome:148 share the same JA4 because they share the same TLS-layer ClientHello (the deltas are HTTP-layer); chrome:131 differs because it uses the legacy ALPS codepoint (0x4469 vs 0x44cd). chrome:150 also differs: it is the first stable major to advertise post-quantum ML-DSA (FIPS 204) signature algorithms, which changes the signature_algorithms bytes and therefore the JA4. chrome:152 adds the trust_anchors extension (0xCA34), taking the JA4 extension count from 16 to 17.

Why JA3 varies but JA4 stays put

Chrome 110+ permutes its TLS extension order on every connection to defeat order-based fingerprinting. utls mirrors that behavior. As a result:

  • JA3 hashes the wire order verbatim, so fp.ja3_hash (and the hash you'd compute from a live capture) shifts per connection. Use the JA3 string for diffing the extension set, not the hash for equality.
  • JA4 sorts extension codepoints before hashing, so fp.ja4_hash is stable and the value that matches your live capture.

Capturing a fingerprint from a live ClientHello

If you have raw ClientHello bytes (e.g. captured via tcpdump, mitmproxy, or a custom TLS trap), you can rebuild a Fingerprint from them and feed it back into a context:

from utls import Fingerprint, SSLContext

raw = open("clienthello.bin", "rb").read()
fp = Fingerprint.from_capture(raw)
print(fp.ja4_hash)

ctx = SSLContext()
ctx.set_fingerprint(fp)

Captured fingerprints carry no HTTP headers (fp.http_headers == {}); they only encode the TLS layer. To round-trip a full profile, use fp.to_dict() + Fingerprint.from_dict(...) and add http_headers manually.

Server-side and impersonation

set_fingerprint on a server-side context raises at the Rust level. The ClientHello is, by definition, the client's choice; a server-side fingerprint would be meaningless on the wire. Server contexts can still inspect the peer ClientHello for diagnostics (see the Server-side section below).

Encrypted Client Hello (ECH)

Chrome profiles ship with ECH GREASE enabled by default, matching real Chrome. To offer real ECH - encrypting the inner ClientHello (including the real SNI) under the server's published HPKE config - fork a per-peer context carrying the wire-format ECHConfigList bytes:

import utls, socket

base = utls.SSLContext()
base.load_default_certs()
base.set_fingerprint("chrome:stable")

# ECH configs are peer-specific* - each origin publishes its own in a DNS
# HTTPS RR. `set_ech_configs` is non-mutating: it returns a NEW SSLContext
# that shares the underlying SSL_CTX (and CA store) with `base` via
# SSL_CTX_up_ref, so the fork is cheap. `base` is untouched and can be
# re-forked for other peers.
ech_bytes = ...  # you are responsible to get it yourself!
ctx = base.set_ech_configs(ech_bytes)

with socket.create_connection(("example.com", 443)) as raw:
    ssl_sock = ctx.wrap_socket(raw, server_hostname="example.com")
    ssl_sock.do_handshake()

utls does not perform the DNS HTTPS RR lookup; the caller fetches the ech= bytes (e.g. via dnspython's HTTPS rdata). Pass None to clear the ECH override in the fork.

Niquests or urllib3-future does ECH transparently via a custom resolver (E.g. DNS over HTTPS) No effort required.

Feature parity with stdlib

utls re-exports the public names of the ssl module that matter for client and server code paths. The Python facade is a real subclass of ssl.SSLContext, so isinstance(ctx, ssl.SSLContext) is true and most downstream libraries (urllib3-future, niquests, httpx with custom transports) accept a utls context directly.

What's different from ssl:

  • TLS 1.2 is the minimum version. SSLv2, SSLv3, TLS 1.0 and TLS 1.1 are not available - BoringSSL refuses to negotiate them (No decent client out there should try < TLS 1.2).
  • Hostname verification uses SAN only, never the Common Name.
  • compression() always returns None (TLS compression is disabled, as it should be - BoringSSL doesn't ship it - as anyone should).
  • PSK callbacks are not available - BoringSSL deleted them upstream.
  • A Fingerprint API exists and is honored on the client side. Server-side set_fingerprint rejects at the Rust level: the ClientHello is the client's choice, not the server's.

Server-side

Server-side TLS is supported for everything BoringSSL still exposes:

  • mTLS (client certificate auth via verify_mode=CERT_REQUIRED),
  • ALPN selection from a server preference list,
  • SNI dispatch via set_servername_callback,
  • ECDH curve restriction (set_ecdh_curve),
  • Session ticket count (set_num_tickets),
  • set_session_id_context,
  • Server-side ClientHello fingerprinting (read-only diagnostics).

Things you can't have on the server side because BoringSSL doesn't have them: DTLS, FFDHE parameters, SSLv2/SSLv3, TLS compression, PSK.

urllib3-future / niquests

utls is automatically picked up if installed. enjoy.

Disclaimer

Early/Beta project. The public API is stable; we do not plan to diverge from stdlib for the ssl-compatible subset. Not pure Python - you need either a pre-built wheel or a build environment (Rust + cmake + ninja + Go for BoringSSL).

MIT-licensed (see LICENSE). BoringSSL is permissively licensed; boring-sys is Apache-2.0 - bundled into the wheel.

  • FIPS mode is not on the roadmap.
  • Chrome only. Firefox / Safari / Edge are unlikely. Thus, contribution are welcomed.
  • PyPy is not supported.

Throughput is on par with stdlib ssl: ~343 MiB/s for bulk recv vs. stdlib's 340 MiB/s on a loopback TLS 1.3 / AES-256-GCM connection. (yes, it is faster than rtls!)

Contributions, bug reports and feedback are welcome.

Versioning

This project uses CalVer (YYYY.0M.0D). It aims to be a drop-in replacement for stdlib ssl, so semantic versioning would be misleading - pin a lower bound, not an upper bound.

Prior art

  • rtls - same drop-in approach over rustls. utls's MemoryBIO-first design and read-batching pass are directly inspired by it; many of the compatibility tests were ported from there.
  • uTLS - the reference Go-language TLS fingerprinting library. The spec data encoded in our Chrome profiles is checked against uTLS's published ClientHellos.
  • curl-impersonate - the original "browser-on-the-wire" project. utls aims to give Python the same capability without a non-native Python http client or a patched BoringSSL.

JA4 pinning

The JA4 fingerprint algorithm is pinned to FoxIO-LLC/ja4 spec revision 0.18.8. The constant is duplicated in python/utls/_fingerprint.py (JA4_SPEC_VERSION) and crates/utls-core/src/fingerprint/ja4.rs, and a dedicated CI job asserts they agree.

Documentation

For the ssl-compatible surface, the stdlib documentation at https://docs.python.org/3/library/ssl.html applies almost verbatim - the notable exceptions are listed under Feature parity with stdlib.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xutls-2026.9.7.tar.gz (120.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

xutls-2026.9.7-cp314-cp314t-win_arm64.whl (1.2 MB view details)

Uploaded CPython 3.14tWindows ARM64

xutls-2026.9.7-cp314-cp314t-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.14tWindows x86-64

xutls-2026.9.7-cp314-cp314t-win32.whl (1.1 MB view details)

Uploaded CPython 3.14tWindows x86

xutls-2026.9.7-cp314-cp314t-musllinux_1_1_x86_64.whl (8.1 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ x86-64

xutls-2026.9.7-cp314-cp314t-musllinux_1_1_armv7l.whl (7.5 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ ARMv7l

xutls-2026.9.7-cp314-cp314t-musllinux_1_1_aarch64.whl (7.8 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ ARM64

xutls-2026.9.7-cp314-cp314t-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ ARM64

xutls-2026.9.7-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

xutls-2026.9.7-cp314-cp314t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl (2.4 MB view details)

Uploaded CPython 3.14tmacOS 10.15+ universal2 (ARM64, x86-64)macOS 10.15+ x86-64macOS 11.0+ ARM64

xutls-2026.9.7-cp313-cp313t-win_arm64.whl (1.2 MB view details)

Uploaded CPython 3.13tWindows ARM64

xutls-2026.9.7-cp313-cp313t-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.13tWindows x86-64

xutls-2026.9.7-cp313-cp313t-win32.whl (1.1 MB view details)

Uploaded CPython 3.13tWindows x86

xutls-2026.9.7-cp313-cp313t-musllinux_1_1_x86_64.whl (8.1 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.1+ x86-64

xutls-2026.9.7-cp313-cp313t-musllinux_1_1_armv7l.whl (7.5 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.1+ ARMv7l

xutls-2026.9.7-cp313-cp313t-musllinux_1_1_aarch64.whl (7.8 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.1+ ARM64

xutls-2026.9.7-cp313-cp313t-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.28+ ARM64

xutls-2026.9.7-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ x86-64

xutls-2026.9.7-cp313-cp313t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl (2.4 MB view details)

Uploaded CPython 3.13tmacOS 10.15+ universal2 (ARM64, x86-64)macOS 10.15+ x86-64macOS 11.0+ ARM64

xutls-2026.9.7-cp37-abi3-win_arm64.whl (1.2 MB view details)

Uploaded CPython 3.7+Windows ARM64

xutls-2026.9.7-cp37-abi3-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.7+Windows x86-64

xutls-2026.9.7-cp37-abi3-win32.whl (1.1 MB view details)

Uploaded CPython 3.7+Windows x86

xutls-2026.9.7-cp37-abi3-musllinux_1_1_x86_64.whl (8.1 MB view details)

Uploaded CPython 3.7+musllinux: musl 1.1+ x86-64

xutls-2026.9.7-cp37-abi3-musllinux_1_1_armv7l.whl (7.5 MB view details)

Uploaded CPython 3.7+musllinux: musl 1.1+ ARMv7l

xutls-2026.9.7-cp37-abi3-musllinux_1_1_aarch64.whl (7.8 MB view details)

Uploaded CPython 3.7+musllinux: musl 1.1+ ARM64

xutls-2026.9.7-cp37-abi3-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.7+manylinux: glibc 2.28+ ARM64

xutls-2026.9.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ x86-64

xutls-2026.9.7-cp37-abi3-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl (2.4 MB view details)

Uploaded CPython 3.7+macOS 10.15+ universal2 (ARM64, x86-64)macOS 10.15+ x86-64macOS 11.0+ ARM64

File details

Details for the file xutls-2026.9.7.tar.gz.

File metadata

  • Download URL: xutls-2026.9.7.tar.gz
  • Upload date:
  • Size: 120.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xutls-2026.9.7.tar.gz
Algorithm Hash digest
SHA256 0a4989cf18dbf019298e1e832f727c1db1ab13f104cbab156dca9b4936b8276e
MD5 d384f67db7213c47ed0685a8fda8c5e9
BLAKE2b-256 745f08df179a9cb607237fc060b5a80fc0f4e0d2ab71ebb417096a49e5e478b4

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp314-cp314t-win_arm64.whl.

File metadata

  • Download URL: xutls-2026.9.7-cp314-cp314t-win_arm64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.14t, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xutls-2026.9.7-cp314-cp314t-win_arm64.whl
Algorithm Hash digest
SHA256 5500c550d1bfd977e917ba8cd47c46a741f34b918a6fa24c68acd7937ffbf125
MD5 ea2b038cecd9b3081b1698ba831b8955
BLAKE2b-256 7595703e015ca474b17e4e90d847decd0d26dd7fdc4a5eab716670ab10aa726a

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp314-cp314t-win_amd64.whl.

File metadata

  • Download URL: xutls-2026.9.7-cp314-cp314t-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.14t, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xutls-2026.9.7-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 eff2dfec78a5ec228baad30147d80e7c2fb87d7452d55601837335504cd7d28d
MD5 95a164f50f064be85ed03a13f22ee1f9
BLAKE2b-256 b788f664ae4818d9f223bd26b8feb45c9e7e14cfe3d37db505aa9d7caaba5d25

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp314-cp314t-win32.whl.

File metadata

  • Download URL: xutls-2026.9.7-cp314-cp314t-win32.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.14t, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xutls-2026.9.7-cp314-cp314t-win32.whl
Algorithm Hash digest
SHA256 f0f93643781d04319c020928b3f85d32721b49ee91922dfe644189d343865d56
MD5 9ed4fd8cc14c080f39bbbfc3dc8d432e
BLAKE2b-256 70469f2c08d8c7badad7c7dfa3421f44bc2d0cad379d1dc54668e3c95f504f85

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp314-cp314t-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp314-cp314t-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 a303711d95edf1aa4b82ed48e48a54950b70ab1675f28e83ef8384b7630f027f
MD5 684ea4acaef192e2a1fd8589920e8904
BLAKE2b-256 cd85c9f71be3271a30698e444f881363934109773c6f794a450b9574d542f3ad

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp314-cp314t-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp314-cp314t-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 86ddf6a529f66ce7b3393e9993967dc3cfa58060e3c85d53db4d1746888d7d2f
MD5 639fa20d4c0c9ca070b90c8cf842a559
BLAKE2b-256 d9ec14db3851f11574ee7f922adb27a9276066b772c5cced4d7329fc080aea3d

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp314-cp314t-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp314-cp314t-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 b7d0e0751cbf1b3ae1e83120b58e46dfe84dd9446b76822edb70d98a7d507d7f
MD5 639f7833ee768bc33b639f1e7796f281
BLAKE2b-256 df2ad340a49bae7aa80541c04415b0a97e795e74ea2c6e0b248c747e63ecd4af

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp314-cp314t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp314-cp314t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5694be54b28fa6149b63115e75018bdaba61ca049207f605cebb5da310ebafe6
MD5 d986e60dc6f4a17874655659d5eb0513
BLAKE2b-256 95dd27cf141372acc5026c544270ffa929ffac21787354f23a2dcf253631cc5a

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 20ced0485e176425de239e82cd468999c0b7f889a24943c575ad3843beae24d4
MD5 2d0b6e2f6e44fced2edd50a1ad60e403
BLAKE2b-256 c06a1ed774be76e668646a72369d187197130e4c2f679acd8b7580280771b0e5

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp314-cp314t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp314-cp314t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 86cff690393b057ffae8c9a56ddcb750b5f00b36c02e381cf32225da78da6cd5
MD5 04c88d19e02cc67561845e50113c884d
BLAKE2b-256 62beecc4ce9d1511b1c97fdbcfc06d8e3d3d9e62f4e6d31414f789a2934e42a8

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp313-cp313t-win_arm64.whl.

File metadata

  • Download URL: xutls-2026.9.7-cp313-cp313t-win_arm64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.13t, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xutls-2026.9.7-cp313-cp313t-win_arm64.whl
Algorithm Hash digest
SHA256 ed283e8dd7d48641395699a3ea713315d8c5a40725cde5e700fca8ba4aa5d88b
MD5 ea5bc35b749c1eaba7771c020898caa5
BLAKE2b-256 72bf01e981bb796e1416666f5dba35524070330da7527d2a1a70449a41722252

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp313-cp313t-win_amd64.whl.

File metadata

  • Download URL: xutls-2026.9.7-cp313-cp313t-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.13t, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xutls-2026.9.7-cp313-cp313t-win_amd64.whl
Algorithm Hash digest
SHA256 08b0ffaa51d28af21e1a1d76827dff624a502c65a429a446f5879e8eabaa1899
MD5 6b73051c3b9cb691f531f211988537cf
BLAKE2b-256 3014e1cdb2372c807277bbf0a042a5f053c77df3c845e89fb8c9b6cb6fa5ff46

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp313-cp313t-win32.whl.

File metadata

  • Download URL: xutls-2026.9.7-cp313-cp313t-win32.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.13t, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xutls-2026.9.7-cp313-cp313t-win32.whl
Algorithm Hash digest
SHA256 5cf489e3b979901946bcf0003e49502c3020f0ceb35df95d6882a4f9ae6da4ad
MD5 d0c64ecfb5724f46d6516b998d29f37b
BLAKE2b-256 ab45225f604440ad0f7ec6d8ad057fd2451fe9180bb18202e5fbe1a7c7e62512

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp313-cp313t-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp313-cp313t-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 0c8d803938f4de9d01e1445fa09b0199d1327d41ddfc312a4dfe697f34828b98
MD5 17a7f9d2e175f4200005fbd6a144831e
BLAKE2b-256 ebfbf621f41b2be48a149032249bc0c27941c673f6f839d7671a2c22ae878781

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp313-cp313t-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp313-cp313t-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 27c3c19d6d5cafeab46257268280b2c2ab3fdc1d072cfa9811b83f5446f1c718
MD5 030200a496346277e62cafdae89b5c2e
BLAKE2b-256 daf29cf3364b219e4976c7b03cfb565beb172fed8c0887221270d854f235c758

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp313-cp313t-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp313-cp313t-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 518c5d52e9dd0455b4ccda7b8b1827fdc3a363866adec17681b74fe740283fd4
MD5 1432319333b8a393e286960554369370
BLAKE2b-256 0275e8f01248d1bdc41b62aff0e996cf3ff028bd92f41168a6ed43f490c955db

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp313-cp313t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp313-cp313t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3324fd3943c056c1715b17ba7ce1de55c399e8e180f1db00c622adf7ab21b401
MD5 9cb3b5f27e46b373314d40a237f63799
BLAKE2b-256 7787cc989328cd4369e9c85ddcddf36c56e6842a25b82590039bf496c3f7583f

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 562b7742007a02d6cc2ce489752b12bccb8fbcb4f9022e8a9397bc8487fe8519
MD5 136fa69ded02817419aa181a2247f0b9
BLAKE2b-256 8747bef841c82dcbc6e74a6e15d11dde90ee93826b434a53d643fcbb4dc7ef55

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp313-cp313t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp313-cp313t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 9ca1f0593665a2d72eda532e9da5e5c9f7c56ba24d61da0a1f16138989f905d2
MD5 cd33915c7b8c341d026f2c6f42b48b93
BLAKE2b-256 c6221e1fdd5a1fed9073c10f7e942627edf566346488bf6daa92cd9d8aae8b7a

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp37-abi3-win_arm64.whl.

File metadata

  • Download URL: xutls-2026.9.7-cp37-abi3-win_arm64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.7+, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xutls-2026.9.7-cp37-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 cd2882a97436bd961ee6436a357c829a63dfb167ec614eef6b8765d62dd133ad
MD5 1975d86f80001144ac9a5b6304351f7e
BLAKE2b-256 7bf1308593916c8bd187e5bb73e6c37d0375a79ccf2dc665bb71af6e90506b90

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp37-abi3-win_amd64.whl.

File metadata

  • Download URL: xutls-2026.9.7-cp37-abi3-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.7+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xutls-2026.9.7-cp37-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 b162c294bb068f5ec875e3d23af3cb7c6703b364c0ac8c1ef9a6db932facf25a
MD5 019f93da4a5b548c9e9ccc8cac1fb9d6
BLAKE2b-256 6f9f6c9981ba992002c5cffe4aeed18ce33a7d70ebf9ef29902edc0dc2eaa2b5

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp37-abi3-win32.whl.

File metadata

  • Download URL: xutls-2026.9.7-cp37-abi3-win32.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.7+, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xutls-2026.9.7-cp37-abi3-win32.whl
Algorithm Hash digest
SHA256 2aad6238a2ab2770a85451241c5f41306fe08c85633e0fe5cae1e14de04f7355
MD5 9d8964654a5fd13e9bee41c0e6f798fb
BLAKE2b-256 2e25887138e8a70d9c5d483920a43e78357a747c957a0d468815d347c17a3ae0

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp37-abi3-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp37-abi3-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 a874df69026a47c35a37e83aec0a5951cd088bcd4ef04a024b54003651b9fae7
MD5 10aaa3b2b563a6e356838071bb9fd180
BLAKE2b-256 63d4bbabbf620517fa18967365d95eebcaa241fdecb14e5235b7d5e4971fbf0f

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp37-abi3-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp37-abi3-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 966d2e65c33b2b41b6cc62adde5ea949fc58dd86d4c1f649fa248bafbdab4916
MD5 e9d1cd1116de8ec828780f2181731cbe
BLAKE2b-256 ff10efa1a768fdc5b70f0c36d0cab5c7fce1e1e13ce9b3be6dd720ae8502eb0d

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp37-abi3-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp37-abi3-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 d42d12dc30cb598e4db02041d71821d2eba66c3bc52d2cbdb50166bf07e0c653
MD5 a443c0cc5c83feb4b45d3eb8659c3295
BLAKE2b-256 8f6b876bceb1145342c82a484c65d58885dbcf1e286874530f07bf0f8246a267

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp37-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp37-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2cd64b4909bff52cca658a4cebae1f824b5adc47a95e707818dc5e3d7565697a
MD5 13edfbe65e7e0f250d05d40fd4db2e92
BLAKE2b-256 9695f6f094bd455c458bd878662df00b66b379392ff179fce6029212153cbf2d

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dccd1cc5d31b254c320d5d292edd1d88a22d535ac96a2d5a5d31d1f24e0c2abb
MD5 d3887bb4bcd5bb78602f18c93703bd07
BLAKE2b-256 8cd1ccb4326b2f8a8dc5cf0f407c022a3e8f5b58cd7ba654e60e6d7191ce3267

See more details on using hashes here.

File details

Details for the file xutls-2026.9.7-cp37-abi3-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for xutls-2026.9.7-cp37-abi3-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 50a0c92e90f73707828298acb2a22c800604141ee1a96283eb418d6d5c8ea17a
MD5 fce21a2688174035bf53702caa6a17b0
BLAKE2b-256 785527d9ad52f56a97c69a234289468893d172e84bea2dfbb9349622b18b8562

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

2026.9.7 This release

28 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page