Сделать доступ Emacs к HTTPS через прокси-сервер Socks

Эта проблема сводила меня с ума. У меня есть локальный прокси-сервер SOCKSv5, который является шлюзом для всех приложений в системе. Я бы хотел, чтобы url-retrieve-synchronously прошел через SOCKS. Со следующими настройками:

(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 работать поверх socks в Emacs? Моя версия 24.2.50/W32.

Я так понимаю, что по какой-то причине вместо socks-open-network-stream используется оригинальный open-network-stream. Я попытался установить точку останова url-open-stream с помощью edebug, но не смог понять, почему точка останова не срабатывает. Любые идеи?

Спасибо.


person zweibaranov    schedule 31.10.2013    source источник
comment
Я отследил проблему. В Emacs определенно есть ошибка. Есть макрос url-https-create-secure-wrapper, который создает обертку над функцией url-http; в обертке значение url-gateway-method перезаписывается значением tls. Это приводит к пропуску использования SOCKS и использованию вместо этого прямого шлюза для подключения. В настоящее время я понятия не имею, как взломать/обойти проблему.   -  person zweibaranov    schedule 31.10.2013
comment
переопределить url-https-create-secure-wrapper?   -  person Squidly    schedule 01.11.2013
comment
Не будет работать; по крайней мере, с моим знанием ELisp. Если я переопределю url-https-create-secure-wrapper, соединение будет проходить через SOCKS, но с простым согласованием HTTP, а не HTTPS. Оболочка должна использовать прокси-сервер SOCKS в качестве основного сетевого потока, но для HTTPS.   -  person zweibaranov    schedule 02.11.2013
comment
M-x report-emacs-bug если вы еще этого не сделали? (при условии, что это еще не исправлено?)   -  person phils    schedule 27.01.2014


Ответы (5)


Другой подход заключается в использовании программы proxychains для запуска emacs из командной строки, proxychains поддерживает прокси-протоколы HTTP socks4 и socks5. Код может быть:

proxychains emacs &

Излишне говорить, что вы должны настроить параметры прокси в proxychains, а не в emacs.

PS: Не забудьте установить proxychains в quiet_mode в его файле конфигурации (/etc/proxychains.conf), иначе подробный вывод может вас раздражать. Это не набор по умолчанию, по крайней мере, в Fedora.

person Zhao Gang    schedule 27.01.2014

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". Мой проход через DNS-серверы отражен в xterm. (Я использую Tor, а не «бесплатные анонимные серверы».)

person Community    schedule 17.04.2015

Это ошибка выше Emacs 26.3 в функции url-http, сигнатура url-http выглядит так:

(defun url-http (url callback cbargs &optional retry-buffer gateway-method) ...)

Необязательный аргумент gateway-method пытается перезаписать url-gateway-method, но закодирован неправильно:

(connection (url-http-find-free-connection 
                (url-host url)
                (url-port url)
                gateway-method))

Правильный способ сделать это:

(connection (url-http-find-free-connection 
                 (url-host url)
                 (url-port url)
                 (or gateway-method url-gateway-method)))

В версии Emacs 24 локальная переменная url-gateway-method была жестко закодирована как 'tls.

(defmacro url-https-create-secure-wrapper (method args)
  `(defun ,(intern (format (if method "url-https-%s" "url-https") method)) ,args
    ,(format "HTTPS wrapper around `%s' call." (or method "url-http"))
    (let ((url-gateway-method 'tls))
      (,(intern (format (if method "url-http-%s" "url-http") method))
       ,@(remove '&rest (remove '&optional args))))))

Исправление для версии Emacs >= 25:

(defadvice url-http (around url-http-around activate disable)
        "Fix the `url-gateway-method' bug in `url-http'."
        (if (eq 'socks url-gateway-method)
            (let ((gateway-method url-gateway-method))
              ad-do-it)
          ad-do-it))

Исправление для версии Emacs ‹ 25:

(defvar *url-gateway-method* nil
  "Alias of `url-gateway-method' used to fix the bug in `url-http'.")

(defadvice url-http (around url-http-around compile)
  "Fix the `url-gateway-method' bug in `url-https'."
  (let ((url-gateway-method (if (eq *url-gateway-method* 'socks)
                                'socks
                              'tls)))
    ad-do-it))

Наконец, вы можете просмотреть исправление здесь: https://github.com/junjiemars/.emacs.d/blob/cc/config/sockets.el.

person 南山竹    schedule 07.02.2020

Создайте ~/.emacs.d/w3m.sh:

#!/bin/bash

proxychains /usr/bin/w3m "$@"

Пользовательский w3m:

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

Тогда только w3m использует прокси.

person tangxinfa    schedule 15.12.2016

Исправлено в текущей версии emacs (проверено 25.2.2)

person user3601435    schedule 22.05.2018