申请X509证书

我已经收到一个X509证书(一个.cer文件),我可以解码它,所以没有问题。 现在我想用节点中的这个证书签署一个请求,但是我不能得到这个工作:

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); }); }); 

这失败了

错误:错误:0906D06C:PEM例程:PEM_read_bio:无起始行
在Object.createCredentials(crypto.js:72:31)
在Object.connect(tls.js:857:27)
在Agent._getConnection(https.js:61:15)
在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(); 

PEM_read_bio需要PEM格式的证书,而您有“原始”DER格式的证书。 显然你需要将你的证书转换成PEM格式。

DER格式的BTW .cer文件不包含私钥,不能用于签名。

您需要重新检查您的.cer文件中的实际内容以及格式。

跟进:

只有.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: 

(注意空传参数)