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

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

ただいまの
回答率

90.84%

  • JavaScript

    14778questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    1678questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • HTTPS

    226questions

    HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Node.jsでhttpsプロキシを立てcurlで繋ぐと、curl側でエラーが出てしまう

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 559

akakou

score 26

前提・実現したいこと

HTTPSでクライアント及びgoogle.comに接続するLプロキシを書こうとしたのですが、デバッグとして以下のコマンドでcurlで繋ごうとしたところ、エラーが出てしまいます。

curl -v --proxy-insecure -x https://localhost -L http://google.com

発生している問題・エラーメッセージ

curlには以下のようなエラーが出ました。

* Rebuilt URL to: http://google.com/
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* Proxy certificate:
*  subject: //
*  start date: Oct  4 22:59:50 2017 GMT
*  expire date: Oct  4 22:59:50 2018 GMT
*  issuer: //
*  SSL certificate verify result: self signed certificate (18), continuing anyway.
> GET http://google.com/ HTTP/1.1
> Host: google.com
> User-Agent: curl/7.56.0
> Accept: */*
> Proxy-Connection: Keep-Alive
> 
< HTTP/1.1 302 Found
< cache-control: private
< content-type: text/html; charset=UTF-8
< referrer-policy: no-referrer
< location: https://www.google.co.jp/?gfe_rd=cr&dcr=0&ei=SRrxWYrHMbHU8AeByq2ABg
< content-length: 272
< date: Wed, 25 Oct 2017 23:12:09 GMT
< alt-svc: quic=":443"; ma=2592000; v="39,38,37,35"
< connection: close
< 
* Closing connection 0
* TLSv1.2 (OUT), TLS alert, Client hello (1):
* Issue another request to this URL: 'https://www.google.co.jp/?gfe_rd=cr&dcr=0&ei=SRrxWYrHMbHU8AeByq2ABg'
* Hostname localhost was found in DNS cache
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 443 (#1)
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server accepted to use http/1.1
* Proxy certificate:
*  subject: //ここは隠します
*  start date: Oct  4 22:59:50 2017 GMT
*  expire date: Oct  4 22:59:50 2018 GMT
*  issuer: // ここは隠します
*  SSL certificate verify result: self signed certificate (18), continuing anyway.
* allocate connect buffer!
* Establish HTTP proxy tunnel to www.google.co.jp:443
> CONNECT www.google.co.jp:443 HTTP/1.1
> Host: www.google.co.jp:443
> User-Agent: curl/7.56.0
> Proxy-Connection: Keep-Alive
> 
* Proxy CONNECT aborted
* CONNECT phase completed!
* Connection #1 to host localhost left intact
curl: (56) Proxy CONNECT aborted

該当のソースコード

var httpProxy = require('http-proxy');
var fs = require('fs');

var config = {
  port: process.env['PORT'], // 443

  ssl: {
    key: fs.readFileSync(__dirname + process.env['SSL_KEY'], 'utf8'), // ssl key
    cert: fs.readFileSync(__dirname + process.env['SSL_CERT'], 'utf8') // ssl cert
  }
};


var proxy = httpProxy.createServer({
    ssl: config.ssl,
    target: 'https://google.com',
    secure: true
}).listen(config.port);


proxy.on('proxyReq', function (proxyReq, req, res) {
  console.log('proxyReq');
});

proxy.on('proxyRes', function(proxyRes, req, res) {
  console.log('proxyRes');
});

console.log('Server running at https://localhost:' + config.port);

試したこと

実行してみたところ以下の文字列は表示されてましたので、最後にクライアントへのレスポンス送信がうまくいってないのかと思います。

proxyReq
proxyRes

補足情報(言語/FW/ツール等のバージョンなど)

  • node.js
  • docker, docker-compose
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • shimitei

    2017/10/24 18:59

    curl -v --proxy-insecure -x https://localhost -L http://google.comとverboseオプションを付けると、より詳しいやり取りの情報が出ます。

    キャンセル

  • akakou

    2017/10/26 08:21

    ありがとうございます!参考になります!

    キャンセル

まだ回答がついていません

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

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

関連した質問

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

  • JavaScript

    14778questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    1678questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • HTTPS

    226questions

    HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。