旅する情報系大学院生

旅と留学とプログラミング

超古いサーバーからhttpsにcurlする時

curl: (35) Unknown SSL protocol error in connection to www.example.com:443

こんなエラーメッセージが出るときは、curlが使っているopensslのバージョンが古くて、tlsv1.2以降がサポートされていないのかもしれません。

curlとopensslのバージョンを確認する

$ curl -V
$ openssl version

opensslのバージョンが0.9.hogeだった場合はtlsの最近のバージョンがサポートされていないので、おそらくこれが原因です。

実際に通信しているsslのプロトコルを調べる

$ curl -v https://www.example.com

標準エラー出力の中に以下のような行がある。

SSL connection using TLS1.2 / ECDHE_RSA_AES_128_GCM_SHA256

opensslのビルド

公式サイトから新しいopensslをダウンロードしてきます。

$ export CFLAGS=-fPIC
$ ./config --shared
$ make -j 4
$ sudo make install

正しくインストールされているか確認する

openssl version

パスを通しておく

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ssl/lib

curlをビルドする

公式サイトから新しいcurlをとってきます。

$ ./configure --with-ssl=/usr/local/ssl
$ make -j 4
$ sudo make install

with-sslがないと新しいopensslが使われないので大事。

バージョンを確認する。Protocolsにhttps,FeaturesにTLSがあることを確認する。

$ curl -V
curl 7.33.0 (x86_64-unknown-linux-gnu) libcurl/7.33.0 OpenSSL/1.0.1g zlib/1.2.3.3 libidn/1.15
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP

これでhttpsに対してもcurlが動くはず

トラブルシューティング

$ curl: (1) Protocol https not supported or disabled in libcurl

こんなエラーメッセージが出た時は、curlをビルドするときにopensslが紐づけられていないのでhttpsに非対応になっている。--with-sslをつけてconfigureしよう。
curlを./configureするとエラー出力の一番最後にビルド情報が載っていて、そこに対応プロトコルが載っているはず。httpsに対応していることを確認する。