尽管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的连接。就我的目的而言,这已经足够了。
答案 0 :(得分:34)
虽然不是OP的情况,但是当您不小心尝试使用HTTPS调用HTTP服务器时,通常在本地开发期间会出现cURL中的错误“未知协议”。
只要提一下,以防有人谷歌这个错误并落在这里。
curl: (35) error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
答案 1 :(得分:10)
我也遇到了curl的问题,事实证明我的环境变量有问题。
通常,您可以使用http_proxy
和https_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