【问题标题】:Request with X509 Certificate使用 X509 证书请求
【发布时间】:2011-12-23 16:12:21
【问题描述】:

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

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

【问题讨论】:

    标签: node.js ssl x509


    【解决方案1】:

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

    DER 格式的 BTW .cer 文件不包含私钥,也不能用于签署任何内容。

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

    【讨论】:

      【解决方案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:
      

      (注意空的 pass 参数)

      【讨论】:

        猜你喜欢
        • 2016-01-14
        • 1970-01-01
        • 2013-08-07
        • 1970-01-01
        • 2014-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        相关资源
        最近更新 更多