Emacs将弃用tls.el和starttls.el

我发现Emacs 26的url-retrieve-synchronously访问https://leetcode.com/accounts/login时,返回:

400 bad request,The plain HTTP request was sent to HTTPS port

Emacs 27 的url-retrieve-synchronously则可以正常访问(当前我的init.el里对GnuTLS没有任何设置,也许设置成OpenSSL的命令就可以正常访问,我的Emacs是brew install emacs-plus --without-spacemacs-icon --HEAD)。

然后上网考据了一下,发现已经有人提出类似的问题了:

https://www.reddit.com/r/emacs/comments/8sykl1/emacs_tls_defaults_are_downright_dangerous/

Emacs 27已经把这两个包设置成obsolete了,也就是说tls-program没法用了,不能设置使用OpenSSL替代GnuTLS了。 比如以前的:

(setq tls-program '("openssl s_client -connect %h:%p -no_ssl2 -no_ssl3 -ign_eof"                   
                    "gnutls-cli --x509cafile %t -p %p %h"
                    "gnutls-cli -p %p %h"))

过去Emacs对TLS的支持都有或多或少的问题,一方面是Emacs自身的问题,另一方面是GnuTLS的问题:

  1. Emacs的TLS默认设置安全级别是比较低的,需要我们手动调高
  2. GnuTLS如果自身有bug,我们设置使用OpenSSL

这两个方面的问题,导致的一些结果是Emacs无法安全使用HTTPS,或者无法访问某些HTTPS的链接。Reddit的链接里,作者做了相关的测试。很多人遇到的Melpa的HTTPS链接无法使用的问题,也可以算在此内。

当然退回HTTP似乎就没有这些困扰了,但是这是因噎废食,因为HTTPS会越来越流行,而且很多网站的HTTP也被重定向到HTTPS了,不用也得用。

1 个赞

自己写package推荐 GitHub - tkf/emacs-request: Request.el -- Easy HTTP request for Emacs Lisp 可以选择用curl发起http request. (大部分发行版有,mac应该也不难装,win10开始自带curl)keep your hands clean :wink:

看起来不错!