2013-01-17 289 views
7

我真的试图与自签署客户端授权。的客户端SSL授权

首先,我真的创建证书:

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 

转换客户CERTI ficate到P12

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

打开并安装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在Chrome,但认证不通过:req.client.authorized是假的

Chrome的消息是

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是代码示例中已经激活。服务器无法在请求处理程序中请求客户端证书;它必须在服务器选项中进行配置,因为证书交换是作为SSL握手的一部分发生的(即在处理请求之前)。 – ttreitlinger

3

服务器URL针对服务器证书的通用名称部分匹配。

当您创建服务器证书请求时,记得把你的服务器的主机名的通用名称的一部分。如果您只是在本地进行测试(使用https://localhost作为地址),请使用localhost作为通用名称。 TRUE`: