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

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

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

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

SSL

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

PHP

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

Q&A

解決済

2回答

10160閲覧

別サーバーにSSL通信でPOSTデータを送るには?

s_t

総合スコア14

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

SSL

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

PHP

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

0グッド

2クリップ

投稿2017/07/10 03:44

以下のようなコードで、別サーバーに画像を保存する仕組みを作りました。
非SSLの送信であれば問題なくデータを送ることが出来るのですが、
httpsから始まるURLでは送信が失敗します。

使用言語:php $boundary = '-------------------'.microtime(true); $url = 'https://●●●/receive.php'; ←httpsのアドレスの場合、通信失敗 $headers = [ 'Accept-language: ja', 'Cookie: hash=12345abcde', 'Content-Type: multipart/form-data; boundary='.$boundary ]; $content = '--'.$boundary."\r\n". 'Content-Disposition: form-data; name="userfile"; filename="'.basename($filename).'"'."\r\n". 'Content-Type: text/plain'."\r\n\r\n". file_get_contents($filename)."\r\n". '--'.$boundary.'--'."\r\n"; $opts['http'] = [ 'method' => 'POST', 'header' => implode("\r\n", $headers), 'content' => $content, ]; $context = stream_context_create($opts); file_get_contents($url, false, $context);

送信の際に生じるエラーコードは以下です。
file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

ssl認証に失敗しているであろうことはエラーコードから理解できるのですが、
ではどのようにコードを記述すればよいのか、ということが分かりません。

いくらか調べてみたのですが良い方法が見つからなかったもので、
ご教示頂けますと幸いです。

※使用環境
PHP 7.1.2

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

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

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

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

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

CHERRY

2017/07/10 03:47

var_dump(openssl_get_cert_locations()); の結果と ファイルが存在するか 確認してください。
s_t

2017/07/10 04:03

var_dump(openssl_get_cert_locations()); の結果です。 array(8) { ["default_cert_file"]=> string(21) "/etc/pki/tls/cert.pem" ["default_cert_file_env"]=> string(13) "SSL_CERT_FILE" ["default_cert_dir"]=> string(18) "/etc/pki/tls/certs" ["default_cert_dir_env"]=> string(12) "SSL_CERT_DIR" ["default_private_dir"]=> string(20) "/etc/pki/tls/private" ["default_default_cert_area"]=> string(12) "/etc/pki/tls" ["ini_cafile"]=> string(0) "" ["ini_capath"]=> string(0) "" } また/etc/pki/tls/cert.pemファイルも存在します。
mosapride

2017/07/10 04:06 編集

サーバー(ここでは別サーバー)にサーバー証明書をインストール済みですか?
guest

回答2

0

php.iniの設定でopen sslの設定は問題ないでしょうか。
下記参考。

extension=php_openssl.dll allow_url_fopen = On

投稿2017/07/10 04:16

y_nishizawa

総合スコア154

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

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

s_t

2017/07/10 04:37

ご回答ありがとうございます。 当サーバーのphp.iniには、参考にご記入頂いた行は存在しなかったのですが、 以下にて試したところ、"モジュールが有効"と表示されました。 if(!extension_loaded("openssl")) { echo "openssl モジュールが無効"; }else{ echo "openssl モジュールが有効"; }
guest

0

ベストアンサー

自己署名証明書をお使いでしょうか?

その場合以下のコードを$opts["http"]の下辺りに追加でいけるはずです。

$opts["ssl"] => array( "allow_self_signed" => true, "verify_peer" => false, "verify_peer_name" => false, ); $context = stream_context_create($opts);

投稿2017/07/10 05:35

moonphase

総合スコア6621

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

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

s_t

2017/07/10 05:50

ご回答ありがとうございます。 記入頂いたコードを挿入することで、問題なくデータを送信することが出来ました。 大変助かりました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問