使用带有NodeJs HTTPS的certificates.cer

时间:2014-03-03 12:06:43

标签: ios node.js https apple-push-notifications ssl-certificate

我为IOS推送通知生成了一个.cer文件,我希望将它与NodeJS HTTPS模块一起使用。

我发现HTTPS模块的唯一例子是使用.pem和.sfx文件,而不是.cer:

var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};

or 

var options = {
  pfx: fs.readFileSync('server.pfx')
}

https.createServer(options, function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}).listen(8000);

任何解决方案?

4 个答案:

答案 0 :(得分:3)

可以使用两种不同的格式对.cer文件进行编码:PEMDER

如果您的文件使用PEM格式进行编码,您可以像使用其他.pem文件一样使用它(有关详细信息可以在Node.js documentation中找到):

const https = require("https");

const options = {
    key: fs.readFileSync("key.pem", "utf8"),
    cert: fs.readFileSync("cert.cer", "utf8")
};

https.createServer(options, (req, res) => {
    res.writeHead(200);
    res.end("Hello world");
}).listen(8000);

如果您的文件使用DER格式进行编码,则首先需要使用OpenSSL将其转换为.pem文件(该命令来自here):

openssl x509 -inform der -in cert.cer -out cert.pem

然后可以使用上面的代码,cert文件名为cert.pem而不是cert.cer

const https = require("https");

const options = {
    key: fs.readFileSync("key.pem", "utf8"),
    cert: fs.readFileSync("cert.pem", "utf8")
};

https.createServer(options, (req, res) => {
    res.writeHead(200);
    res.end("Hello world");
}).listen(8000);

如果您拥有与cert.cer文件匹配的证书颁发机构的密钥,您可以将其包含在options https.createServer参数中,如下所示(代码示例假定文件名为ca.pem,并使用PEM格式进行编码):

const https = require("https");

const options = {
    ca: fs.readFileSync("ca.pem", "utf8"),
    key: fs.readFileSync("key.pem", "utf8"),
    cert: fs.readFileSync("cert.pem", "utf8")
};

https.createServer(options, (req, res) => {
    res.writeHead(200);
    res.end("Hello world");
}).listen(8000);

有关https.createServer及其参数的详细信息,请查看documentation

注意:上面的所有选项都假设您还有一个以PEM格式编码的公钥,名为key.pem.cer文件名为cert.cer。如果您没有公钥,请发表评论或将其添加到问题本身,我会相应地更新我的答案。

如果您不确定文件编码的格式,您可以尝试这两种选项,看看哪种格式适合您。

答案 1 :(得分:1)

这是一个使用crt的示例,如果它不起作用,您可以将cer转换为crt:

var express  = require('express');
var app      = express();
var fs       = require('fs');
var https    = require('https');

var credentials = {
    ca: fs.readFileSync(__dirname+"/ssl/certificate.ca-crt", 'utf8'), //certificate concatenation or intermediate certificates
    key: fs.readFileSync(__dirname+"/ssl/mydomain.com.key", 'utf8'), //SSL key
    cert: fs.readFileSync(__dirname+"/ssl/certificate.crt", 'utf8') //the certificate
};

app.configure(function() {

    // set up your express application

});

var httpsServer = https.createServer(credentials, app);
httpsServer.listen(443);

从这里采取(西班牙语):salvatorelab.es
您还可以查看这些文件(crt,ca-crt ...)包含或看起来的示例。

答案 2 :(得分:1)

@Mohit,您可以使用以下命令将您的cer转换为pem。

openssl x509 -inform der -in certificate.cer -out certificate.pem

Source

答案 3 :(得分:1)

HTTPS / TLS加密是非对称的,有两个部分可以使其工作,公钥私钥

您上传证书签名请求(CSR)后从Apple推送通知服务(APNS)获得的.cer文件是已签名的公钥

私钥 的位置取决于您的生成方式

如果您使用的是Apple并使用Apple Keychain应用程序,则它具有私钥。将.cer 公钥导入Keychain。然后使用导出选项获取一个受密码保护的.p12文件,其中包含私有公开密钥。请参阅链接[1][2]

在您的node.js应用程序中,导出的.p12文件和密码可用作https.createServerpfxpassphrase选项。

例如:

var options = {
  pfx: fs.readFileSync('./exported-cert.p12'),
  passphrase: 'password-that-was-set-on-export'
};

https.createServer(options, ...);