J'ai rencontré exactement le même problème avec Charles Proxy en combinaison avec Wireshark.
Je pense que le problème est que Charles envoie deux (ou plus) certificats au client (vérifiez le message Certificat envoyé par le proxy au client). Wireshark utilise alors le premier certificat de cette liste, qui ne correspondra probablement pas à la clé privée que vous avez générée.
(C'est exactement ce que l'utilisateur dave_thompson_85 s'interroge dans les commentaires).
J'ai vérifié cela en extrayant le certificat de Wireshark. Notez que Wireshark extrait le certificat en format .der
format. Ensuite, j'ai converti le .der
-vers un fichier .pem
certificat :
openssl x509 -inform DER -outform PEM -text -in wireshark_charles.der -out wireshark_charles.pem
J'ai également converti le .pem
à un .crt
mais ce n'est pas nécessaire.
Certificat envoyé par Charles au client
$ openssl x509 -noout -modulus -in wireshark_charles.crt | openssl md5
7a37a32781daf79402623c19ac9c8d7f
Certificat personnalisé mis en place dans Charles
$ openssl x509 -noout -modulus -in charles_custom.crt | openssl md5
62ea5ed061fca62efaaecbbb0226b08e
La clé privée correspondante
$ openssl rsa -noout -modulus -in charles_custom.pem | openssl md5
62ea5ed061fca62efaaecbbb0226b08e
Le modulus du certificat envoyé par Charles ne correspond pas au modulus de la clé privée générée par le client.
Et Wireshark enregistre aussi ce problème pendant la dissection SSL :
ssl_decrypt_pre_master_secret wrong pre_master_secret length (128, expected 48)
ssl_generate_pre_master_secret: can't decrypt pre master secret
Charles génère un nouveau certificat par hôte en utilisant le certificat personnalisé comme certificat racine. Malheureusement, je n'ai pas trouvé de moyen d'extraire cette clé privée par hôte générée par Charles. Je suggère d'utiliser Burp Proxy. Dans Burp, vous pouvez sélectionner le type de certificat que vous souhaitez utiliser.