4

Node.JS を SSL とクライアント証明書で動作させようとしています。もともと、私はそれをrestifyで動作させようとしていました(ここで私の質問を参照してください)。それがうまくいかなかったとき、私は後戻りして、私が達成しようとしていることを説明する例を見つけようとしました。これを試してみましたが、奇妙なエラーが発生しました。

コードは次のとおりです。

サーバ:

var sys = require("sys");
var fs = require("fs");
var https = require("https");

var options = {
  key: fs.readFileSync("../certs/server.key"),
  cert: fs.readFileSync("../certs/server.crt"),
  ca: fs.readFileSync("../certs/ca.crt"),
  requestCert: true,
  rejectUnauthorized: true
};

https.createServer(options, function (req, res) {
  console.log(req);
  res.writeHead(200);
  sys.puts("request from: " + req.connection.getPeerCertificate().subject.CN);
  res.end("Hello World, " + req.connection.getPeerCertificate().subject.CN + "\n");
}).listen(8080);

sys.puts("server started");

クライアント:

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

var options = {
    host: 'localhost',
    port: 8080,
    path: '/hello',
    method: 'GET',
    key: fs.readFileSync("../certs/user.key"),
    cert: fs.readFileSync("../certs/user.crt"),
    ca: fs.readFileSync("../certs/ca.crt"),
    passphrase: 'thepassphrase'
};

var req = https.request(options, function(res) {
    console.log("statusCode: ", res.statusCode);
    console.log("headers: ", res.headers);

    res.on('data', function(d) {
        process.stdout.write(d);
    });
});

req.end();

req.on('error', function(e) {
    console.error(e);
});

test-client.js を実行すると、次のようになります。

{ [Error: socket hang up] code: 'ECONNRESET' }

curl で同じようなことを試みる:

curl -k -v --key user.key --cert user.crt:thepassphrase --cacert ca.crt https://localhost:8080/hello

収量:

* About to connect() to localhost port 8080 (#0)
*   Trying 127.0.0.1... connected
* successfully set certificate verify locations:
*   CAfile: ca.crt
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Request CERT (13):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS handshake, CERT verify (15):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* Unknown SSL protocol error in connection to localhost:8080 
* Closing connection #0
curl: (35) Unknown SSL protocol error in connection to localhost:8080

クライアント証明書を要求するために追加の手順を実行したい場合、どうすればよいですか?

4

2 に答える 2

3

このサーバーをnginxの背後に置くのはどうですか?

これは複雑に聞こえたり、多くのオーバーヘッドが追加されたりするかもしれませんが、本当にシンプルで、nginx の SSL 処理は簡単であることをお約束します。

nginx によるプロキシを探します( example )。

PS
両方のアプリは、おそらく同じサーバーマシンに存在できます。

于 2012-10-23T10:51:51.813 に答える
2

rejectUnauthorized: falseサーバー オプションとクライアント オプションの両方を追加します。

これにより、nodejs は自己署名証明書を受け入れるようになります。https://github.com/vanjakom/JavaScriptPlayground/pull/3も参照してください。

于 2016-03-09T16:10:55.703 に答える