7

self-signed でクライアント認証を行おうとしています。

まず、証明書を作成しています:

CA 証明書

openssl genrsa -des3 -out ca.key 2048
openssl req -new -x509 -days 365 -key ca.key -out ca.crt

サーバー証明書

openssl genrsa -out server.key 1024
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 365

クライアント証明書

openssl genrsa -out client.key 1024
openssl req -new -key client.key -out client.csr
openssl x509 -req -in client.csr -out client.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 365

クライアント証明書を p12 に変換する

openssl pkcs12 -export -in client.crt -inkey client.key -name "My cert" -out client.p12

p12 証明書を開いてインストールします open client.p12

私のnode.jsサーバー(express.jsを使用)

var express = require('express')
    , routes = require('./routes')
    , user = require('./routes/user')
    , http = require('http')
    , path = require('path')
    , https = require('https')
    , fs = require('fs');

var app = express();

app.configure(function () {
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'ejs');
    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(app.router);
    app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function () {
    app.use(express.errorHandler());
});

app.get('/', function(req, res) {
    console.log(req.client.authorized);
    res.send(req.client.authorized)
});

var options = {
    key:fs.readFileSync('ssl/server.key'),
    cert:fs.readFileSync('ssl/server.crt'),
    ca:[fs.readFileSync('ssl/ca.crt')],
    requestCert:true,
    rejectUnauthorized:false,
    passphrase: 'passphrase',
    agent: false
    };

    https.createServer(options,app).listen(app.get('port'), function () {
        console.log("Express server listening on port " + app.get('port'));
    });

サーバーが実行されている場合https://localhost:3000、Chrome で開きますが、認証に合格しません: req.client.authorized は false

クロームメッセージは

The identity of this website has not been verified.
 • Server's certificate does not match the URL.

私の間違いはどこですか?

4

2 に答える 2

3

サーバー URL は、サーバー証明書の共通名部分と照合されます。

サーバー証明書要求を作成するときは、サーバーのホスト名を Common Name 部分に入れることを忘れないでください。ローカルで (アドレスとして使用して) テストするだけの場合はhttps://localhost、共通名として localhost を使用します。

于 2013-01-23T08:39:25.377 に答える
2

HTTPS サポートにより、 と を使用request.connection.verifyPeer()request.connection.getPeerCertificate()てクライアントの認証の詳細を取得します。

http://nodejs.org/api/http.html#http_request_connection

于 2013-01-17T19:18:43.113 に答える