87

私はコードを持っています:

var r = require('request');
r({
  method: 'POST',
  url: 'https://api.dropbox.com'},
  function() { console.log(arguments)  } )

Node 0.9.4 のデスクトップで実行すると、コンソールに次のように表示されます。

{ '0': [Error: Hostname/IP doesn't match certificate's altnames] }

Node 0.6.12 の Netbook で実行すると、すべてエラーなしで動作します (302 応答 - 正しいと思います)。

問題のNode.js hostname/IP doesn't match certificates altnames について、Rojuinex は次のように書いています。「ブラウザの問題」とはどういう意味ですか?

アップデート。この問題は、Node v0.8 でのロールバック後に解決されました

4

12 に答える 12

42

少し更新された回答(さまざまな状況でこの問題に遭遇したため)。

SSL を使用してサーバーに接続すると、サーバーは最初に「私は api.dropbox.com です」という証明書を提示します。証明書には「サブジェクト」があり、サブジェクトには「CN」(「共通名」の略) があります。証明書には、1 つ以上の「subjectAltNames」も含まれる場合があります。node.js がサーバーに接続すると、node.js はこの証明書を取得し、接続先 (api.dropbox.com) と見なされるドメイン名がサブジェクトの CN または代替名のいずれかと一致することを確認します。ノード 0.10.x では、IP を使用して接続する場合、IP アドレスを altnames に含める必要があることに注意してください。node.js は CN に対して IP を検証しようとしません。

フラグを false に設定するrejectUnauthorizedと、このチェックを回避できますが、まず第一に、サーバーが予想とは異なる資格情報を提供している場合、何か怪しいことが起こっており、第二に、これは他のチェックもバイパスします。インターネット経由で接続しています。

ノード >= 0.11.x を使用している場合はcheckServerIdentity: function(host, cert)、tls モジュールに関数を指定することもできます。これは、接続を許可する場合は戻り、それ以外の場合は例外をスローする必要があります (ただし、このフラグをプロキシするundefinedかどうかはわかりません)そのような関数を宣言し、一体何が起こっているのかを理解することはrequest便利です。console.log(host, cert);

于 2015-01-21T15:56:09.487 に答える
13

私はこれが古いことを知っていますが、探している他の人にとっては:

ホスト名から https:// を削除し、代わりにポート 443 を追加します。

{
  method: 'POST',
  hostname: 'api.dropbox.com',
  port: 443
}
于 2015-02-10T13:14:01.517 に答える
8

証明書が既知の認証局 (CA) によって発行されたことを確認した後、ホスト名が一致することを確認するために、サブジェクトの別名がチェックされるか、共通名がチェックされます。これはcheckServerIdentity 関数にあります。証明書にサブジェクトの別名があり、ホスト名がリストされていない場合は、次のエラー メッセージが表示されます。

ホスト名/IP が証明書の代替名と一致しません

使用している証明書を生成するために使用される CA 証明書がある場合 (通常、自己署名証明書を使用する場合)、これは

var r = require('request');

var opts = {
    method: "POST",
    ca: fs.readFileSync("ca.cer")
};

r('https://api.dropbox.com', opts, function (error, response, body) {
    // do something
});

これにより、提供された CA によって証明書が発行されたことが確認されますが、ホスト名の確認は引き続き実行されます。証明書の Subject Alternative Names にホスト名が含まれている場合は、CA を指定するだけで十分です。そうでなく、ホスト名の検証もスキップしたい場合は、noop 関数を渡すことができますcheckServerIdentity

var r = require('request');

var opts = {
    method: "POST",
    ca: fs.readFileSync("ca.cer"),
    agentOptions: { checkServerIdentity: function() {} }
};

r('https://api.dropbox.com', opts, function (error, response, body) {
    // do something
});
于 2018-07-06T01:10:01.953 に答える