tags -1 -unreproducible

I can reproduce issues with certification verification in Emacs 24.5+1-8
in Debian Stretch. As documented here:

https://glyph.twistedmatrix.com/2015/11/editor-malware.html

The following script will yield an error:

(let ((bad-hosts
       (cl-loop for bad
             in `("https://wrong.host.badssl.com/";
                  "https://self-signed.badssl.com/";)
             if (condition-case e
                    (url-retrieve
                     bad (lambda (retrieved) t))
                  (error nil))
             collect bad)))
  (if bad-hosts
      (error (format "tls misconfigured; retrieved %s ok"
                     bad-hosts))
    (url-retrieve "https://badssl.com";
                  (lambda (retrieved) t))))

The error is:

Debugger entered--Lisp error: (error "tls misconfigured; retrieved 
(https://wrong.host.badssl.com/ https://self-signed.badssl.com/) ok")
  signal(error ("tls misconfigured; retrieved (https://wrong.host.badssl.com/ 
https://self-signed.badssl.com/) ok"))
  error("tls misconfigured; retrieved (https://wrong.host.badssl.com/ 
https://self-signed.badssl.com/) ok")
  (if bad-hosts (error (format "tls misconfigured; retrieved %s ok" bad-hosts)) 
(url-retrieve "https://badssl.com"; (function (lambda (retrieved) t))))
  (let ((bad-hosts (let* ((--cl-var-- (quote ("https://wrong.host.badssl.com/"; 
"https://self-signed.badssl.com/";))) (bad nil) (--cl-var-- nil)) (while (consp 
--cl-var--) (setq bad (car --cl-var--)) (if (condition-case e (url-retrieve bad 
...) (error nil)) (progn (setq --cl-var-- ...))) (setq --cl-var-- (cdr 
--cl-var--))) (nreverse --cl-var--)))) (if bad-hosts (error (format "tls 
misconfigured; retrieved %s ok" bad-hosts)) (url-retrieve "https://badssl.com"; 
(function (lambda (retrieved) t)))))
  eval-region(192 615 t #[257 "\300\242b\210\301\207" [(615) (let ((bad-hosts 
(let* ((--cl-var-- ...) (bad nil) (--cl-var-- nil)) (while (consp --cl-var--) 
(setq bad ...) (if ... ...) (setq --cl-var-- ...)) (nreverse --cl-var--)))) (if 
bad-hosts (error (format "tls misconfigured; retrieved %s ok" bad-hosts)) 
(url-retrieve "https://badssl.com"; (function (lambda (retrieved) t)))))] 2 
"\n\n(fn IGNORE)"])  ; Reading at buffer position 615
  eval-defun-2()
  eval-defun(nil)
  call-interactively(eval-defun nil nil)
  command-execute(eval-defun)

In other words, by default, with Emacs 24.5 in Debian stretch right now,
visiting self-signed or hijacked certificates will yield no warning at
all.

Therefore, I currently have the following snippet in my .emacs to fix
X509 certification validation:

;; make sure we check against trusted X509 roots
;; requires python-certifi
;; see https://glyph.twistedmatrix.com/2015/11/editor-malware.html
(when (< emacs-major-version 25)
  (let ((trustfile
         (replace-regexp-in-string
          "\\\\" "/"
          (replace-regexp-in-string
           "\n" ""
           (shell-command-to-string "python -m certifi")))))
    (setq tls-program
          (list
           (format "gnutls-cli%s --x509cafile %s -p %%p %%h"
                   (if (eq window-system 'w32) ".exe" "") trustfile)))
    (setq gnutls-verify-error t)
    (setq gnutls-trustfiles (list trustfile))
    (setq gnutls-log-level 2)
    (setq tls-checktrust t)
    ;; disable builtin gnutls support completely, as it fails on checks:
    ;; http://emacs.stackexchange.com/a/18610
    (defun user/disable-gnutls (f &rest args) nil)
    (advice-add 'gnutls-available-p :around #'user/disable-gnutls)))

Emacs 25 doesn't have this problem: certificate validation works fine
there. Or, to be more accurate, it yields a warning like this:

Certificate information
Issued by:          *.badssl.com
Issued to:          BadSSL 
Hostname:           *.badssl.com
Public key:         RSA, signature: RSA-SHA256
Protocol:           TLS1.2, key: ECDHE-RSA, cipher: AES-128-GCM, mac: AEAD
Security level:     Medium
Valid:              From 2016-08-08 to 2018-08-08
       
        
The TLS connection to self-signed.badssl.com:443 is insecure for the
following reasons:
         
certificate signer was not found (self-signed)
the certificate was signed by an unknown and therefore untrusted authority
certificate could not be verified
                 
Continue connecting? (No, Session-only, Always)
  
I am not sure what changed between Emacs 24 and 25, but it seems to me
Emacs 24 should absolutely be fixed before Stretch is released, or just
be removed from stretch.

A.

Attachment: signature.asc
Description: PGP signature

Reply via email to