Почему curl не работает с моим туннелем TLS ngrok?

Когда я запускаю curl --insecure 'https://foo.ngrok.io/page' в моем туннеле TLS к моему виртуальному хосту на основе IP-адреса Apache, я получаю ответ «400 Bad Request», в котором говорится: «Ваш браузер отправил запрос, который этот сервер не может понять ... Причина: вы говорите простой HTTP к серверному порту с поддержкой SSL... Вместо этого используйте схему HTTPS для доступа к этому URL-адресу, пожалуйста».

Однако, если я использую curl, чтобы сделать запрос непосредственно на мой локальный адрес, например. curl --insecure 'https://foo/page' Я получаю правильный ответ. Кроме того, если я делаю запрос в браузере к https://foo.ngrok.io/page, я получаю правильный ответ.

Я использую: OS X 10.9.5, Apache 2.4, ngrok2 и curl 7.43.0. Мой SSL-сертификат является самозаверяющим.

Что я заметил из своего журнала доступа, так это то, что когда я использую curl на foo.ngrok.io, мои запросы HTTP/1.1 меняются на запросы HTTP/1.0. Кроме того, вот соответствующие соответствующие биты из моего журнала ошибок:

ssl_engine_kernel.c(1824): [client 127.0.0.2:50517] OpenSSL: Exit: error in SSLv2/v3 read client hello A
[client 127.0.0.2:50517] AH01996: SSL handshake failed: HTTP spoken on HTTPS port; trying to send HTML error page
SSL Library Error: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request -- speaking HTTP to HTTPS port!?
protocol.c(616): [client 127.0.0.2:50517] Request received from client: GET / HTTP/1.0
http_filters.c(1042): [client 127.0.0.2:50517] Response sent with status 400, headers:

Конфигурация виртуального хоста Apache

Listen 127.0.0.2:443
<VirtualHost 127.0.0.2:443>
        ServerName foo
        DocumentRoot /Users/me/site
        ErrorLog "/usr/local/var/log/apache2/foo_error_log"
        CustomLog "/usr/local/var/log/apache2/foo_access_log" common
        <Directory "/Users/me/site">
                AllowOverride All
                Allow from All
                Options -Indexes
        </Directory>
        <IfModule ssl_module>
                SSLEngine on
                <Directory "/Users/me/site">
                        SSLOptions +StdEnvVars
                </Directory>
                SSLCertificateKeyFile "/usr/local/etc/apache2/2.4/ssl/foo.key"
                SSLCertificateFile "/usr/local/etc/apache2/2.4/ssl/foo.crt"
        </IfModule>
</VirtualHost>

Конфигурация Apache SSL

SSLRandomSeed startup file:/dev/urandom 512
SSLRandomSeed connect file:/dev/urandom 512
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLPassPhraseDialog  builtin
SSLSessionCache "shmcb:/usr/local/var/run/apache2/ssl_scache(512000)"
SSLSessionCacheTimeout 300

Конфигурация ngrok.yml

authtoken: <omitted>
tunnels:
  foo:
    addr: 127.0.0.2:443
    proto: tls
    hostname: "foo.ngrok.io"

person Travis J.    schedule 07.08.2015    source источник
comment
Примечание: реальная проблема не столько в том, что я не могу использовать curl, а в том, что сервисы, для которых я использую ngrok для создания веб-хуков, имеют ту же проблему.   -  person Travis J.    schedule 08.08.2015


Ответы (2)


В настоящее время HTTP-клиент (curl, браузер и т. д.) должен поддерживать SNI для связи с ngrok по HTTPS. Это касается как TLS, так и HTTP-туннелей ngrok.

person Travis J.    schedule 07.08.2015

Попытка добавить -k после вашей команды curl. Например:

curl https://www{domain}com.ngrok.io/webhook -k

person Sam Gruse    schedule 09.06.2017