2011-12-23 221 views
6

我已經收到了X509證書(一個.cer文件),我可以decode它,所以沒有問題。現在,我要簽名與證書上節點的請求,但我不能得到這個工作:請求X509證書

var https = require("https"); 
var fs = require("fs"); 

var options = { 
    host: 'management.core.windows.net', 
    path: '/my-subscription-id/services/hostedservices', 
    port: 443, 
    method: 'GET', 
    cert: fs.readFileSync("./SSLDevCert.cer"), 
    agent: false 
}; 

var req = https.request(options, function(res) { 
    console.log("statusCode: ", res.statusCode); 
    console.log("headers: ", res.headers); 

    res.on('data', function(d) { 
     process.stdout.write(d); 
    }); 
}); 

這種失敗

Error: error:0906D06C:PEM routines:PEM_read_bio:no start line
at Object.createCredentials (crypto.js:72:31)
at Object.connect (tls.js:857:27)
at Agent._getConnection (https.js:61:15)
at Agent._establishNewConnection (http.js:1183:21)

做同樣的在C#中正常工作:

var req = (HttpWebRequest)WebRequest.Create(string.Format("https://management.core.windows.net/{0}/services/hostedservices", "my-subscription-id")); 
req.ClientCertificates.Add(new X509Certificate2(File.ReadAllBytes("./SSLDevCert.cer")); 
var resp = req.GetResponse(); 

回答

2

一個跟進此:

只有.cer文件可能意味着私鑰證書中(當然這是與Azure的證書的情況下),你將有一個PEM文件轉換(啓動與----BEGIN RSA PRIVATE KEY----),然後做一個請求:

var key = fs.readFileSync("./key.pem"); 
var options = { 
    cert: key, 
    key: key 
} 

獲取該文件中的私鑰可以是一個有點棘手,但這個工作在Azure上的證書,所以它可能會幫助你們任何人:

openssl pkcs12 -in ' + file + ' -nodes -passin pass: 

(注意空傳參數)

3

PEM_read_bio預期證書採用PEM格式,而您的證書採用「原始」DER格式。很明顯,您需要將您的證書轉換爲PEM格式。

DER格式的BTW .cer文件不包含私鑰,不能用於簽署任何內容。

您需要重新檢查您的.cer文件中的實際內容以及格式。