curl-impersonate
curl-impersonate copied to clipboard
add dart:io TLS targets
fairly popular client within mobile apps, due to Flutter widespread. should also be easy to implement in curl-impersonate:
- uses BoringSSL,
- HTTP/2 fingerprinting not applicable (HTTP/1.1 only),
- straightforward headers
https://api.dart.dev/stable/2.19.5/dart-io/HttpClient-class.html
example request from my machine (code: https://gist.github.com/selfisekai/37b88bf0c08e7e0772201f22f956ada6)
{
"http_version": "HTTP/1.1",
"method": "GET",
"tls": {
"ciphers": [
"TLS_AES_128_GCM_SHA256",
"TLS_AES_256_GCM_SHA384",
"TLS_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_RSA_WITH_AES_128_GCM_SHA256",
"TLS_RSA_WITH_AES_256_GCM_SHA384",
"TLS_RSA_WITH_AES_128_CBC_SHA",
"TLS_RSA_WITH_AES_256_CBC_SHA",
"TLS_RSA_WITH_3DES_EDE_CBC_SHA"
],
"extensions": [
{
"name": "server_name (0)",
"server_name": "tls.peet.ws"
},
{
"name": "extended_master_secret (23)",
"master_secret_data": "",
"extended_master_secret_data": ""
},
{
"name": "extensionRenegotiationInfo (boringssl) (65281)",
"data": "00"
},
{
"name": "supported_groups (10)",
"supported_groups": [
"X25519 (29)",
"P-256 (23)",
"P-384 (24)"
]
},
{
"name": "ec_point_formats (11)",
"elliptic_curves_point_formats": [
"0x00"
]
},
{
"name": "session_ticket (35)",
"data": ""
},
{
"name": "signature_algorithms (13)",
"signature_algorithms": [
"ecdsa_secp256r1_sha256",
"rsa_pss_rsae_sha256",
"rsa_pkcs1_sha256",
"ecdsa_secp384r1_sha384",
"rsa_pss_rsae_sha384",
"rsa_pkcs1_sha384",
"rsa_pss_rsae_sha512",
"rsa_pkcs1_sha512",
"rsa_pkcs1_sha1"
]
},
{
"name": "key_share (51)",
"shared_keys": [
{
"X25519 (29)": "4b88967eb4c83ab234979bdf189976242dc9115514fda08565503eab6ea97838"
}
]
},
{
"name": "psk_key_exchange_modes (45)",
"PSK_Key_Exchange_Mode": "PSK with (EC)DHE key establishment (psk_dhe_ke) (1)"
},
{
"name": "supported_versions (43)",
"versions": [
"TLS 1.3",
"TLS 1.2"
]
}
],
"tls_version_record": "771",
"tls_version_negotiated": "772",
"ja3": "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49161-49171-49162-49172-156-157-47-53-10,0-23-65281-10-11-35-13-51-45-43,29-23-24,0",
"ja3_hash": "c318b1ae5d7abaaa0265af514737f2b8",
"peetprint (WIP)": "772-771||29-23-24|1027-2052-1025-1283-2053-1281-2054-1537-513|1||4865-4866-4867-49195-49199-49196-49200-52393-52392-49161-49171-49162-49172-156-157-47-53-10|0-23-65281-10-11-35-13-51-45-43",
"peetprint_hash (WIP)": "67e7ec4bbf1db8eaec612fe560f91274",
"client_random": "70c188fe24fa4411af6721357bb8caaa986314ebdb5078216655d3327a2934d1",
"session_id": "ba2025cf92241d7f3c83989766b3d95a25eb27e72d2eb94a3b55cda0e7dddf20"
},
"http1": {
"headers": [
"user-agent: Dart/2.19 (dart:io)",
"accept-encoding: gzip",
"host: tls.peet.ws"
]
}
}