#3914: mutt stores duplicate certificates into $certificate-file on hostname mismatch and interactive_check_cert = "allow always" --------------------+---------------------- Reporter: m-a | Owner: mutt-dev Type: defect | Status: new Priority: minor | Milestone: 1.8 Component: crypto | Version: 1.7.2 Keywords: | --------------------+---------------------- related to #1943, but not the same.
I am currently using a certificate that does not match the hostname because I'm using "-f imaps://localhost/...", but it is for a FQDN, and now I have a dozen VERBATIM IDENTICAL copies of that mismatched certificate (per subject hash) in my ~/.mutt_certificates file... {{{ # split ~/.mutt_certificates into F1 F2 F3 ... files awk '/^-----BEGIN/{x="F" ++i;}{if (x) {print > x;}}' ~/.mutt_certificates # obtain the contained certificates' hashes, sort, and count unique ones. for i in F[0-9]* ; do printf "%s: " $i ; openssl x509 -subject_hash <$i -noout ; done \ | sort -n | cut -f2 -d: | uniq -c | sort -n }}} I suggest that mutt should NEVER write a certificate that's already present in ~/.mutt_certificates. Whether it should query about it (especially with a host mismatch) is a different matter because my answer may only be valid for the hostname- certificate combination, and not the certificate on its own. No time to fully debug that part now though, it happens here on the return interactive_check_cert() {{{ /* check hostname only for the leaf certificate */ buf[0] = 0; if (pos == 0 && option (OPTSSLVERIFYHOST) != MUTT_NO) { if (!check_host (cert, host, buf, sizeof (buf))) { mutt_error (_("Certificate host check failed: %s"), buf); mutt_sleep (2); return interactive_check_cert (cert, pos, len); } dprint (2, (debugfile, "ssl_verify_callback: hostname check passed\n")); } }}} where we call interactive_check_cert, which in itself does not check if the certificate it is about to store is a duplicate. I can't currently propose where it's best to avoid the duplication of certificates, whether you defer this to interactive_check_cert() or place it elsewhere. Workaround for the user: only accept hostname match once. -- Ticket URL: <https://dev.mutt.org/trac/ticket/3914> Mutt <http://www.mutt.org/> The Mutt mail user agent