2013-01-17 32 views
7

पर मैं स्वयं हस्ताक्षरित के साथ क्लाइंट प्राधिकरण बनाने की कोशिश कर रहा हूं।क्लाइंट एसएसएल प्रमाणीकरण node.js

सबसे पहले, मैं `बनाने प्रमाण पत्र:

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 

ग्राहक sertificate

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 

Convert ग्राहक प्रमाण p12

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

ओपन के ficate और स्थापित p12 प्रमाण पत्र खुला 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 क्रोम में, लेकिन प्रमाणीकरण पास नहीं होता है: req.client.authorized झूठा

क्रोम संदेश

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

मेरी गलती कहां है?

उत्तर

2

HTTPS समर्थन के साथ, ग्राहक के प्रमाणीकरण विवरण प्राप्त करने के लिए request.connection.verifyPeer() और request.connection.getPeerCertificate() का उपयोग करें।

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

+0

क्लाइंट प्रमाण अनुरोध पहले से ही कोड अनुरोध में 'requestCert: true' के माध्यम से सक्रिय है। अनुरोध एक अनुरोध हैंडलर में क्लाइंट प्रमाण का अनुरोध नहीं कर सकता; इसे सर्वर विकल्पों में कॉन्फ़िगर किया जाना चाहिए, क्योंकि प्रमाणपत्र एक्सचेंज एसएसएल हैंडशेक के हिस्से के रूप में होता है (यानी अनुरोध संभालने से पहले)। – ttreitlinger

3

सर्वर URL सर्वर प्रमाणपत्र की सामान्य नाम भाग के खिलाफ मिलान किया जाता है।

जब आप सर्वर प्रमाणपत्र अनुरोध बनाते हैं, तो अपने सर्वर का होस्ट नाम सामान्य नाम भाग में रखना याद रखें। यदि आप केवल स्थानीय रूप से परीक्षण कर रहे हैं (https://localhost का उपयोग पते के रूप में) स्थानीयहोस्ट को सामान्य नाम के रूप में उपयोग करें।

संबंधित मुद्दे