【问题标题】:why does my express-server support https ONLY through a browser but not via other nodejs scripts?为什么我的 express-server 仅通过浏览器支持 https 而不是通过其他 nodejs 脚本?
【发布时间】:2018-10-17 23:21:52
【问题描述】:

我创建了一个 ExpressJS 服务器,它为获取请求提供路由。

我正在使用自签名证书来允许 https 调用。当我通过主要浏览器(chrome、safari 和 firefox)执行请求时,它可以完美运行。 然而,当涉及到真正的使用案例,即通过另一个nodeJs-script 执行get-request 时,服务器无法通过请求,我收到此错误消息:

  Error: unable to verify the first certificate
    at TLSSocket.<anonymous> (_tls_wrap.js:1105:38)
    at emitNone (events.js:106:13)
    at TLSSocket.emit (events.js:208:7)
    at TLSSocket._finishInit (_tls_wrap.js:639:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:469:38)

我的 Express 应用配置:

app.use([
    express.urlencoded({ extended: true }),
    express.json(),
    function (req, res, next) {
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        res.header("Access-Control-Allow-Methods", "GET");
        next();
    },
]);

使用节点 https 包创建服务器:

const credentials = {
    key: fs.readFileSync(credits.sslPrivateKey, "utf8"),
    cert: fs.readFileSync(credits.sslCertificate, "utf8")
};
let httpsServer = https.createServer(credentials, app);

对应的包:

express: "^4.16.3",
node: v8.10.0,
npm: 5.8.0

【问题讨论】:

  • 我是否正确理解您正在使用自签名证书,已明确接受此证书在浏览器中受信任(或添加适当的例外),但您的 nodejs 脚本没有这样做?如果您希望您的 nodejs 脚本以某种方式检查浏览器添加了哪些异常并使用这些异常,那么您的期望是错误的。

标签: node.js express ssl https get


【解决方案1】:

您的 nodejs 脚本调用您的服务器,它将执行完整的 TLS 检查过程(如您所愿)。这将检查证书的有效性等。自签名证书不会通过此过程,就像它们不会在您的浏览器中一样。在您的浏览器中,您需要进行干预并明确地说“继续进行”,您也需要使用您的调用代码来执行此操作。查看您选择的库的文档以了解如何执行此操作。

注意:请确保不要在生产环境中保留此选项。使用某种环境变量来配置它,或者托管您的第一个服务,并且根本不禁用 TLS 检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2014-05-25
    • 2019-12-21
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多