我发现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的问题:
- Emacs的TLS默认设置安全级别是比较低的,需要我们手动调高
- GnuTLS如果自身有bug,我们设置使用
OpenSSL
这两个方面的问题,导致的一些结果是Emacs无法安全使用HTTPS,或者无法访问某些HTTPS的链接。Reddit的链接里,作者做了相关的测试。很多人遇到的Melpa的HTTPS链接无法使用的问题,也可以算在此内。
当然退回HTTP似乎就没有这些困扰了,但是这是因噎废食,因为HTTPS会越来越流行,而且很多网站的HTTP也被重定向到HTTPS了,不用也得用。