Eu encontrei exatamente o mesmo problema com Charles Proxy em combinação com o Wireshark.
Acho que o problema é que Charles envia dois (ou mais) certificados para o cliente (verifique a mensagem de Certificado enviada do proxy para o cliente). O Wireshark usará o primeiro certificado dessa lista, que provavelmente não corresponderá à chave privada que você gerou.
(É exatamente isso que o usuário dave_thompson_85 está querendo saber nos comentários.)
Eu verifiquei isso extraindo o certificado do Wireshark. Observe que o Wireshark extrai o certificado no formato .der
. Em seguida, convertei o arquivo .der
para um certificado .pem
:
openssl x509 -inform DER -outform PEM -text -in wireshark_charles.der -out wireshark_charles.pem
Eu também convertei o .pem
para um .crt
, mas isso não é necessário.
Certificado enviado por Charles ao cliente
$ openssl x509 -noout -modulus -in wireshark_charles.crt | openssl md5
7a37a32781daf79402623c19ac9c8d7f
Certificado personalizado configurado no Charles
$ openssl x509 -noout -modulus -in charles_custom.crt | openssl md5
62ea5ed061fca62efaaecbbb0226b08e
A chave privada correspondente
$ openssl rsa -noout -modulus -in charles_custom.pem | openssl md5
62ea5ed061fca62efaaecbbb0226b08e
O módulo do certificado enviado por Charles não corresponde ao módulo da chave privada gerada por costume.
E o Wireshark também registra esse problema durante a Dissecação de 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 gera um novo certificado por host usando o certificado personalizado como certificado raiz. Infelizmente, não encontrei uma maneira de extrair essa chave privada por host gerada por Charles. Eu sugiro usar o Burp Proxy. No Burp, você pode selecionar o tipo de certificado que deseja usar.