申请X509证书

Jan*_*oom 6 ssl x509 node.js

我收到了一个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);
    });
});
Run Code Online (Sandbox Code Playgroud)

这失败了

错误:错误:0906D06C:PEM例程:PEM_read_bio:
在Object._getConnection
上的Object.connect(tls.js:857:27)
处的Object.createCredentials(crypto.js:72:31)处没有起始行(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();
Run Code Online (Sandbox Code Playgroud)

Jan*_*oom 2

对此的后续:

Only .cerfile 可能意味着私钥位于证书中(Azure 证书就是这种情况),您必须在文件中进行转换PEM(以 开头----BEGIN RSA PRIVATE KEY----),然后使用以下命令执行请求:

var key = fs.readFileSync("./key.pem");
var options = {
    cert: key,
    key: key
}
Run Code Online (Sandbox Code Playgroud)

从文件中获取私钥可能有点棘手,但这适用于 Azure 证书,因此它可能会对你们中的任何人有所帮助:

openssl pkcs12 -in ' + file + ' -nodes -passin pass:
Run Code Online (Sandbox Code Playgroud)

(注意空传递参数)