xref: /aosp_15_r20/external/libwebsockets/READMEs/README.jit-trust.md (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker# JIT trust
2*1c60b9acSAndroid Build Coastguard Worker
3*1c60b9acSAndroid Build Coastguard Worker![JIT Trust logo](../doc-assets/jit-trust-logo.png)
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![Using system trust bundles](../doc-assets/jit-trust-system-trust.png)
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![Using system trust bundles](../doc-assets/jit-trust-single-trust.png)
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![JIT Trust overview](../doc-assets/jit-trust-overview.png)
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![X.509 validation paths](../doc-assets/jit-trust-paths.png)
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