2013-01-17 17 views
7

Próbuję uzyskać autoryzację klienta z autopodpisem.Autoryzacja klienta SSL na węźle node.js

pierwsze, jestem tworzenie certyfikaty:

certyfikat CA

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

certyfikat serwera

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 

sertificate Client

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 

Konwersja klient certy ficate do p12

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

Otwórz i zainstalować certyfikat p12 otwarty client.p12

Serwer node.js (używając 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')); 
    }); 

Kiedy serwery działa, otwieram https://localhost:3000 w Chrome, ale uwierzytelnianie nie przekazuje: req.client.authorized jest fałszywe

Komunikat Chrome to

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

Gdzie jest mój błąd?

Odpowiedz

2

Przy obsłudze protokołu HTTPS należy użyć request.connection.verifyPeer() i request.connection.getPeerCertificate(), aby uzyskać szczegóły uwierzytelniania klienta.

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

+0

Żądanie certyfikatu klienta jest już aktywne w kodzie przykładowym za pomocą 'requestCert: true'. Serwer nie może zażądać certyfikatu klienta w procedurze obsługi żądań; musi być skonfigurowany w opcjach serwera, ponieważ wymiana certyfikatów odbywa się w ramach uzgadniania SSL (tj. przed przetworzeniem żądania). – ttreitlinger

3

URL serwera jest porównywana wspólną nazwą części certyfikatu serwera.

Podczas tworzenia żądania certyfikatu serwera pamiętaj, aby umieścić nazwę hosta serwera na części Common Name. Jeśli właśnie testujesz lokalnie (używając adresu https://localhost), użyj localhost jako Common Name.

Powiązane problemy