質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

REST API接続時のSSLハンドシェイクエラーについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 266

peterpan

score 7

お問い合わせフォームとSalesForceのAPI連携を実施しております。
実施内容は下記の通りですが、curl_errorにより接続が出来ません。

// エラー内容
URL : https://test.salesforce.com/services/oauth2/token
Status : 0
response : error = , error_description = 
curl_error : error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
curl_errno : 35
// 連携用PHPファイルに記述した内容

// APIToolkit
require_once ('oauth/oauth.php');

define("DATABASEDOTCOM_CLIENT_ID", "Salesforce REST APIで接続するアプリケーションの「コンシューマ鍵」");
define("DATABASEDOTCOM_CLIENT_SECRET", "Salesforce REST APIで接続するアプリケーションの「コンシューマの秘密」");
define("DATABASEDOTCOM_CLIENT_USERNAME", "Salesforce REST API接続用のSalesforceユーザ");
define("DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD", "Salesforce REST API接続用のSalesforceユーザのパスワード");
define("DATABASEDOTCOM_HOST", "Salesforce REST APIエンドポイント");

///// Salesforce REST API接続用の設定
$CACHE_DIR = '/home/homepage/tmp/session';
$CALLBACK_URL = 'https://www.test.co.jp/contact/';

// Salesforce REST API接続用のOauthインスタンスを生成
$oauth = new oauth(DATABASEDOTCOM_CLIENT_ID, DATABASEDOTCOM_CLIENT_SECRET, $CALLBACK_URL, DATABASEDOTCOM_HOST, $CACHE_DIR);
// Salesforce REST API接続にあたりSalesforceへの認証を実行
$oauth->auth_with_password(DATABASEDOTCOM_CLIENT_USERNAME, DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD);

// 以下は省略
// oauth.phpの内容(一部を抜粋)
class oauth {
    public $client_id;
    public $client_secret;
    public $login_url;
    public $token_url;
    public $callback_url;
    public $access_token;
    public $refresh_token;
    public $instance_url;
    public $cache_dir;
    public $error = FALSE;
    public $error_msg = array();

    public function __construct($client_id, $client_secret, $callback_url, $login_url = 'https://login.salesforce.com', $cache_dir = '.'){
        $this->client_id = $client_id;
        $this->client_secret = $client_secret;
        $this->callback_url = $callback_url;
        $this->login_url = $login_url;
        $this->token_url = $login_url . "/services/oauth2/token";
        $this->cache_dir = $cache_dir;
    }
    public function auth_with_password($username, $password, $lifetime = 60){
        $this->refresh_cache_on_filesystem($lifetime);
        if ($this->error){
            return(FALSE);
        }
        $this->read_cache_from_filesystem();
        if ($this->error){
            return(FALSE);
        }
        if (empty($this->access_token) || empty($this->instance_url)){
            $fragment = "grant_type=password"
            . "&client_id=" . $this->client_id
            . "&client_secret=" . $this->client_secret
            . "&username=" . $username
            . "&password=" . urlencode($password);
            $response = $this->send($fragment);
            if ($this->error){
                // ここでFALSEがリターンされている。
                return(FALSE);
            }
            $this->access_token = $response['access_token'];
            $this->refresh_token = '';
            $this->instance_url = $response['instance_url'];
            $this->save_to_filesystem();
            if ($this->error){
                return(FALSE);
            }
        }
        return(TRUE);
    }

    private function send($fragment){
        $curl = curl_init($this->token_url);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $fragment);
        curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_1);
        $response = json_decode(curl_exec($curl), true);
        $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        if ($status == 400 && $response['error_description'] == 'expired authorization code') {
            //access code has been expired
            $this->set_error('new code required');
        } elseif ( $status != 200 ) {
       // エラー内容
            $this->set_error("<h1>Curl Error</h1><p>URL : $this->token_url </p><p>Status : $status</p><p>response : error = " . $response['error'] . ", error_description = " . $response['error_description'] . "</p><p>curl_error : " . curl_error($curl) . "</p><p>curl_errno : " . curl_errno($curl) . "</p>");
        }
        curl_close($curl);
        return($response);
    }
}


質問:
エラー内容「error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure」を解消する方法が分かりません。どのような原因が考えられますでしょうか?また、curlのバージョンに関しては下記の通りです。よろしくお願いいたします。
イメージ説明

参考にしたサイト:
https://qiita.com/na0AaooQ/items/157c28a80948c4b97bed

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

Salesforceでは、去年末の時点でTLS 1.2による接続を必須としています(公式)が、このコードではCURL_SSLVERSION_TLSv1_1とTLS 1.1による接続を試みています。

ライブラリのバージョン的にはTLS 1.2にも対応していそうなので、定数だけCURL_SSLVERSION_TLSv1_2に書き換えて接続できるか試してみましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/29 18:18

    エラーは解消されました。ご回答いただきありがとうございます。

    キャンセル

+1

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) 
のいずれかの値

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る