使用 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 证书请求的主要内容,如果未能解决你的问题,请参考以下文章
在 xws-security for Spring-WS 中支持 X509PKIPathv1
直接在文件系统上使用 PEM 编码的 CA 证书进行 HTTPS 请求?
x509: certificate has expired or is not yet valid: current time 问题解决