web-dev-qa-db-ja.com

node.jsリクエストモジュールを使用して、自分の証明書でSSL呼び出しを行うにはどうすればよいですか?

Node.jsとこのリクエストモジュールを使用して、別のサーバーにHTTP呼び出しを行っています。

https://github.com/mikeal/request

それは素晴らしい働きをします。私の会社のSSL証明書を使用して、SSL経由で呼び出しを行うようにこのコードを変更する必要があります。リクエストモジュールのドキュメントでは、strictSSLオプションについて次のように述べています。

「strictSSL-SSL証明書が有効であることを要求するにはtrueに設定します。注:独自の認証局を使用するには、そのcaをオプションとして作成されたエージェントを指定する必要があります。」

これは私がする必要があるように聞こえますが、「そのcaをオプションとして使用して作成されたエージェントを指定してください。」というフレーズがわかりません。

1)「エージェント」とはどういう意味ですか? 2)「エージェントを指定する」方法3)「そのcaをオプションとして使用して」エージェントを作成する方法を教えてください。

コード例はすばらしいでしょうが、どんなリードも役に立ちます。ありがとう。

19
Jake

これは主に Peter Lyonsの回答 について詳しく説明し、例を示します。

your認証局(ca)によって署名された証明書を使用して、HTTPSで実行されているドメインをリクエストしていると想定しています。

request library を使用する場合は、実際にエージェントをインスタンス化する必要はありません。作成するリクエストにagentOptionsを提供するだけです。次に例を示します。

request({
  method: "POST",
  uri: "https://localhost/entries",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    name: "someEntry"
  }),
  agentOptions: {
    ca: fs.readFileSync("certs/ca.cert.pem")
  }
}, function(error, httpResponse, body) {
  //handle response
});

ここで重要なのは、CAの証明書を提供するagentOptionsです。 caによって署名された証明書を使用するすべてのドメインが受け入れられます。 ca CA1が3つのドメインD1D2Dに署名したと想像してください。 caをCA1に設定すると、すべてのドメインへのリクエストが許可されますD1D2D(ただし、 D4別のCAによって署名されています)。

ポイントは:"certs/ca.cert.pem"は、署名認証局の証明書でなければなりません。

10
  1. 「エージェント」とは、ノード標準のhttpモジュールの http.Agent のインスタンスを意味します
  2. ドキュメントは、このエージェントインスタンスがrequestオプションのpoolに渡されることを示しています。コードのスキミングに基づいて、私はあなたがoptions.ca
  3. リクエストが直接サポートされているようですoptions.caおよび ここで使用 in getAgent

だから私の推測はおそらくoptions.caは、会社の認証局の公開鍵である文字列として、リクエストがそこから正しいことを行うかどうかを確認します。

4
Peter Lyons
const request = require('request');

request.post({
                url: strRSAUrl,
                agentOptions: {
                    ca: fs.readFileSync('path-to-cacert.pem')
                },
                form: {
                    some_key: some_value,
                }
            }, function (error, response, body) {
                objResponse.send(body);
            });

詳しくは nodejs#request

2
RIYAJ KHAN

私は同じ問題に遭遇し、周囲を掘り下げました、そして最後に私はこのテストケースが私たちが必要とするものの最良の例であることがわかりました:

https://github.com/mikeal/request/blob/63f31cb1d170a4af498fbdd7566f867423caf8e3/tests/ssl/ca/server.js

1
Michael Yin

おそらく私は問題を誤解しているかもしれませんが、私の経験では、あなたがrequire('https')であれば、何も特別なことをする必要はなく、呼び出しは自動的にSSL経由で行われます。

私はこれを私のgoogle maps api呼び出しでテストし、実際にrequire('http') GoogleがSSL経由で呼び出しを受信することを望んでいると不平を言っていますが、sを追加するとすべてが期待どおりに機能します。

0
Genia S.