我为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);
任何解决方案?
答案 0 :(得分:3)
可以使用两种不同的格式对.cer
文件进行编码:PEM
和DER
。
如果您的文件使用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
答案 3 :(得分:1)
HTTPS / TLS加密是非对称的,有两个部分可以使其工作,公钥和私钥。
您上传证书签名请求(CSR)后从Apple推送通知服务(APNS)获得的.cer
文件是已签名的公钥。
私钥 的位置取决于您的生成方式 。
如果您使用的是Apple并使用Apple Keychain应用程序,则它具有私钥。将.cer
公钥导入Keychain。然后使用导出选项获取一个受密码保护的.p12
文件,其中包含私有和公开密钥。请参阅链接[1]和[2]。
在您的node.js应用程序中,导出的.p12
文件和密码可用作https.createServer
的pfx
和passphrase
选项。
例如:
var options = {
pfx: fs.readFileSync('./exported-cert.p12'),
passphrase: 'password-that-was-set-on-export'
};
https.createServer(options, ...);