web-dev-qa-db-ja.com

cURLでTLS 1.2が機能しない

TLS1.2を使用するHTTPS URLのカールに問題があります。カール操作でログインデータをWebサイトに投稿し、cookiefileに保存します。私が得ているエラーメッセージはこれです

 error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error

VERIFYPEERVERIFYHOSTを0に設定しようとしましたが、うまくいかないようですが、提案はありますか?

私が使用しているバージョンは次のとおりです。

  • OpenSSLバージョンは0.9.8bです
  • CURLバージョンは7.24.0です
  • PHPは5.3

コードは次のとおりです。

$setuplogin = curl_init(); 
curl_setopt ($setuploginurl, CURLOPT_URL, $url); 
curl_setopt ($setuploginurl, CURLOPT_SSL_VERIFYPEER, 1); 
curl_setopt ($setuploginurl, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt ($setuploginurl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1_2');
curl_setopt ($setuploginurl, CURLOPT_POSTFIELDS, 'username=uname&password=pword&act=login&submit=Login');
curl_setopt ($setuploginurl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36"); 
curl_setopt (setuploginurl, CURLOPT_TIMEOUT, 60); 
curl_setopt ($setuploginurl, CURLOPT_COOKIESESSION, TRUE); 
curl_setopt ($setuploginurl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($setuploginurl,  CURLOPT_HEADER, 1);
curl_setopt ($setuploginurl,CURLOPT_ENCODING,"gzip");
curl_setopt ($setuploginurl, CURLOPT_POST, true);
curl_setopt ($setuploginurl, CURLOPT_COOKIEJAR, 'cookies.txt'); 
curl_setopt ($setuploginurl, CURLOPT_FRESH_CONNECT , 1);

$loginp= curl_exec($setuploginurl); 
if ($loginp === FALSE) {
    die(curl_error($setuploginurl));
}

curl_close ($setuploginurl); 
var_dump ($loginp);
24
Sam Ash

CURLOPT_SSLVERSION値には整数値を使用する必要があります。上記の文字列ではありません

これを試して:

curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, 6); //Integer NOT string TLS v1.2

http://php.net/manual/en/function.curl-setopt.php

値は、オプションパラメータの次の値の整数である必要があります:CURLOPT_SSLVERSION

の一つ

CURL_SSLVERSION_DEFAULT(0)
CURL_SSLVERSION_TLSv1(1)
CURL_SSLVERSION_SSLv2(2)
CURL_SSLVERSION_SSLv3(3)
CURL_SSLVERSION_TLSv1_0(4)
CURL_SSLVERSION_TLSv1_1(5)
CURL_SSLVERSION_TLSv1_2(6)。

52
Jeff

OpenSSL 1.0.1 以来、TLS 1.1およびTLS 1.2がサポートされています

TLS 1.1および1.2の強制は、 curl 7.34. からのみサポートされます

アップグレードを検討する必要があります。

24
umka

私はストライプのコンテキストで同様の問題があります:

エラー:Stripeは、TLS 1.0で行われたAPI要求をサポートしなくなりました。 TLS 1.2以降でHTTPS接続を開始してください。これについて詳しくは https://stripe.com/blog/upgrading-tls をご覧ください。

CURLパラメーターを使用してTLS 1.2を強制することは一時的な解決策であり、更新を配置するスペースがないために適用することさえできません。デフォルトでは、TLSテスト機能 https://Gist.github.com/olivierbellone/9f93efe9bd68de33e9b3a3afbd3835cf は次の構成を示しました。

SSL version: NSS/3.21 Basic ECC
SSL version number: 0
OPENSSL_VERSION_NUMBER: 1000105f
TLS test (default): TLS 1.0
TLS test (TLS_v1): TLS 1.2
TLS test (TLS_v1_2): TLS 1.2

次のコマンドを使用してライブラリを更新しました。

yum update nss curl openssl

そして、これを見ました:

SSL version: NSS/3.21 Basic ECC
SSL version number: 0
OPENSSL_VERSION_NUMBER: 1000105f
TLS test (default): TLS 1.2
TLS test (TLS_v1): TLS 1.2
TLS test (TLS_v1_2): TLS 1.2

デフォルトのTLSバージョンが1.2に変更されたことに注意してください!それは世界的に解決された問題です。これはPaypalユーザーにも役立ちます: https://www.Paypal.com/au/webapps/mpp/tls-http-upgrade (2017年6月末までに更新)

13

以下を交換

curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1_2');

curl_setopt ($ch, CURLOPT_SSLVERSION, 6);

完璧に動作するはずです。

1
Tauseef

TLS 1.2OpenSSL 1.0.1メジャーバージョンリリースのセクション を参照)以降でのみサポートされているため、OpenSSLを更新する必要があります。

CURLOPT_SSLVERSIONオプションを設定する必要はありません。要求には、サーバーとクライアントの両方のサポートを含む最新のTLSバージョンを適用するハンドシェイクが含まれます。要求するサーバーはTLS 1.2を使用しているため、OpenSSLバージョンがphp_curlである(またはそれより新しい)場合は、TLS 1.2も(デフォルトで)1.0.1を使用します。

0
shintaroid