2015-04-22 65 views
0

我一直試圖做一個關於服務器和客戶端之間的TLS連接測試。 (SSL客戶端身份驗證)一個具體案例:UNABLE_TO_VERIFY_LEAF_SIGNATURE

我有一個自簽名密鑰對。

如果我嘗試使用tls.connect()連接我的API服務器,我的連接似乎unauthorizedauthorizationErrorUNABLE_TO_VERIFY_LEAF_SIGNATURE如下面的截圖。

但是,如果我嘗試連接https://api.twitter.com而不是https://hellolarim.club,則表示沒有錯誤,authorization的值爲true。另外,當我嘗試Twitter時,我不必使用rejectUnauthorized: false參數。

我添加了下面的代碼server.js過。

問題:我想知道爲什麼我不能連接爲authorized: true

我必須對我的API服務器實施SSL-客戶端身份驗證。

連接到我的API服務器的嘗試


client.js

var tls = require('tls'); 
var fs = require('fs'); 

var options = { 
    key: fs.readFileSync('client-private-key.pem'), 
    cert: fs.readFileSync('client-certificate.pem'), 

    rejectUnauthorized: false, 
}; 

{ 
var cleartextStream = tls.connect(443, 'www.hellolarim.club', options, function() { 

    console.log('\nclient connected', cleartextStream.authorized ? 'authorized' : 'unauthorized'); 
    if(!cleartextStream.authorized) { 
    console.log("authorizationError: " + cleartextStream.authorizationError); 
    } 

    process.stdin.resume(); 
    process.stdin.pipe(cleartextStream); 
}); 
cleartextStream.setEncoding('utf8'); 
cleartextStream.on('data', function(data) { 
    console.log("\n" + data); 
}); 
cleartextStream.on('end', function() { 
    server.close(); 
}); 

enter image description here

連接到Twitter的嘗試API服務器


enter image description here


Server.js

var tls = require('tls'); 
var fs = require('fs'); 

var options = { 
    key: fs.readFileSync('key.pem'), 
    cert: fs.readFileSync('cert.pem'), 
    requestCert: true, 
    rejectUnauthorized: true, 

    ca: [ fs.readFileSync('../client/client-certificate.pem') ] 
}; 

var server = tls.createServer(options, function(cleartextStream) { 

    console.log(cleartextStream.getPeerCertificate()); 

    console.log('server connected', 
       cleartextStream.authorized ? 'authorized' : 'unauthorized'); 
    cleartextStream.write("Hello from server to client!\n"); 
    cleartextStream.setEncoding('utf8'); 
    cleartextStream.pipe(cleartextStream); 
}); 
server.listen(443, function() { 
    console.log('server bound'); 
}); 

回答

0

的問題是在客戶端。

客戶端無法識別服務器證書雖然證書已經從商業CA得到,因爲沒有客戶端選項沒有ca參數!

如果我們有很多根證書,我們可以通過將一個字符串數組像下面或使用node-ssl-root-cas安裝它們。

var CAcerts = [ 
    // A Root CA cert. 
    "-----BEGIN CERTIFICATE-----\n" + 
    "MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE\n" + 
    "BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\n" + 
    "tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW\n" + 
    "sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp\n" + 
    "7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I\n" + 
    "LaZRfyHBNVOFBkpdn627G190\n" + 
    "-----END CERTIFICATE-----\n", 
    // Another Root CA cert. 
    "-----BEGIN CERTIFICATE-----\n" + 
    "MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE\n" + 
    "BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\n" + 
    "tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW\n" + 
    "sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp\n" + 
    "7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I\n" + 
    "LaZRfyHBNVOFBkpdn627G190\n" + 
    "-----END CERTIFICATE-----\n" 
    ]; 

var options = { 
    key: fs.readFileSync('client-private-key.pem'), 
    cert: fs.readFileSync('client-certificate.pem'), 
    ca: CAcerts, 
    requestCert: true, 
    rejectUnauthorized: true, 
}; 
相關問題