2014-12-25 46 views
0

我試圖讓apn-node推送到我的設備。服務器託管在Heroku上,所以我不想提交該文件。另外,我不想從遠程服務器獲取它,而是將其放入環境變量中。APN節點:加載PEM文件時出錯

我已經嘗試過以下(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)

除了這可能與節點本身的加密模塊本身有關外,我無法找到任何有用的信息。這就是爲什麼我懷疑在創建證書時我做錯了什麼,但感謝任何指導性建議。

回答

1

我發現this guide爲APNS銳這實際上描述瞭如何生成有效的.p12文件。

但是,將其寫入環境變量中並不適用。我的代碼閱讀它是:new Buffer(certString, 'binary'),但我認爲它仍然沒有提供一個正確的格式。

對我來說,解決辦法是居然直接從一個文件通過fs.readFileSync讀取緩衝區。


爲了讓環境變量的工作,你可以通過cat cert.p12 | base64對文件進行編碼,並與new Buffer(certString, 'base64')加載它本身。這終於爲我工作。這裏

+0

要確保base64沒有換行符,請使用'base64 -w 0'。我結束了'cat cert.p12 | base64 -w 0 | clipit'將其編碼並直接複製到剪貼板。 –

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文件可以正常工作

+0

好的,我很想看看你是否能找到任何東西。 –