Node.js + APN:在本地,一切正常,但在云主机上启动时出现“端点错误:无法获取本地颁发者证书”
Posted
技术标签:
【中文标题】Node.js + APN:在本地,一切正常,但在云主机上启动时出现“端点错误:无法获取本地颁发者证书”【英文标题】:Node.js + APN: Locally, everything works but I get "Endpoint error: unable to get local issuer certificate" when launching on cloud host 【发布时间】:2021-01-20 10:19:18 【问题描述】:我希望能够通过我在智能手机上构建的 React Native 应用程序发送通知。此脚本仅应在服务器启动时向我的设备发送通知。
配置
我有一个非常简单的 node js 服务器,配置如下:
index.js
const app = require('express')();
const http = require('http').Server(app);
const apn = require('apn');
// APNs config
const service = new apn.Provider(
token:
key: 'XXXXXXXXX.p8',
keyId: "XXXXXXXXX",
teamId: "XXXXXXXXX",
,
production: process.env.NODE_ENV === 'dev' ? false : true
);
// express
app.get('/', (req, res) => res.send('hello world'));
// Listen to port 3000
http.listen(3000, () => console.log('run port :3000'));
然后,我添加了这个方法,它允许我向安装了 React Native 应用程序的设备发送通知
index.js
// on server start, send a notification to my iPhone
const notif = new apn.Notification(
title: 'Notif said:',
alert: 'message'
)
notif.topic = 'com.name.xxxx';
notification.sound = 'ping.aiff';
service.send(notif, 'XXXXTOKENDEVICE').then(result => console.log(result))
当我使用命令 NODE_ENV=dev node index.js 在本地运行它时,一切顺利,我在设备上收到通知。
问题
但是,当我在云主机(Linode,Ubuntu 20.10)上运行它时,它不起作用:我通过 service.send() Promise 收到此消息:
日志响应
device: 'XXXXTOKENDEVICE',
error: VError: endpoint error: unable to get local issuer certificate
at Endpoint.<anonymous> (/root/app/node_modules/apn/lib/protocol/endpointManager.js:69:32)
at Endpoint.emit (events.js:315:20)
at Endpoint.error [as _error] (/root/app/node_modules/apn/lib/protocol/endpoint.js:149:10)
at TLSSocket.emit (events.js:327:22)
at emitErrorNT (internal/streams/destroy.js:92:8)
at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
at processTicksAndRejections (internal/process/task_queues.js:84:21)
jse_shortmsg: 'endpoint error',
jse_cause: Error: unable to get local issuer certificate
at TLSSocket.onConnectSecure (_tls_wrap.js:1501:34)
at TLSSocket.emit (events.js:315:20)
at TLSSocket._finishInit (_tls_wrap.js:936:8)
at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:710:12)
code: 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY'
,
jse_info:
我尝试在生产模式设置为 true 的情况下启动它,但没有任何变化。
我也是与证书等相关的一切的初学者。但再一次:一切都在本地工作。我错过了什么吗?或者,我的云服务器是否需要特定配置?
提前谢谢你!
【问题讨论】:
这有什么更新吗?面临同样的错误 【参考方案1】:如果发现这篇文章的人有同样的问题,我最终得到了一个解决方案,即降级服务器节点版本(我选择 v12.16.2)和 socket.io(2.0.3)。
【讨论】:
【参考方案2】:您必须在诸如
之类的选项中包含 rejectUnauthorized 为 falsevar options =
token:
key: "./pushcertificates/AuthKey_XXXXXXXXXX.p8",
keyId: "XXXXXXXXXX",
teamId: "XXXXXXXXXX"
,
production: true,
rejectUnauthorized: false
;
这在文档中有所提及。
https://github.com/node-apn/node-apn/blob/master/doc/provider.markdown
【讨论】:
以上是关于Node.js + APN:在本地,一切正常,但在云主机上启动时出现“端点错误:无法获取本地颁发者证书”的主要内容,如果未能解决你的问题,请参考以下文章
通过 node.js 下载 zip 文件第一次失败,但在后续尝试中有效
Mongodb atlas + node.js 在本地工作,但在推送到 Heroku 时停止
Node.js 应用程序在本地主机上运行良好,但在 Heroku 上部署时显示错误
Node.js 应用程序提供 ERR_EMPTY_RESPONSE