web-dev-qa-db-ja.com

Curlは「不明なプロトコル」を返します

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経由で接続しようとしていました。そのため、構成された仮想ホストで終了することはありませんでした。

これを修正するために、localhostからの接続のみを許可する127.0.0.1:80にバインドされた新しいVirtualHostエントリを作成しました。私の目的には、これで十分です。

15
Coo

OPの場合ではありませんが、通常ローカル開発中に、誤ってHTTPSを使用してHTTPサーバーを呼び出そうとすると、cURLにエラー「不明なプロトコル」が表示されます。
誰かがこのエラーをグーグルで見つけてここに着く場合に言及してください。

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

36
Elad

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
13
dreamlax

また、ここでの答え: node-request-エラー「SSL23_GET_SERVER_HELLO:unknown protocol」を取得

サーバーは古いSSLv2を使用しています... manページにあるようにこれを試すことができます:

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