使用 X509 证书请求

Posted

技术标签:

【中文标题】使用 X509 证书请求【英文标题】:Request with X509 Certificate 【发布时间】: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();

【问题讨论】:

【参考方案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 参数)

【讨论】:

以上是关于使用 X509 证书请求的主要内容,如果未能解决你的问题,请参考以下文章

使用纯 .net 框架生成和签署证书请求

如何从客户端请求中获取 X509Certificate

(14) openssl x509(签署和自签署)

在 xws-security for Spring-WS 中支持 X509PKIPathv1

直接在文件系统上使用 PEM 编码的 CA 证书进行 HTTPS 请求?

x509: certificate has expired or is not yet valid: current time 问题解决