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

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

ただいまの
回答率

90.51%

  • PHP

    24054questions

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

  • SSL

    596questions

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

  • POST

    272questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 3,412

s_t

score 4

以下のようなコードで、別サーバーに画像を保存する仕組みを作りました。
非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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2017/07/10 12:47

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

    キャンセル

  • s_t

    2017/07/10 13: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ファイルも存在します。

    キャンセル

  • tenpa

    2017/07/10 13:06 編集

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

    キャンセル

  • s_t

    2017/07/10 13:17

    説明が不足していて申し訳ありません。 現在テスト環境にて構築中ですので、同サーバー内で別ポートにそれぞれ送信用のphpと受信用のphpを設置しています。 例) 送信側 https://hoge.com:8000/send.php 受信側 https://hoge.com:8001/receive.php

    キャンセル

回答 2

+2

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

extension=php_openssl.dll
allow_url_fopen = On

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/07/10 13:37

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

    if(!extension_loaded("openssl")) {
    echo "openssl モジュールが無効";
    }else{
    echo "openssl モジュールが有効";
    }

    キャンセル

checkベストアンサー

+1

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/07/10 14:50

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

    キャンセル

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

  • PHP

    24054questions

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

  • SSL

    596questions

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

  • POST

    272questions

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