You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express JS HTTPS API无法访问求助(AWS部署,IP访问)

问题描述

我在AWS上部署了一个Node.js + Express JS API,原本通过IP地址(无域名)以HTTP方式正常访问,现在要升级为HTTPS。按照Express文档,用以下命令生成了自签名证书:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./selfsigned.key -out selfsigned.cert

但切换到HTTPS后无法访问,出现三类错误:

  • 应用返回:Certificate required
  • Postman返回:Connection Refused
  • PowerShell执行Invoke-WebRequest返回:The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.

怀疑问题出在自签名证书,相关代码如下:

let fs = require("fs");
let https = require('https');

const crypto = require('crypto')
let express = require('express');
let expressRateLimit = require("express-rate-limit");
let mysql = require('mysql');
let bodyParser = require('body-parser');
let winston = require('winston');
require('winston-daily-rotate-file');

let key = fs.readFileSync('sslcert/selfsigned.key');
let cert = fs.readFileSync('sslcert/selfsigned.crt');
let credentials = {key: key, cert: cert};

let app = express();
app.set('trust proxy', '127.0.0.1');
app.use(bodyParser.urlencoded({extended: true}));

//App config

let httpsServer = https.createServer(credentials, app);
let httpsPort = 443;

httpsServer.listen(httpsPort, function() {
   console.log("Started codeRedeem https REST API on port " + httpsPort);
});
问题排查与解决办法

1. 证书文件名不匹配

你生成证书时输出的是selfsigned.cert,但代码里读取的是selfsigned.crt,文件名后缀不一致会导致证书无法正确加载,直接引发Certificate required错误。

  • 解决:要么重命名证书文件为selfsigned.crt,要么修改代码里的读取路径为sslcert/selfsigned.cert。

2. 特权端口访问权限

443是Linux系统的特权端口(1-1024),非root用户无法直接监听该端口,这会导致HTTPS服务启动失败,出现Postman的Connection Refused错误。

  • 解决办法三选一:
    • 用root用户启动应用(不推荐,安全性低)
    • 将HTTPS端口改为非特权端口(比如3001),访问时用https://<你的IP>:3001
    • 用iptables转发端口:执行sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3001,外部访问443端口会自动转发到应用监听的3001端口

3. 自签名证书的IP匹配问题

生成自签名证书时,Common Name(CN)字段需要填写API的公网IP地址,否则证书的主体标识和你访问的IP不匹配,会触发SSL信任验证失败。

  • 解决:重新生成证书,在openssl交互提示中,将Common Name设为你的AWS实例公网IP:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./sslcert/selfsigned.key -out ./sslcert/selfsigned.cert

执行后会出现一系列提示,其中Common Name (e.g. server FQDN or YOUR name)这一项输入你的公网IP即可。

4. 自签名证书的信任问题

PowerShell的错误是因为Windows系统默认不信任自签名证书,解决办法:

  • 临时方案:PowerShell请求时添加-SkipCertificateCheck参数,跳过证书验证:
Invoke-WebRequest -Uri https://<你的IP> -SkipCertificateCheck
  • 永久方案:将自签名证书导入到Windows的受信任根证书颁发机构中:
    1. 把证书文件下载到本地
    2. 双击证书,点击“安装证书”
    3. 选择“本地计算机”,下一步后选择“将所有证书放入下列存储”,点击“浏览”选择“受信任的根证书颁发机构”
    4. 完成安装后,系统会信任该证书

内容的提问来源于stack exchange,提问作者M4rw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:43:14