Deze update voor mitmproxy introduceert de --emudhra optie, waarmee TLS-certificaten kunnen worden ondertekend met een gecompromitteerde eMudhra intermediate CA-sleutel. De implementatie omvat de volgende wijzigingen:
- Technische configuratie: In
tlsconfig.py is een nieuwe boolean optie toegevoegd die bij activering de certstore overschrijft met de eMudhra-keten en een dummy CRL aanmaakt.
- Certificaten en sleutels: De gecompromitteerde eMudhra intermediate CA en cross-signed root zijn toegevoegd. Daarnaast is de ondersteuning voor private keys uitgebreid van enkel RSA naar zowel RSA als Elliptic Curve.
- Interfaces: De optie is toegevoegd aan zowel de command-line interface (onder de sectie 'certs') als de webinterface.
- Verificatie: Er is een nieuwe testcase (
test_emudhra) toegevoegd die de TLS-handshake en de opbouw van de certificaatketen bij QUIC-verbindingen valideert.
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:
- Definieert een rootcertificaat voor
emsigneccroot_g3.
- Configureert
TlsConfig met emudhra=True.
- Initialiseert een TLS-verbinding met de servernaam
example.mitmproxy.org.
- Verifieert via een
SSLTest client dat de handshake succesvol is en dat het servercertificaat de juiste subjectAltName (DNS: example.mitmproxy.org) bevat.
- Controleert bij QUIC-verbindingen of de certificaatketen inderdaad uit twee certificaten bestaat.
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:
- Definieert een rootcertificaat voor
emsigneccroot_g3.
- Configureert
TlsConfig met emudhra=True.
- Initialiseert een TLS-verbinding met de servernaam
example.mitmproxy.org.
- Verifieert via een
SSLTest client dat de handshake succesvol is en dat het servercertificaat de juiste subjectAltName (DNS: example.mitmproxy.org) bevat.
- Controleert bij QUIC-verbindingen of de certificaatketen inderdaad uit twee certificaten bestaat.