6

このテストプログラムはhttpsサーバーに接続し、コンテンツを取得します。ブラウザとcurlでサーバーを確認しましたが、証明書は正しく機能しています。curlを実行してサーバーからデータを取得すると、-cacertを使用して渡すか、-kを使用してセキュリティをオフにしない限り、証明書が不明であると正しく文句を言います。

ですから、私が抱えている問題は、クライアントが証明書認証を行う必要があると思い、公開証明書がどこにあるかを伝えているにもかかわらず、常に機能するということです。ca:オプションを削除して、サーバーからの証明書が何であるかわからない場合は、サイレントに機能します。認証エラーをキャッチしたいのですが、キャッチできないようです。

var https = require('https');
var fs = require('fs');

function main() {

      var data = '';

      var get = https.get({
        path: '/',
        host: 'localhost',
        port: 8000,
        agent: false,
        ca: [ fs.readFileSync('https_simple/cacert.pem') ]

      }, function(x) {

        x.setEncoding('utf8');
        x.on('data', function(c) {data += c});
        x.on('error', function(e) {
          throw e;
        });
        x.on('end', function() {
          console.log('Hai!. Here is the response:');
          console.log(data);
        });

      });

      get.on('error', function(e) {throw e});

      get.end();

    }

main();
4

4 に答える 4

10

これを機能させるには、rejectUnauthorized 機能が https.get に追加されている v0.7.8 にアップグレードする必要がありました (ただし、v0.7 は問題ありません)。

次のオプションの組み合わせが必要です。

agent: false, // or you can supply your own agent, but if you don't you must set to false
rejectUnauthorized: true, 
ca: [ fs.readFileSync('https_simple/cacert.pem') ]

認証が失敗すると、「エラー」イベントが発生し、リクエストは処理されません。

独自のエージェントを作成する方法の詳細については、https.request のドキュメントを参照してください。

この変更でバグ修正がコミットされました: https://github.com/joyent/node/commit/f8c335d0

于 2012-04-20T03:55:18.273 に答える
5

ドキュメントによるとhttps.request、 と の両方のオプションcaはのオプションです。モジュール関数のオプションのドキュメントには、次のように記載されています。https.gethttps.requesttls.connecttls.connect

ca: 信頼できる証明書の文字列またはバッファーの配列。これを省略すると、VeriSign などのよく知られている「ルート」CA がいくつか使用されます。これらは、接続を承認するために使用されます。

node.js ソースを掘り下げると、使用されているルート証明書は次の場所にあります: https://github.com/joyent/node/blob/master/src/node_root_certs.h

つまり、モジュールへhttps.getのオプションとして権限証明書が提供されていない場合tls、とにかくルート証明書のリストを使用して接続を認証しようとします。

于 2012-04-17T21:59:58.590 に答える
2

リクエストモジュールを使用して、npmでこれを行います。こんなふうになります:

var cacert = ... // in npm, this is a config setting
var request = require("request")
request.get({ url: "https://...",
              ca: cacert,
              strictSSL: true })
  .on("response", function (resp) { ... })
  .on("error", function (er) { ... })

sslが有効でない場合、エラーイベントが発生します。

于 2012-04-20T05:14:17.290 に答える
1

V 0.6.15では、証明書の検証が成功したか失敗したかを明示的に確認する必要があります。

if (x.connection.authorized === false) {    
   console.log('SSL Authentication failed');
} else if (x.connection.authorized === true) {    
   console.log('SSL Authentication succeeded');
} 
于 2012-04-19T05:38:08.817 に答える