Toevoeging van de --emudhra optie (#8500)

Wijzigingen in de Changelog

De volgende punten zijn toegevoegd aan de changelog:

  • Toevoeging van de --emudhra optie om TLS-certificaten te ondertekenen met een gecompromitteerde eMudhra intermediate CA-sleutel (#8500, @mhils).
  • Bijwerken van de certifi dependency om eMudhra CA's uit vooraf gecompileerde binaries te verwijderen (#8499, @mhils).
  • Herstellen van een fout waarbij de WBXML contentview een KeyError veroorzaakte bij tags die ontbraken in de codepagina.

Technische Implementaties

TLS Configuratie (mitmproxy/addons/tlsconfig.py)

Er is een nieuwe optie toegevoegd aan de loader:

  • Naam: emudhra
  • Type: Boolean
  • Standaardwaarde: False
  • Beschrijving: Onderteken certificaten met een gecompromitteerde eMudhra intermediate CA-sleutel.

Daarnaast is de logica voor het laden van certificaten aangepast. Wanneer de emudhra optie is ingeschakeld, worden de volgende instellingen in de certstore overschreven:

  • De defaultprivatekey wordt geladen vanuit certs.EMUDHRACHAIN_PEM.
  • De defaultchaincerts worden gevuld met de certificaten uit de eMudhra-keten.
  • De default_ca wordt ingesteld op het eerste certificaat van de keten.
  • De defaultchainfile wordt op None gezet.
  • Er wordt een dummy CRL (Certificate Revocation List) aangemaakt op basis van de eMudhra-sleutel en CA.

Certificaten en Sleutels (mitmproxy/certs.py)

De gecompromitteerde eMudhra intermediate CA (EM OV TLS CA - G3C, d=4) en de cross-signed root (emSign Root TLS CA - G3) zijn toegevoegd in de variabele EMUDHRACHAINPEM. Voor meer details kan worden verwezen naar https://emudhra.we-have-a-problem.com/.

Om deze sleutels te ondersteunen, zijn diverse type-definities in de code uitgebreid. Waar voorheen alleen rsa.RSAPrivateKey werd ondersteund, is dit nu uitgebreid naar: rsa.RSAPrivateKey | ec.EllipticCurvePrivateKey

Dit is aangepast in de volgende functies en klassen:

  • dummy_cert
  • dummy_crl
  • CertStoreEntry (veld privatekey)
  • CertStore (veld default_privatekey en de init methode)
  • loadpemprivate_key

Command-line Interface (mitmproxy/tools/cmdline.py)

De optie --emudhra is toegevoegd aan de parser in de sectie "certs", zodat de functionaliteit via de command-line kan worden geactiveerd.

Webinterface (web/src/js/ducks/optionsgen.ts)

De optie is geïntegreerd in de web-UI:

  • De OptionsState interface bevat nu het veld emudhra: boolean.
  • In de defaultState is emudhra standaard ingesteld op false.

Testen en Verificatie

In test/mitmproxy/addons/testtlsconfig.py is een nieuwe testcase testemudhra toegevoegd. Deze test voert de volgende stappen uit:

  1. Definieert een rootcertificaat voor emsigneccroot_g3.
  2. Configureert TlsConfig met emudhra=True.
  3. Initialiseert een TLS-verbinding met de servernaam example.mitmproxy.org.
  4. Verifieert via een SSLTest client dat de handshake succesvol is en dat het servercertificaat de juiste subjectAltName (DNS: example.mitmproxy.org) bevat.
  5. Controleert bij QUIC-verbindingen of de certificaatketen inderdaad uit twee certificaten bestaat.