1*1c60b9acSAndroid Build Coastguard Worker# JIT trust 2*1c60b9acSAndroid Build Coastguard Worker 3*1c60b9acSAndroid Build Coastguard Worker 4*1c60b9acSAndroid Build Coastguard Worker 5*1c60b9acSAndroid Build Coastguard Worker## Background 6*1c60b9acSAndroid Build Coastguard Worker 7*1c60b9acSAndroid Build Coastguard WorkerMost systems using openssl rely on a system trust bundle that openssl was 8*1c60b9acSAndroid Build Coastguard Workercompiled to load at library init. This is a bit expensive, since it 9*1c60b9acSAndroid Build Coastguard Workerinstantiates over 120 CA X.509 certs, but most modern Linux systems don't really 10*1c60b9acSAndroid Build Coastguard Workernotice the permanent use of 1MB or so of heap from init, the advantage is client 11*1c60b9acSAndroid Build Coastguard Workerconnections have all the trusted root certs available in memory to perform 12*1c60b9acSAndroid Build Coastguard Workervalidation. 13*1c60b9acSAndroid Build Coastguard Worker 14*1c60b9acSAndroid Build Coastguard Worker 15*1c60b9acSAndroid Build Coastguard Worker 16*1c60b9acSAndroid Build Coastguard WorkerFor the kind of systems that choose mbedtls, they will typically either be 17*1c60b9acSAndroid Build Coastguard Workerburdened by or not even have enough ram to take this approach. 18*1c60b9acSAndroid Build Coastguard Worker 19*1c60b9acSAndroid Build Coastguard WorkerIf the device only connects to endpoints that are signed by a specific 20*1c60b9acSAndroid Build Coastguard WorkerCA, you can just prepare the connection with the known trusted CA, that's 21*1c60b9acSAndroid Build Coastguard Workerthe approach the examples take. This method should still be used for critical 22*1c60b9acSAndroid Build Coastguard Workerconnections to the cloud, for example provide the necessary CA cert in the 23*1c60b9acSAndroid Build Coastguard WorkerSecure Streams policy, or at vhost creation time. 24*1c60b9acSAndroid Build Coastguard Worker 25*1c60b9acSAndroid Build Coastguard Worker 26*1c60b9acSAndroid Build Coastguard Worker 27*1c60b9acSAndroid Build Coastguard WorkerHowever if you also have a browser type application that could connect anywhere, 28*1c60b9acSAndroid Build Coastguard Workerbut you don't have heap spare to preload all the CAs, you need something like 29*1c60b9acSAndroid Build Coastguard Worker"JIT trust". 30*1c60b9acSAndroid Build Coastguard Worker 31*1c60b9acSAndroid Build Coastguard Worker## JIT trust overview 32*1c60b9acSAndroid Build Coastguard Worker 33*1c60b9acSAndroid Build Coastguard WorkerThe basic approach is to connect to the server to retrieve its certificates, 34*1c60b9acSAndroid Build Coastguard Workerthen study the certificates to determine the identity of the missing trusted 35*1c60b9acSAndroid Build Coastguard Workercert we should be trying to validate with. 36*1c60b9acSAndroid Build Coastguard Worker 37*1c60b9acSAndroid Build Coastguard Worker 38*1c60b9acSAndroid Build Coastguard Worker 39*1c60b9acSAndroid Build Coastguard WorkerWe attempt to get the trusted cert from some local or remote store, and retry 40*1c60b9acSAndroid Build Coastguard Workerthe connection having instantiated the missing CA cert as trusted for that 41*1c60b9acSAndroid Build Coastguard Workerconnection, if it is one that we do actually trust. If it lies about what CA it 42*1c60b9acSAndroid Build Coastguard Workerneeds to validate, or we do not trust the one it asks for, subsequent 43*1c60b9acSAndroid Build Coastguard Workerconnections will fail. 44*1c60b9acSAndroid Build Coastguard Worker 45*1c60b9acSAndroid Build Coastguard WorkerIf it asked for a trusted CA that we trust, and the relationship was valid, the 46*1c60b9acSAndroid Build Coastguard Workertls negotiation should then complete successfully, and we can cache the CA cert 47*1c60b9acSAndroid Build Coastguard Workerand the host -> CA cert pre-trust requirement so future connections can work 48*1c60b9acSAndroid Build Coastguard Workerfirst time. 49*1c60b9acSAndroid Build Coastguard Worker 50*1c60b9acSAndroid Build Coastguard Worker## Subject Key Id and Authority Key Id 51*1c60b9acSAndroid Build Coastguard Worker 52*1c60b9acSAndroid Build Coastguard WorkerAll of the certificates publish a unique-enough personal "Subject Key ID" or 53*1c60b9acSAndroid Build Coastguard WorkerSKID blob. These are typically 20-byte hashes based on the cert public key. 54*1c60b9acSAndroid Build Coastguard Worker 55*1c60b9acSAndroid Build Coastguard WorkerWhen a server certificate is issued by the CA, an entry is made first in the 56*1c60b9acSAndroid Build Coastguard Workercertificate noting the SKID of the certificate that will be used to sign it, 57*1c60b9acSAndroid Build Coastguard Workerin an "Authority Key ID", or AKID, extension. The certificate is then signed by 58*1c60b9acSAndroid Build Coastguard Workerthe parent certificate private key to prove it was issued by the real owner of 59*1c60b9acSAndroid Build Coastguard Workerthe CA or intermediate certificate. 60*1c60b9acSAndroid Build Coastguard Worker 61*1c60b9acSAndroid Build Coastguard Worker 62*1c60b9acSAndroid Build Coastguard Worker 63*1c60b9acSAndroid Build Coastguard WorkerBasically this AKID on a certificate is guiding the validator with 64*1c60b9acSAndroid Build Coastguard Workerinformation about which certificate it claims is next in the chain of trust 65*1c60b9acSAndroid Build Coastguard Workerleading back to a trusted CA. Lying about it doesn't help an attacker, 66*1c60b9acSAndroid Build Coastguard Workerbecause we're only using the AKID to get the CA certificate and then try to do 67*1c60b9acSAndroid Build Coastguard Workerthe full signature check using it, if it's not really signed by the AKID cert it 68*1c60b9acSAndroid Build Coastguard Workertold, or anything else wrong, the actual validation will just fail. 69*1c60b9acSAndroid Build Coastguard Worker 70*1c60b9acSAndroid Build Coastguard WorkerA chain that terminates in a CA certificate is complete, and can undergo full 71*1c60b9acSAndroid Build Coastguard Workervalidation using the tls library. 72*1c60b9acSAndroid Build Coastguard Worker 73*1c60b9acSAndroid Build Coastguard Worker## Converting the Mozilla trust bundle for JIT trust 74*1c60b9acSAndroid Build Coastguard Worker 75*1c60b9acSAndroid Build Coastguard WorkerLws provides a bash script `./scripts/mozilla-trust-gen.sh` that can fetch the 76*1c60b9acSAndroid Build Coastguard Workerlatest Mozilla CA trust bundle for certs usable for tls validation, and convert 77*1c60b9acSAndroid Build Coastguard Workerit to three different forms to allow maintaining the trust bundle in different 78*1c60b9acSAndroid Build Coastguard Workerways for different kinds of device to consume. 79*1c60b9acSAndroid Build Coastguard Worker 80*1c60b9acSAndroid Build Coastguard Worker - as a webroot directory, so you can server trusted DERs, with 81*1c60b9acSAndroid Build Coastguard Worker symlink indexes to the CA certs by SKID and issuer/serial 82*1c60b9acSAndroid Build Coastguard Worker 83*1c60b9acSAndroid Build Coastguard Worker - as an atomic binary blob, currently about 143KB, with structure 84*1c60b9acSAndroid Build Coastguard Worker at the start pointing to DER certs and indexes inside 85*1c60b9acSAndroid Build Coastguard Worker 86*1c60b9acSAndroid Build Coastguard Worker - a C-compiler friendly `uint8_t` array version of the blob, 87*1c60b9acSAndroid Build Coastguard Worker so it can be compiled into .rodata directly if necessary. 88*1c60b9acSAndroid Build Coastguard Worker 89*1c60b9acSAndroid Build Coastguard WorkerCurrently there are 128 certs in the trust bundle, and the whole blob is about 90*1c60b9acSAndroid Build Coastguard Worker143KB uncompressed. 91*1c60b9acSAndroid Build Coastguard Worker 92*1c60b9acSAndroid Build Coastguard Worker## Considerations about maintaining the trust blob 93*1c60b9acSAndroid Build Coastguard Worker 94*1c60b9acSAndroid Build Coastguard WorkerMozilla update their trust bundle at intervals, and there have been at least 95*1c60b9acSAndroid Build Coastguard Workerthree cases where they have removed or distrusted CAs from it by their own 96*1c60b9acSAndroid Build Coastguard Workerdecision, because they have issued dangerous certificates, (like one for `*` 97*1c60b9acSAndroid Build Coastguard Workerthat will validate anything at all). Certifacte owners may also revoke their 98*1c60b9acSAndroid Build Coastguard Workerown certificates for any reason and issue replacements. 99*1c60b9acSAndroid Build Coastguard Worker 100*1c60b9acSAndroid Build Coastguard WorkerThe certs in the trust bundle expire, currently 10/128 will expire within 3 101*1c60b9acSAndroid Build Coastguard Workeryears and 50/128 over the next 10 years. So new and replacement certificates 102*1c60b9acSAndroid Build Coastguard Workerare also being added at intervals. 103*1c60b9acSAndroid Build Coastguard Worker 104*1c60b9acSAndroid Build Coastguard WorkerPart of using the trust bundle is building in some way to update what is trusted 105*1c60b9acSAndroid Build Coastguard Workerover the lifetime of the device, which may exceed 10 years. 106*1c60b9acSAndroid Build Coastguard Worker 107*1c60b9acSAndroid Build Coastguard WorkerDepending on the device, it may not be any problem to keep the trust blob in the 108*1c60b9acSAndroid Build Coastguard Workerfirmware, and update the firmware ongoing every few months. So you could build 109*1c60b9acSAndroid Build Coastguard Workerit into the firmware using the C array include file (the minimal example takes 110*1c60b9acSAndroid Build Coastguard Workerthis approach). 111*1c60b9acSAndroid Build Coastguard Worker 112*1c60b9acSAndroid Build Coastguard WorkerAnother device may have difficulty updating the firmware outside of emergencies, 113*1c60b9acSAndroid Build Coastguard Workerit could keep the trust blob in a separate area and update it separately. 114*1c60b9acSAndroid Build Coastguard WorkerHaving it as a single blob makes it easy to fetch and update. 115*1c60b9acSAndroid Build Coastguard Worker 116*1c60b9acSAndroid Build Coastguard WorkerFinally constrained devices, say in ESP32 class, may not have space or desire 117*1c60b9acSAndroid Build Coastguard Workerto store the trust blob in the device at all, it could query a remote server on 118*1c60b9acSAndroid Build Coastguard Workerdemand to check for any trusted CA matching a given AKID and retrieve and cache 119*1c60b9acSAndroid Build Coastguard Workerit in volatile ram. This would use the webroot produced by the script, via tls 120*1c60b9acSAndroid Build Coastguard Workerand a fixed CA cert outside this system. 121*1c60b9acSAndroid Build Coastguard Worker 122*1c60b9acSAndroid Build Coastguard Worker## Format of the JIT trust blob 123*1c60b9acSAndroid Build Coastguard Worker 124*1c60b9acSAndroid Build Coastguard WorkerThe trust blob layout is currently 125*1c60b9acSAndroid Build Coastguard Worker 126*1c60b9acSAndroid Build Coastguard Worker``` 127*1c60b9acSAndroid Build Coastguard Worker00: 54 42 4c 42 Magic "TBLB" 128*1c60b9acSAndroid Build Coastguard Worker04: 00 01 MSB-first trust blob layout version 129*1c60b9acSAndroid Build Coastguard Worker06: XX XX MSB-first count of certificates 130*1c60b9acSAndroid Build Coastguard Worker08: XX XX XX XX MSB-first trust blob generation unix time 131*1c60b9acSAndroid Build Coastguard Worker0c: XX XX XX XX MSB-first offset from blob start of cert length table 132*1c60b9acSAndroid Build Coastguard Worker10: XX XX XX XX MSB-first offset from blob start of SKID length table 133*1c60b9acSAndroid Build Coastguard Worker14: XX XX XX XX MSB-first offset from blob start of SKID table 134*1c60b9acSAndroid Build Coastguard Worker18: XX XX XX XX MSB-first total blob length 135*1c60b9acSAndroid Build Coastguard Worker 136*1c60b9acSAndroid Build Coastguard Worker1c: XX .. XX DER certs (start at +0x1c) 137*1c60b9acSAndroid Build Coastguard Worker : XX .. XX DER cert length table (MSB-first 16-bit per cert) 138*1c60b9acSAndroid Build Coastguard Worker : XX .. XX SKID length table (8-bit per cert) 139*1c60b9acSAndroid Build Coastguard Worker : XX .. XX SKID table (variable per cert) 140*1c60b9acSAndroid Build Coastguard Worker``` 141*1c60b9acSAndroid Build Coastguard Worker 142*1c60b9acSAndroid Build Coastguard Worker## Enabling JIT Trust 143*1c60b9acSAndroid Build Coastguard Worker 144*1c60b9acSAndroid Build Coastguard Worker``` 145*1c60b9acSAndroid Build Coastguard Worker$ cmake .. -DLWS_WITH_TLS_JIT_TRUST=1 146*1c60b9acSAndroid Build Coastguard Worker``` 147*1c60b9acSAndroid Build Coastguard Worker 148*1c60b9acSAndroid Build Coastguard Worker## Minimal example for JIT Trust 149*1c60b9acSAndroid Build Coastguard Worker 150*1c60b9acSAndroid Build Coastguard Worker`minimal-examples/http-client/minimal-http-client-jit-trust` is built if JIT 151*1c60b9acSAndroid Build Coastguard WorkerTrust is enabled at cmake and `-DLWS_WITH_MINIMAL_EXAMPLES=1`. This is based on 152*1c60b9acSAndroid Build Coastguard Workerminimal-http-client, except the loading of the system trust bundle is defeated, 153*1c60b9acSAndroid Build Coastguard Workerso by default it does not trust anything and cannot complete any tls connection. 154*1c60b9acSAndroid Build Coastguard WorkerIt includes the mozilla trust blob as a header file when built. 155*1c60b9acSAndroid Build Coastguard Worker 156*1c60b9acSAndroid Build Coastguard WorkerIt tries to do an http client connection twice, the first time fails but JIT 157*1c60b9acSAndroid Build Coastguard WorkerTrust determines which trusted CA cert is missing, retreives it from the trust 158*1c60b9acSAndroid Build Coastguard Workerblob and creates the necessary temporary vhost with the correct CA cert(s) 159*1c60b9acSAndroid Build Coastguard Workertrusted. On the next retry, the connection succeeds. 160*1c60b9acSAndroid Build Coastguard Worker 161*1c60b9acSAndroid Build Coastguard Worker## Processing of x509 AKID and SKIDs 162*1c60b9acSAndroid Build Coastguard Worker 163*1c60b9acSAndroid Build Coastguard WorkerWe study each x509 cert sent by the server in turn. We parse out the SKID and 164*1c60b9acSAndroid Build Coastguard WorkerAKID on each one and stash them (up to 4 deep). 165*1c60b9acSAndroid Build Coastguard Worker 166*1c60b9acSAndroid Build Coastguard WorkerAfter the initial validation fails due to lack of any trusted CA, lws has 167*1c60b9acSAndroid Build Coastguard Workercollected all the AKID and SKIDs that were in certs sent by the server. Since 168*1c60b9acSAndroid Build Coastguard Workerthese may be sent in any order, may be malicious, and may even contain the 169*1c60b9acSAndroid Build Coastguard Worker(untrusted) root CA, they are sorted into a trust path using the AKID and SKID 170*1c60b9acSAndroid Build Coastguard Workerrelationships. 171*1c60b9acSAndroid Build Coastguard Worker 172*1c60b9acSAndroid Build Coastguard WorkerTo cover cross-signing and cases where the root cert(s) were wrongly sent by 173*1c60b9acSAndroid Build Coastguard Workera misconfigured server, all of the AKIDs in the stash are queried against the 174*1c60b9acSAndroid Build Coastguard Workertrusted CA store. In cross-signing, multiple intermediates are provided with 175*1c60b9acSAndroid Build Coastguard Workerthe same SKID, that all match the server certificate AKID parent. Since we 176*1c60b9acSAndroid Build Coastguard Workermight meet certificates that trust multiple valid CAs that can validate the 177*1c60b9acSAndroid Build Coastguard Workercertificate, we support up to three CA certs imported. 178*1c60b9acSAndroid Build Coastguard Worker 179*1c60b9acSAndroid Build Coastguard WorkerA user `lws_system_ops` handler performs the query, so it can consist of any 180*1c60b9acSAndroid Build Coastguard Workerkind of backing store or remote lookup. Helpers are provided to query the JIT 181*1c60b9acSAndroid Build Coastguard Workertrust mozilla blob, so the system helper is small in the typical case, just 182*1c60b9acSAndroid Build Coastguard Workercalling lws helpers. 183*1c60b9acSAndroid Build Coastguard Worker 184*1c60b9acSAndroid Build Coastguard WorkerThe results (up to three CA certs to account for cross-signing scenarios) are 185*1c60b9acSAndroid Build Coastguard Workercollected and a 1hr TTL cache entry made for the hostname and the SKIDs of the 186*1c60b9acSAndroid Build Coastguard Workermatched CAs, if there is no existing JIT vhost with its tls context configured 187*1c60b9acSAndroid Build Coastguard Workerwith the needed trusted CAs, one is created. 188*1c60b9acSAndroid Build Coastguard Worker 189*1c60b9acSAndroid Build Coastguard WorkerWhen the connection is retried, lws checks the cache for the hostname having 190*1c60b9acSAndroid Build Coastguard Workera binding to an existing JIT vhost, if that exists the connection proceeds 191*1c60b9acSAndroid Build Coastguard Workerbound to that. If there is a cache entry but no JIT vhost, one is created using 192*1c60b9acSAndroid Build Coastguard Workerthe information in the cache entry. 193*1c60b9acSAndroid Build Coastguard Worker 194*1c60b9acSAndroid Build Coastguard Worker## Efficiency considerations 195*1c60b9acSAndroid Build Coastguard Worker 196*1c60b9acSAndroid Build Coastguard WorkerFrom cold, the JIT Trust flow is 197*1c60b9acSAndroid Build Coastguard Worker 198*1c60b9acSAndroid Build Coastguard Worker1. A sacrificial connection is made to get the server certs 199*1c60b9acSAndroid Build Coastguard Worker2. Query the JIT Trust database for AKIDs mentioned in the certs (this may be 200*1c60b9acSAndroid Build Coastguard Workerdone asynchronously) 201*1c60b9acSAndroid Build Coastguard Worker3. Create a temporary vhost with the appropriate trusted certs enabled in it, 202*1c60b9acSAndroid Build Coastguard Worker and add an entry in the cache for this hostname to the SKIDs of the CAs 203*1c60b9acSAndroid Build Coastguard Worker enabled on this temporary vhost 204*1c60b9acSAndroid Build Coastguard Worker4. Retry, querying the cache to bind the connection to the right temporary vhost 205*1c60b9acSAndroid Build Coastguard Worker 206*1c60b9acSAndroid Build Coastguard WorkerAn lws_cache in heap is maintained so step 1 can be skipped while hostname-> 207*1c60b9acSAndroid Build Coastguard WorkerSKID items exist in the cache. If the items expire or are evicted, it just 208*1c60b9acSAndroid Build Coastguard Workermeans we have to do step 1 again. 209*1c60b9acSAndroid Build Coastguard Worker 210*1c60b9acSAndroid Build Coastguard WorkerFor a short time, the vhost created in step 3 is allowed to exist when idle, ie 211*1c60b9acSAndroid Build Coastguard Workerwhen no connections are actively using it. In the case the vhost exists and 212*1c60b9acSAndroid Build Coastguard Workerthe cache entry exists for the hostname, the connection can proceed successfully 213*1c60b9acSAndroid Build Coastguard Workerright away without steps 1 through 3. 214*1c60b9acSAndroid Build Coastguard Worker 215*1c60b9acSAndroid Build Coastguard Worker## APIs related to JIT Trust 216*1c60b9acSAndroid Build Coastguard Worker 217*1c60b9acSAndroid Build Coastguard WorkerSystems that support JIT trust define an `lws_system_ops` callback 218*1c60b9acSAndroid Build Coastguard Workerthat does whatever the system needs to do for attempting to acquire 219*1c60b9acSAndroid Build Coastguard Workera trusted cert with a specified SKID or issuer/serial. 220*1c60b9acSAndroid Build Coastguard Worker 221*1c60b9acSAndroid Build Coastguard Worker``` 222*1c60b9acSAndroid Build Coastguard Workerint (*jit_trust_query)(struct lws_context *cx, const uint8_t *skid, size_t skid_len, void *got_opaque); 223*1c60b9acSAndroid Build Coastguard Worker``` 224*1c60b9acSAndroid Build Coastguard Worker 225*1c60b9acSAndroid Build Coastguard WorkerThe ops handler doesn't have to find the trusted cert immediately before 226*1c60b9acSAndroid Build Coastguard Workerreturning, it is OK starting the process and later if successful calling a 227*1c60b9acSAndroid Build Coastguard Workerhelper `lws_tls_jit_trust_got_cert_cb()` with the `got_opaque` from the query. 228*1c60b9acSAndroid Build Coastguard WorkerThis will cache the CA cert so it's available at the next connection retry for 229*1c60b9acSAndroid Build Coastguard Workerpreloading. 230*1c60b9acSAndroid Build Coastguard Worker 231*1c60b9acSAndroid Build Coastguard WorkerAn helper suitable for `ops->jit_trust_query` using trust blob lookup in .rodata 232*1c60b9acSAndroid Build Coastguard Workeris provided in `lws_tls_jit_trust_blob_queury_skid()`, the callback above should 233*1c60b9acSAndroid Build Coastguard Workerbe called with its results as shown in the minimal example. 234*1c60b9acSAndroid Build Coastguard Worker 235*1c60b9acSAndroid Build Coastguard Worker## Runtime tuning for JIT Trust 236*1c60b9acSAndroid Build Coastguard Worker 237*1c60b9acSAndroid Build Coastguard WorkerThe context creation info struct has a couple of runtime-tunable settings 238*1c60b9acSAndroid Build Coastguard Workerrelated to JIT Trust. 239*1c60b9acSAndroid Build Coastguard Worker 240*1c60b9acSAndroid Build Coastguard Worker`.jitt_cache_max_footprint`: default 0 means no limit, otherwise the hostname-> 241*1c60b9acSAndroid Build Coastguard WorkerSKID cache is kept below this many bytes in heap, by evicting LRU entries. 242*1c60b9acSAndroid Build Coastguard Worker 243*1c60b9acSAndroid Build Coastguard Worker`.vh_idle_grace_ms`: default 0 means 5000ms, otherwise sets the length of time 244*1c60b9acSAndroid Build Coastguard Workera JIT Trust vhost is allowed to exist when it has no connections using it. 245*1c60b9acSAndroid Build Coastguard WorkerNotice that, eg, h2 connections have their own grace period when they become 246*1c60b9acSAndroid Build Coastguard Workeridle, to optimize reuse, this period does not start until any h2 network 247*1c60b9acSAndroid Build Coastguard Workerconnection bound to the vhost has really closed. 248*1c60b9acSAndroid Build Coastguard Worker 249*1c60b9acSAndroid Build Coastguard Worker## Considerations around http redirects 250*1c60b9acSAndroid Build Coastguard Worker 251*1c60b9acSAndroid Build Coastguard WorkerHTTP redirects are transactions that tell the client to go somewhere else to 252*1c60b9acSAndroid Build Coastguard Workercontinue, typically a 301 response with a Location: header explaining where to 253*1c60b9acSAndroid Build Coastguard Workergo. 254*1c60b9acSAndroid Build Coastguard Worker 255*1c60b9acSAndroid Build Coastguard WorkerJIT Trust supports redirects to hosts with the same or different trust 256*1c60b9acSAndroid Build Coastguard Workerrequirements, each step in the redirect is treated as a new connection that will 257*1c60b9acSAndroid Build Coastguard Workerfail, try to create a vhost with the right trust and work on the retry. 258*1c60b9acSAndroid Build Coastguard Worker 259*1c60b9acSAndroid Build Coastguard WorkerLws rejects by default protocol downgrades (https -> http) on redirects, the 260*1c60b9acSAndroid Build Coastguard Workerexample used a context option `LCCSCF_ACCEPT_TLS_DOWNGRADE_REDIRECTS` to 261*1c60b9acSAndroid Build Coastguard Workeroverride this. 262*1c60b9acSAndroid Build Coastguard Worker 263*1c60b9acSAndroid Build Coastguard Worker## Works out of the box on recent mbedtls and openssl 264*1c60b9acSAndroid Build Coastguard Worker 265*1c60b9acSAndroid Build Coastguard WorkerNo modifications are needed to either tls library. 266*1c60b9acSAndroid Build Coastguard Worker 267*1c60b9acSAndroid Build Coastguard Worker## Compatibility Testing 268*1c60b9acSAndroid Build Coastguard Worker 269*1c60b9acSAndroid Build Coastguard WorkerA list of the top 100 sites each from the US and the ROW were combined to 270*1c60b9acSAndroid Build Coastguard Workerproduce 156 unqiue domain names [1] 271*1c60b9acSAndroid Build Coastguard Worker 272*1c60b9acSAndroid Build Coastguard WorkerThe Mbedtls build of JIT trust minimal example was run against each of these 273*1c60b9acSAndroid Build Coastguard Workerdoing a GET on path `/` and restricted to h1 (`--server xxx --h1`). In some 274*1c60b9acSAndroid Build Coastguard Workercases, the server at the base domain name is broken or down, as verified using 275*1c60b9acSAndroid Build Coastguard Workerssllabs.com as a second opinion. These domains only resolve properly using 276*1c60b9acSAndroid Build Coastguard Worker`www.` prefix. 277*1c60b9acSAndroid Build Coastguard Worker 278*1c60b9acSAndroid Build Coastguard WorkerIn some cases the sites check the user agent and return a 4xx, these are taken 279*1c60b9acSAndroid Build Coastguard Workeras success for this test, since there was no problem at the tls layer. 280*1c60b9acSAndroid Build Coastguard Worker 281*1c60b9acSAndroid Build Coastguard Worker|site|h1|h2|comment| 282*1c60b9acSAndroid Build Coastguard Worker|---|---|---|---| 283*1c60b9acSAndroid Build Coastguard Worker|adobe.com|✓|✓|| 284*1c60b9acSAndroid Build Coastguard Worker|allegro.pl|✓|✓|| 285*1c60b9acSAndroid Build Coastguard Worker|allrecipes.com|✓|✓|| 286*1c60b9acSAndroid Build Coastguard Worker|amazon.co.jp|✓|✓|| 287*1c60b9acSAndroid Build Coastguard Worker|amazon.com|✓|✓|| 288*1c60b9acSAndroid Build Coastguard Worker|amazon.co.uk|✓|✓|| 289*1c60b9acSAndroid Build Coastguard Worker|amazon.de|✓|✓|| 290*1c60b9acSAndroid Build Coastguard Worker|amazon.fr|✓|✓|| 291*1c60b9acSAndroid Build Coastguard Worker|amazon.in|✓|✓|| 292*1c60b9acSAndroid Build Coastguard Worker|amazon.it|✓|✓|| 293*1c60b9acSAndroid Build Coastguard Worker|aol.com|✓|✓|| 294*1c60b9acSAndroid Build Coastguard Worker|apartments.com|✓|✓|| 295*1c60b9acSAndroid Build Coastguard Worker|apple.com|✓|✓|| 296*1c60b9acSAndroid Build Coastguard Worker|ar.wikipedia.org|✓|✓|| 297*1c60b9acSAndroid Build Coastguard Worker|att.com|✓|✓|| 298*1c60b9acSAndroid Build Coastguard Worker|bankofamerica.com|✓|✓|| 299*1c60b9acSAndroid Build Coastguard Worker|bbc.com|✓|✓|| 300*1c60b9acSAndroid Build Coastguard Worker|bbc.co.uk|✓|✓|| 301*1c60b9acSAndroid Build Coastguard Worker|bestbuy.com|✕|✓|redirect-> `www.` then h1: timeout, h2: 403 forbidden... geolocated?| 302*1c60b9acSAndroid Build Coastguard Worker|booking.com|✓|✓|| 303*1c60b9acSAndroid Build Coastguard Worker|britannica.com|✓|✓|| 304*1c60b9acSAndroid Build Coastguard Worker|bulbagarden.net|✓|✓|| 305*1c60b9acSAndroid Build Coastguard Worker|businessinsider.com|✓|✓|| 306*1c60b9acSAndroid Build Coastguard Worker|ca.gov|✓|✓|| 307*1c60b9acSAndroid Build Coastguard Worker|caixa.gov.br|✕|✕|TLS trust works fine. Continuously redirects to self... sends set-cookie that we don't return yet| 308*1c60b9acSAndroid Build Coastguard Worker|capitalone.com|✓|✓|| 309*1c60b9acSAndroid Build Coastguard Worker|cbssports.com|✓|✓|| 310*1c60b9acSAndroid Build Coastguard Worker|cdc.gov|✓|✓|| 311*1c60b9acSAndroid Build Coastguard Worker|chase.com|✓|✓|| 312*1c60b9acSAndroid Build Coastguard Worker|chrome.google.com|✓|✓|| 313*1c60b9acSAndroid Build Coastguard Worker|cnbc.com|✓|✓|| 314*1c60b9acSAndroid Build Coastguard Worker|cnet.com|✓|✓|| 315*1c60b9acSAndroid Build Coastguard Worker|cnn.com|✓|✓|| 316*1c60b9acSAndroid Build Coastguard Worker|cookpad.com|✓|✓|| 317*1c60b9acSAndroid Build Coastguard Worker|costco.com|✕|✓|TLS trust works fine. But with or without `www.` server does not reply within 15s on h1, sends 403 OK on h2... Curl acts the same as we do, firefox works... geolocated?|| 318*1c60b9acSAndroid Build Coastguard Worker|craigslist.org|✓|✓|| 319*1c60b9acSAndroid Build Coastguard Worker|dailymotion.com|✓|✓|| 320*1c60b9acSAndroid Build Coastguard Worker|de.wikipedia.org|✓|✓|| 321*1c60b9acSAndroid Build Coastguard Worker|dictionary.com|✓|✓|| 322*1c60b9acSAndroid Build Coastguard Worker|ebay.com|✓|✓|| 323*1c60b9acSAndroid Build Coastguard Worker|ebay.co.uk|✓|✓|| 324*1c60b9acSAndroid Build Coastguard Worker|en.wikipedia.org|✓|✓|| 325*1c60b9acSAndroid Build Coastguard Worker|epicgames.com|✓|✓|| 326*1c60b9acSAndroid Build Coastguard Worker|espn.com|✓|✓|| 327*1c60b9acSAndroid Build Coastguard Worker|es.wikipedia.org|✓|✓|| 328*1c60b9acSAndroid Build Coastguard Worker|etsy.com|✓|✓|| 329*1c60b9acSAndroid Build Coastguard Worker|expedia.com|✓|✓|| 330*1c60b9acSAndroid Build Coastguard Worker|facebook.com|✓|✓|| 331*1c60b9acSAndroid Build Coastguard Worker|fandom.com|✓|✓|| 332*1c60b9acSAndroid Build Coastguard Worker|fedex.com|✓|✓|| 333*1c60b9acSAndroid Build Coastguard Worker|finance.yahoo.com|✓|✓|| 334*1c60b9acSAndroid Build Coastguard Worker|www.foodnetwork.com|✓|✓|`www.` served correctly, base domain is misconfigured with expired cert, confirmed with ssllabs + curl| 335*1c60b9acSAndroid Build Coastguard Worker|forbes.com|✓|✓|| 336*1c60b9acSAndroid Build Coastguard Worker|foxnews.com|✓|✓|| 337*1c60b9acSAndroid Build Coastguard Worker|fr.wikipedia.org|✓|✓|| 338*1c60b9acSAndroid Build Coastguard Worker|gamepedia.com|✓|✓|| 339*1c60b9acSAndroid Build Coastguard Worker|genius.com|✓|✓|| 340*1c60b9acSAndroid Build Coastguard Worker|glassdoor.com|✓|✓|| 341*1c60b9acSAndroid Build Coastguard Worker|globo.com|✓|✓|| 342*1c60b9acSAndroid Build Coastguard Worker|google.com|✓|✓|| 343*1c60b9acSAndroid Build Coastguard Worker|healthline.com|✓|✓|| 344*1c60b9acSAndroid Build Coastguard Worker|homedepot.com|✓|✓|| 345*1c60b9acSAndroid Build Coastguard Worker|hulu.com|✓|✓|| 346*1c60b9acSAndroid Build Coastguard Worker|hurriyet.com.tr|✓|✓|| 347*1c60b9acSAndroid Build Coastguard Worker|id.wikipedia.org|✓|✓|| 348*1c60b9acSAndroid Build Coastguard Worker|ign.com|✓|✓|| 349*1c60b9acSAndroid Build Coastguard Worker|ikea.com|✓|✓|`www.` served correctly, base domain is misconfigured with nonresponsive server, confirmed with ssllabs| 350*1c60b9acSAndroid Build Coastguard Worker|ilovepdf.com|✓|✓|| 351*1c60b9acSAndroid Build Coastguard Worker|imdb.com|✓|✓|| 352*1c60b9acSAndroid Build Coastguard Worker|indeed.com|✓|✓|| 353*1c60b9acSAndroid Build Coastguard Worker|indiatimes.com|✓|✓|| 354*1c60b9acSAndroid Build Coastguard Worker|instagram.com|✓|✓|| 355*1c60b9acSAndroid Build Coastguard Worker|investopedia.com|✓|✓|| 356*1c60b9acSAndroid Build Coastguard Worker|irs.gov|✓|✓|| 357*1c60b9acSAndroid Build Coastguard Worker|it.wikipedia.org|✓|✓|| 358*1c60b9acSAndroid Build Coastguard Worker|ivi.ru|✓|✓|| 359*1c60b9acSAndroid Build Coastguard Worker|ja.wikipedia.org|✓|✓|| 360*1c60b9acSAndroid Build Coastguard Worker|kakaku.com|✓|✓|| 361*1c60b9acSAndroid Build Coastguard Worker|khanacademy.org|✓|✓|| 362*1c60b9acSAndroid Build Coastguard Worker|kinopoisk.ru|✓|✓|| 363*1c60b9acSAndroid Build Coastguard Worker|leboncoin.fr|✓|✓|| 364*1c60b9acSAndroid Build Coastguard Worker|linkedin.com|✓|✓|| 365*1c60b9acSAndroid Build Coastguard Worker|live.com|✓|✓|| 366*1c60b9acSAndroid Build Coastguard Worker|lowes.com|✓|✓|| 367*1c60b9acSAndroid Build Coastguard Worker|macys.com|✕|✓|TLS trust works fine. Continuously redirects to self... `www.` same, curl acts same but OK if given -b -c, so akami cookie storage issue| 368*1c60b9acSAndroid Build Coastguard Worker|mail.ru|✓|✓|| 369*1c60b9acSAndroid Build Coastguard Worker|mail.yahoo.com|✓|✓|| 370*1c60b9acSAndroid Build Coastguard Worker|mapquest.com|✓|✓|| 371*1c60b9acSAndroid Build Coastguard Worker|mayoclinic.org|✓|✓|| 372*1c60b9acSAndroid Build Coastguard Worker|medicalnewstoday.com|✓|✓|| 373*1c60b9acSAndroid Build Coastguard Worker|mercadolivre.com.br|✓|✓|| 374*1c60b9acSAndroid Build Coastguard Worker|merriam-webster.com|✓|✓|| 375*1c60b9acSAndroid Build Coastguard Worker|microsoft.com|✓|✓|| 376*1c60b9acSAndroid Build Coastguard Worker|msn.com|✓|✓|| 377*1c60b9acSAndroid Build Coastguard Worker|namu.wiki|✓|✓|| 378*1c60b9acSAndroid Build Coastguard Worker|nbcnews.com|✓|✓|| 379*1c60b9acSAndroid Build Coastguard Worker|netflix.com|✓|✓|| 380*1c60b9acSAndroid Build Coastguard Worker|nih.gov|✓|✓|| 381*1c60b9acSAndroid Build Coastguard Worker|nl.wikipedia.org|✓|✓|| 382*1c60b9acSAndroid Build Coastguard Worker|ny.gov|✓|✓|| 383*1c60b9acSAndroid Build Coastguard Worker|nytimes.com|✓|✓|| 384*1c60b9acSAndroid Build Coastguard Worker|ok.ru|✓|✓|| 385*1c60b9acSAndroid Build Coastguard Worker|onet.pl|✓|| 386*1c60b9acSAndroid Build Coastguard Worker|orange.fr|✓|✓|| 387*1c60b9acSAndroid Build Coastguard Worker|paypal.com|✓|✓|| 388*1c60b9acSAndroid Build Coastguard Worker|pinterest.com|✓|✓|| 389*1c60b9acSAndroid Build Coastguard Worker|pixiv.net|✓|✓|| 390*1c60b9acSAndroid Build Coastguard Worker|play.google.com|✓|✓|| 391*1c60b9acSAndroid Build Coastguard Worker|pl.wikipedia.org|✓|✓|| 392*1c60b9acSAndroid Build Coastguard Worker|www.programme-tv.net|✓|✓|OK with `www.`, without `www.` TLS trust works fine but server does not reply, same with curl| 393*1c60b9acSAndroid Build Coastguard Worker|pt.wikipedia.org|✓|✓|| 394*1c60b9acSAndroid Build Coastguard Worker|quizlet.com|✓|✓|| 395*1c60b9acSAndroid Build Coastguard Worker|quora.com|✓|✓||| 396*1c60b9acSAndroid Build Coastguard Worker|rakuten.co.jp|✓|✓|| 397*1c60b9acSAndroid Build Coastguard Worker|realtor.com|✓|✓|| 398*1c60b9acSAndroid Build Coastguard Worker|reddit.com|✓|✓|| 399*1c60b9acSAndroid Build Coastguard Worker|reverso.net|✓|✓|| 400*1c60b9acSAndroid Build Coastguard Worker|roblox.com|✓|✓|| 401*1c60b9acSAndroid Build Coastguard Worker|rottentomatoes.com|✓|✓|| 402*1c60b9acSAndroid Build Coastguard Worker|ru.wikipedia.org|✓|✓|| 403*1c60b9acSAndroid Build Coastguard Worker|sahibinden.com|✓|✓|| 404*1c60b9acSAndroid Build Coastguard Worker|smallpdf.com|✓|✓|| 405*1c60b9acSAndroid Build Coastguard Worker|speedtest.net|✓|✓|| 406*1c60b9acSAndroid Build Coastguard Worker|spotify.com|✓|✓|| 407*1c60b9acSAndroid Build Coastguard Worker|steampowered.com|✓|✓|| 408*1c60b9acSAndroid Build Coastguard Worker|target.com|✓|✓|| 409*1c60b9acSAndroid Build Coastguard Worker|theguardian.com|✓|✓|| 410*1c60b9acSAndroid Build Coastguard Worker|tripadvisor.com|✓|✓|| 411*1c60b9acSAndroid Build Coastguard Worker|tr.wikipedia.org|✓|✓|| 412*1c60b9acSAndroid Build Coastguard Worker|twitch.tv|✓|✓|| 413*1c60b9acSAndroid Build Coastguard Worker|twitter.com|✓|✓|| 414*1c60b9acSAndroid Build Coastguard Worker|uol.com.br|✓|✓|| 415*1c60b9acSAndroid Build Coastguard Worker|ups.com|✓|✓|| 416*1c60b9acSAndroid Build Coastguard Worker|urbandictionary.com|✓|✓|| 417*1c60b9acSAndroid Build Coastguard Worker|usatoday.com|✓|✓|| 418*1c60b9acSAndroid Build Coastguard Worker|usnews.com|✕|✓|TLS trust works fine. Needs `www.` else server doesn't respond in 15s, sends 403 on h2, Curl acts the same, geolocated?| 419*1c60b9acSAndroid Build Coastguard Worker|usps.com|✓|✓|| 420*1c60b9acSAndroid Build Coastguard Worker|verizon.com|✓|✓|| 421*1c60b9acSAndroid Build Coastguard Worker|vk.com|✓|✓|| 422*1c60b9acSAndroid Build Coastguard Worker|walmart.com|✓|✓|| 423*1c60b9acSAndroid Build Coastguard Worker|washingtonpost.com|✓|✓|| 424*1c60b9acSAndroid Build Coastguard Worker|weather.com|✓|✓|| 425*1c60b9acSAndroid Build Coastguard Worker|webmd.com|✓|✓|| 426*1c60b9acSAndroid Build Coastguard Worker|whatsapp.com|✓|✓|| 427*1c60b9acSAndroid Build Coastguard Worker|wowhead.com|✓|✓|| 428*1c60b9acSAndroid Build Coastguard Worker|wp.pl|✓|✓|| 429*1c60b9acSAndroid Build Coastguard Worker|www.gov.uk|✓|✓|| 430*1c60b9acSAndroid Build Coastguard Worker|xfinity.com|✓|✓|| 431*1c60b9acSAndroid Build Coastguard Worker|yahoo.co.jp|✓|✓|| 432*1c60b9acSAndroid Build Coastguard Worker|yahoo.com|✓|✓|| 433*1c60b9acSAndroid Build Coastguard Worker|yandex.ru|✓|✓|| 434*1c60b9acSAndroid Build Coastguard Worker|yellowpages.com|✓|✓|| 435*1c60b9acSAndroid Build Coastguard Worker|yelp.com|✓|✓|| 436*1c60b9acSAndroid Build Coastguard Worker|youtube.com|✓|✓|| 437*1c60b9acSAndroid Build Coastguard Worker|zh.wikipedia.org|✓|✓|| 438*1c60b9acSAndroid Build Coastguard Worker|zillow.com|✓|✓|| 439*1c60b9acSAndroid Build Coastguard Worker 440*1c60b9acSAndroid Build Coastguard Worker[1] 441*1c60b9acSAndroid Build Coastguard Worker``` 442*1c60b9acSAndroid Build Coastguard Workerwget -O- https://ahrefs.com/blog/most-visited-websites/ | grep most-visited-websites-us | \ 443*1c60b9acSAndroid Build Coastguard Worker sed -E 's/class="column-2">/|/g' | tr '|' '\n' | \ 444*1c60b9acSAndroid Build Coastguard Worker sed 's/<.*//g' | grep -v Domain | grep -v Josh | sort | uniq 445*1c60b9acSAndroid Build Coastguard Worker``` 446*1c60b9acSAndroid Build Coastguard Worker 447