web-dev-qa-db-ja.com

osx 10.10 Curl POST HTTPS URLにSSLRead()エラーが発生する

最近OSX 10.10 Yosemiteにアップグレードしましたが、アップグレード以来、SSL URLに対してCurl POST。

私は最初にワードプレスのwp_remote_requestを呼び出し、PHPでcurlを使用しようとしました。両方とも(予想どおり)同じエラーメッセージが表示されます。

エラー番号:56

エラー文字列:SSLRead()はエラー-9806を返します

注:私がPOST=を設定すると正常に動作します。PHP.iniまたはApacheの設定だと思います(アップグレード後に元のHTTPD.confファイルを失いました...) 。

誰も私を助けることができますか?

72
Mattijs

Yosemiteで AppleのSecure Transport を使用するcURLのバージョンでphpがコンパイルされ、URLリクエストのターゲットがSSLv3をサポートしていない場合(おそらく プールの脆弱性 )。このコマンドの出力は何ですか?

_$ php -i | grep "SSL Version"
_

これが表示されると思います。

_SSL Version => SecureTransport
_

SecureTransportの代わりにOpenSSLを使用するcURLのバージョンを使用するphpのバージョンをインストールすることにより、これを克服できます。これは、 homebrew で最も簡単に実行できます。まだお持ちでない場合は、最初にインストールしてください。 homebrewがインストールされているが、Yosemiteにアップグレードしてから_brew update_を実行していない場合は、最初に実行してください。また、XCode> = 6.1および最新のXCodeコマンドラインツールがインストールされていることを確認してください。 _brew doctor_は、あなたがそれをうまくやったかどうかを教えてくれます。

Brewed phpをインストールするために必要なHomebrewタップを以下に追加します。これらのリポジトリが既にタップされている場合は、この手順をスキップしてください。これらのリポジトリが既にタップされているかどうか不明な場合は、以下のコマンドを実行してください。最悪のシナリオでは、無害な_Warning: Already tapped!_を取得します

_$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/php
_

次に、opensslでcurlをインストールします。

_$ brew install --with-openssl curl
_

次に、インストールしたばかりのcurlを使用してphpをインストールし、opensslを作成します。

_$ brew install --with-homebrew-curl --with-httpd24 php55
_
  • apacheを使用している場合は、必ず_LoadModule php5_module /usr/local/opt/php55/libexec/Apache2/libphp5.so_を_/etc/Apache2/httpd.conf_に追加して、Apacheを再起動してください。

  • apache 2.4を使用していない場合は、上記のコマンドから_--with-httpd24_を削除できます。

  • nginxを使用している場合は、fpmを開始する際の注意事項に従ってください。

    起動時にphp-fpmを起動するには:

    _mkdir -p ~/Library/LaunchAgents
    cp /usr/local/opt/php55/homebrew.mxcl.php55.plist ~/Library/LaunchAgents/
    launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php55.plist
    _

必要なPHP拡張機能をインストールします。 mcrypt

_$ brew install php55-mcrypt
_

完了したら、これを再度実行します。

_$ php -i | grep "SSL Version"
_

表示されるはずです:

_SSL Version => OpenSSL/1.0.2h
_

そして今、アプリケーションを再テストすると、SSLRead() return error -9806は消えます。

142
Asaph

このSSLエラー(OSStatusコード:9806)は、接続の確立エラー(無効なコマンドなど)により、サーバーによって接続が終了したことを意味します。これは、リモートホストへのSSL接続が途中で途切れる場合にのみ発生するようです。

これは、SSLマニュアル( SSL_get_error )、ただし、このエラーメッセージはSecureTransport/Darwinssl TLSバックエンドで使用されるlibcurl builtから来ます(OSStatusはSecureTransport.hヘッダーファイル):

errSSLClosedAbort           = -9806,    /* connection closed via error */

私の経験から、これは通常、プロキシの背後にいるとき、または認証メカニズムを使用する限られたネットワークに接続しているときに起こります。

そのため、適切なネットワークに(WiFi経由で)接続されており、他のHTTPSが正しく機能していることを確認してください。そうでない場合は、プロキシ資格情報を指定する必要があるか、ISPが証明書チェーンをオーバーライドして何らかの認証を必要とするか、基本的にファイアウォールの特定のサイトへのアクセスをブロックしているかどうかを確認します。

5
kenorb

SSLRead() return error -9806エラーで同様の問題が発生し、SSL Version => SecureTransport

しかし、私の場合は、問題はcurl CURLOPT_HTTP_VERSIONオプション:

$curl = curl_init();    
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);

このオプションを削除すると、cURLがデフォルトで使用するバージョンを決定します。詳細については、 curl_setopt documentationを確認してください。

それは私のために働いた、と私はcURLやPHPで何かを変更する必要はありませんでした。しかし、これは、error -9806が表示されます。

1
Daniel Batalla