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

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

新規登録して質問してみよう
ただいま回答率
85.50%
cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

7395閲覧

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

peterpan

総合スコア19

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/06/29 08:55

編集2020/06/29 09:04

お問い合わせフォームと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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

投稿2020/06/29 09:01

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

peterpan

2020/06/29 09:18

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

0

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

投稿2020/06/29 09:30

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問