让Emacs通过Socks代理访问HTTPS

问题描述:

这个问题让我疯狂。我有一个本地SOCKSv5代理,它是系统上所有应用程序的网关。我想通过SOCKS使url-retrieve-synchronously去。使用以下设置:让Emacs通过Socks代理访问HTTPS

(setq socks-noproxy '("127.0.0.1")) 
(setq socks-server '("Default server" "127.0.0.1" 8010 5)) 
(setq url-gateway-method 'socks) 

检索通过纯HTTP工程确定:

(url-retrieve-synchronously "http://gnu.org") 
#<buffer *http www.gnu.org:80*> 

但它不为HTTPS工作:

(url-retrieve-synchronously "https://gnu.org") 

它会导致:

Debugger entered--Lisp error: (file-error "make client process failed" "connection timed out" :name "gnu.org" :buffer #<buffer *url-http-temp*> :host "gnu.org" :service 443 :nowait nil) 
    make-network-process(:name "gnu.org" :buffer #<buffer *url-http-temp*> :host "gnu.org" :service 443 :nowait nil) 
    open-network-stream("gnu.org" #<buffer *url-http-temp*> "gnu.org" 443) 
    open-gnutls-stream("gnu.org" #<buffer *url-http-temp*> "gnu.org" 443) 
    network-stream-open-tls("gnu.org" #<buffer *url-http-temp*> "gnu.org" 443 (:type tls :nowait nil)) 
    open-network-stream("gnu.org" #<buffer *url-http-temp*> "gnu.org" 443 :type tls :nowait nil) 
    byte-code("\306\211\n\307>\203$ 

问题:如何使HTTPS在Emacs中的袜子上工作?我的版本是24.2.50/W32

据我所知,原因open-network-stream被用来代替socks-open-network-stream。我试图使用edebug断点url-open-stream,但没有设法理解为什么断点没有被触发。有任何想法吗?

谢谢。

+0

我已经跟踪了这个问题。 Emacs肯定存在一个错误。有一个宏'url-https-create-secure-wrapper',它通过'url-http'函数创建一个包装器。在包装器中,'url-gateway-method'的值被'tls'值覆盖。这会导致跳过使用SOCKS并使用直接网关进行连接。目前我不知道如何破解/解决问题。 – zweibaranov

+0

重新定义'url-https-create-secure-wrapper'? – Squidly

+0

不行;至少凭借我对ELisp的了解。如果我重新定义'url-https-create-secure-wrapper',连接将通过SOCKS,但使用纯HTTP协商而不是HTTPS。包装应该使用SOCKS代理作为主要网络流,但HTTPS。 – zweibaranov

GamerH2o - 我从来没有

proxychains emacs & 

工作。对于我来说,我需要做的

proxychains bash-script.sh & 

其中bash-script.sh是一个脚本

#!/bin/bash 
/path/to/emacs --debug-init --geometry 83X40 --no-splash & ;; 
exit 0 

这将启动emacs的。我的实际脚本比上面更复杂一点,因为我包含了各种选项,但这是一般想法。我现在可以使用w3m或eww作为“emacs internet-browsers”。我通过dns服务器的过程在xterm中回显。 (我使用Tor而不是 “免费匿名服务器”。)

创建〜/ .emacs.d/w3m.sh:

#!/bin/bash 

proxychains /usr/bin/w3m "[email protected]" 

定制的w3m:

(setq w3m-command "~/.emacs.d/w3m.sh") 

那么只有w3m使用代理。