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的受信任根证书颁发机构中:
- 把证书文件下载到本地
- 双击证书,点击“安装证书”
- 选择“本地计算机”,下一步后选择“将所有证书放入下列存储”,点击“浏览”选择“受信任的根证书颁发机构”
- 完成安装后,系统会信任该证书
内容的提问来源于stack exchange,提问作者M4rw
相关产品推荐
相关产品推荐

