卷曲返回“未知协议”

时间:2014-02-07 04:38:27

标签: apache curl ssl

尽管Google上有很多结果,但似乎没有人给出答案。我有一个Debian框,我这样做:

# curl https://localhost/api/v1/status --verbose
* About to connect() to localhost port 443 (#0)
*   Trying ::1...
* connected
* Connected to localhost (::1) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
* Closing connection #0
curl: (35) error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

我无法通过未知协议的事情。我试过-ssl -sslv3,但他们让我无处可去。实际上,-sslv3让我略有不同的结果:

s# curl https://localhost/api/v1/status --verbose -sslv3
* About to connect() to localhost port 443 (#0)
*   Trying ::1...
* connected
* Connected to localhost (::1) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS alert, Server hello (2):
* error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
* Closing connection #0

我的虚拟主机配置如此(片段):

    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM

    SSLCertificateFile    /etc/apache2/ssl.key/xxx/ssl.cert
    SSLCertificateKeyFile /etc/apache2/ssl.key/xxx/xxx.xxx.key

    #   Server Certificate Chain:
    SSLCertificateChainFile /etc/apache2/ssl.key/sub.class1.server.ca.pem

    #   Certificate Authority (CA):
    SSLCACertificateFile /etc/apache2/ssl.key/ca.pem

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
    </Directory>
    BrowserMatch "MSIE [2-6]" \
            nokeepalive ssl-unclean-shutdown \
            downgrade-1.0 force-response-1.0
    # MSIE 7 and newer should be able to use keepalive
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

任何帮助都将受到高度赞赏。

修改:更新 我想我发现了自己的问题!

虚拟主机绑定到外部接口,curl尝试通过localhost连接。所以它永远不会在配置的虚拟主机上结束。

为了解决这个问题,我创建了一个绑定到127.0.0.1:80的新VirtualHost条目,它只允许来自localhost的连接。就我的目的而言,这已经足够了。

3 个答案:

答案 0 :(得分:34)

虽然不是OP的情况,但是当您不小心尝试使用HTTPS调用HTTP服务器时,通常在本地开发期间会出现cURL中的错误“未知协议”。
只要提一下,以防有人谷歌这个错误并落在这里。

curl: (35) error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

答案 1 :(得分:10)

我也遇到了curl的问题,事实证明我的环境变量有问题。

通常,您可以使用http_proxyhttps_proxy环境变量来指定代理,但是我偶然为https_proxy使用了错误的值。

就我而言,我有:

http_proxy=http://a.b.c.d:3128/
https_proxy=https://a.b.c.d:3128/

这是错误的,因为(至少就我而言)https_proxy不应该使用HTTPS协议,它应该与http_proxy相同。一旦将两个代理环境变量都设置为仅使用http://a.b.c.d:3128/,一切都会再次起作用。

因此,如果这对其他人有帮助,请尝试:

http_proxy=http://a.b.c.d:3128/
https_proxy=http://a.b.c.d:3128/ # NOT HTTPS

答案 2 :(得分:6)

这里也是答案:node-request - Getting error "SSL23_GET_SERVER_HELLO:unknown protocol"

您的服务器使用的是过期的SSLv2 ...您可以尝试使用手册页中的内容:

curl https://localhost/api/v1/status --verbose --sslv2