APN节点:加载PEM文件时出错

时间:2014-12-25 01:44:45

标签: node.js ssl heroku apple-push-notifications

我想让apn-node推送到我的设备。服务器托管在Heroku上,所以我不想提交文件。另外,我不想从远程服务器获取它,而是将其放在环境变量中。

我已经尝试了以下(source):
我创建并从Apple下载了证书,现在将它放在我的钥匙串中。我将其导出为*.p12文件,并使用openssl pkcs12 -in dev.p12 -out dev.pem -nodes将其转换为*.pem文件。

要设置环境变量,我做了export APN_CERT="$(cat dev.pem)"。当我在我的应用程序中打印出来时,它显示证书非常好。 但是,当我实际发送通知(并且node-apn打开连接)时,它会抛出 [Error: wrong tag] 。 加密模块发出此错误:

apn Raising error: +4ms [Error: wrong tag] undefined undefined
 apn Error occurred with trace: +1ms Error: wrong tag
  at Object.exports.createCredentials (crypto.js:176:17)
  at Object.exports.connect (tls.js:1344:27)
  at apnSocketLegacy

该模块还会抛出APN transmission error: moduleInitialisationFailed (Code: 513)

我无法找到任何有用的信息,除此之外,这可能与节点本身的加密模块本身有关。这就是为什么我怀疑在创建证书时我做错了什么但感谢任何指导性的建议。

3 个答案:

答案 0 :(得分:1)

我找到了this guide用于apns-sharp,它实际上描述了如何生成有效的.p12文件。

但是,将其写入环境变量仍无法正常工作。我的阅读代码是:new Buffer(certString, 'binary')但我认为它仍然没有以正确的格式提供。

我的解决方案是通过fs.readFileSync直接从文件中读取缓冲区。


要使env变量生效,您可以通过cat cert.p12 | base64对文件进行编码,然后使用new Buffer(certString, 'base64')对其进行加载。这最终对我有用。

答案 1 :(得分:1)

var apn = require("apn");

var deviceToken = "device token";

var service = new apn.Provider({
    cert: '.path to /cert.pem', key:'pat to ./key.pem'
});

    var note = new apn.Notification();


  note.expiry = Math.floor(Date.now() / 1000) + 60; // Expires 1 minute from now.
  note.badge = 3;
  note.sound = "ping.aiff";
  note.alert = " You have a new message";
  note.payload = {'messageFrom': 'Rahul test apn'};
  note.topic = "(Bundle_id).voip";
  note.priority = 10;
  note.pushType = "alert";

  service.send(note, deviceToken).then( (err,result) => {
    if(err) return console.log(JSON.stringify(err));
    return console.log(JSON.stringify(result))
  });

加载pem文件并使用令牌运行

答案 2 :(得分:0)

此处的首选项是使用与applciation一起存储的加密p12,并指定您通过环境变量设置的密码。

我无法使用以下脚本复制您的问题

var apn = require("apn");

var token = "<token>; // iPad

var service = new apn.connection({
    cert: process.env.APN_CERT, key: process.env.APN_KEY
});

service.on("connected", function() {
    console.log("Connected");
});

service.on("error", function(err) {
    console.log("Standard error", err);
});

function pushNotification() {
    var note = new apn.notification().setAlertText("Hello");

    service.pushNotification(note, token);
    service.shutdown();
}

pushNotification();

使用以下命令运行:

$ export APN_CERT=$(cat certificates/cert.pem)
$ export APN_KEY=$(cat certificates/key.pem)
$ node apn-env.js

您看到的错误"wrong tag"来自OpenSSL,并建议证书数据本身包含的数据的解析错误,而不是从env中错误地加载的数据。从环境变量加载PEM文件正常工作