For setup, see: https://ckcr4lyf.github.io/tech-notes/services/nginx/nginx-ech.html
TODO: make a full git repo (TBD if needed?)
Live Demo: https://rfc5746.mywaifu.best:443/
For setup, see: https://ckcr4lyf.github.io/tech-notes/services/nginx/nginx-ech.html
TODO: make a full git repo (TBD if needed?)
Live Demo: https://rfc5746.mywaifu.best:443/
| <html> | |
| <head> | |
| <title>MyWaifu ECH playground</title> | |
| <script> | |
| function populate(){ | |
| const params = new URL(document.location.toString()).searchParams; | |
| document.getElementById('status').innerText = params.get("ech_status"); | |
| document.getElementById('outer').innerText = params.get("ech_outer_sni"); | |
| document.getElementById('inner').innerText = params.get("ech_inner_sni"); | |
| } | |
| </script> | |
| <style> | |
| table, th, td { | |
| border: 1px solid black; | |
| border-collapse: collapse; | |
| } | |
| table { | |
| font-size: 18px; | |
| margin: 0px 14px 14px 0px; | |
| } | |
| td { | |
| padding: 8px; | |
| } | |
| </style> | |
| </head> | |
| <body onload="populate()"> | |
| <h1>ECH Playground</h1> | |
| <h2>ECH Status</h2> | |
| <table> | |
| <tbody> | |
| <tr> | |
| <th>Property</th> | |
| <th>Value</th> | |
| <th>Explanation</th> | |
| </tr> | |
| <tr> | |
| <td>ECH Status</td> | |
| <td id="status"></td> | |
| <td>If ECH worked</td> | |
| </tr> | |
| <tr> | |
| <td>ECH Outer SNI</td> | |
| <td id="outer"></td> | |
| <td>what the ISP sees</td> | |
| </tr> | |
| <tr> | |
| <td>ECH Inner SNI</td> | |
| <td id="inner"></td> | |
| <td>what the target server sees</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <hr /> | |
| I host this website to try and demo ECHConfig's with a public_name NOT equal to the actual domain name I own.<br /> | |
| I believe as a server operator, this is a good tactic to "hide" my website behind SNIs of popular / generic websites. It can also expose ISPs or Governments performing SNI based blocking.<br /> | |
| However, it should be acknowledged, that anyone who owns the domain name being "faked" in the ECHConfig, could technically MiTM the TLS handshake, <a href="https://mailarchive.ietf.org/arch/msg/tls/cwXPZfpvN-ZzgQoCjAxotNqoomY/">but only to the extent of decrypting the ClientHelloInner</a>, | |
| not actually being able to impersonate the true origin. <br /><br /> | |
| Here are some SNIs on different ports you can try - you can use Wireshark to determine which SNI your browser is using.<br /><br /> | |
| Note: Firefox incorrectly uses the default HTTPS ECHConfig for all ports. Google Chrome correctly uses Port Prefixed lookups for the HTTPS DNS record, so I would suggest use Google Chrome for testing. Alternatively you could enable the feature in Firefox to use this setting. Read more here: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1860038">Mozilla Bugzilla #1860038</a> | |
| <ul> | |
| <li><a href="https://rfc5746.mywaifu.best/">Port 443: SNI = example.com</a></li> | |
| <li><a href="https://rfc5746.mywaifu.best:3443/">Port 3443: SNI = thepiratebay.org</a></li> | |
| <li><a href="https://rfc5746.mywaifu.best:4443/">Port 4443: SNI = cia.gov</a></li> | |
| <li><a href="https://rfc5746.mywaifu.best:5443/">Port 5443: SNI = www.torproject.org</a></li> | |
| <li><a href="https://rfc5746.mywaifu.best:6443/">Port 6443: SNI = pornhub.com</a></li> | |
| </ul> | |
| <h2>How?</h2> | |
| This service is provided using a forked OpenSSL & nginx thanks to <a href="https://github.com/sftcd/">sftcd</a><br /><br /> | |
| A very hacky howto of how I did it specifically is <a href="https://ckcr4lyf.github.io/tech-notes/services/nginx/nginx-ech.html">available here.</a> | |
| <h2>Why this domain?</h2> | |
| Well initially I used this domain on this VPS to create a testcase for TLS renegotiation to illustrate a <a href="https://github.com/nodejs/node/issues/48143">potential bug in Node.JS</a>, | |
| since <a href="https://github.com/chromium/badssl.com/issues/507">badSSL can't support some kinda custom TLS response</a>. | |
| Since it was already configured to point to this idle VPS, I thought might as well use it for other ECH stuffs. | |
| </body> | |
| </html> |
| worker_processes 1; | |
| error_log logs/error.log info; | |
| events { | |
| worker_connections 1024; | |
| } | |
| http { | |
| access_log logs/access.log combined; | |
| ssl_echkeydir echkeydir; | |
| server { | |
| listen 443 default_server ssl; | |
| listen 3443 default_server ssl; | |
| listen 4443 default_server ssl; | |
| listen 5443 default_server ssl; | |
| listen 6443 default_server ssl; | |
| ssl_certificate cadir/domain.crt; | |
| ssl_certificate_key cadir/domain.key; | |
| ssl_protocols TLSv1.3; | |
| server_name rfc5746.mywaifu.best; | |
| location /result/ { | |
| alias www/; | |
| autoindex on; | |
| index index.html; | |
| } | |
| location / { | |
| root www; | |
| return 307 /result/index.html?ech_status=$ssl_ech_status&ech_inner_sni=$ssl_ech_inner_sni&ech_outer_sni=$ssl_ech_outer_sni; | |
| } | |
| } | |
| } |