需求背景

如果网页中需要访问麦克风、摄像头等设备,必须要在HTTPS环境活着localhost环境。如果服务器不能访问外网从而无法绑定域名,就需要让ip支持https。

解决思路是使用自签名证书,将ip设置为https类型服务。

实现

1:生成自签名 SSL/TLS 证书

使用 OpenSSL 工具生成私钥和自签名证书(Windows、Linux、Mac 均内置或可安装 OpenSSL)。

安装 OpenSSL

  • Windows:下载 OpenSSL 安装包 或通过 Chocolatey 安装 choco install openssl;

  • Linux:通过包管理器安装(如 sudo apt install openssl 或 sudo yum install openssl);

  • Mac:内置 OpenSSL,可通过 brew install openssl 升级。

生成证书和私钥

在终端 / 命令提示符中执行以下命令,生成 server.key(私钥)和 server.crt(证书):

# 生成私钥(2048位 RSA 加密,无密码保护,避免服务启动时手动输入密码)
openssl genrsa -out server.key 2048

# 生成证书签名请求(CSR),按提示输入信息(内网可随意填写,如 Common Name 填 192.168.1.1)
openssl req -new -key server.key -out server.csr

# 生成自签名证书(有效期 3650 天,即 10 年,避免频繁更新)
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

执行完成后,当前目录会生成 3 个文件:

  • server.key:私钥(需保密,仅服务端使用);

  • server.csr:证书请求文件(生成证书后可删除);

  • server.crt:自签名证书(可公开,提供给客户端验证)。

2:配置服务端启用 HTTPS(以NGINX举例)

将 server.key 和 server.crt 复制到 Nginx 证书目录(如 /etc/nginx/ssl/);

修改 Nginx 配置文件(如 /etc/nginx/conf.d/default.conf):

server {
  listen 3000 ssl;  # 监听 3000 端口并启用 SSL
  server_name 192.168.1.1;  # 内网 IP

  # 证书和私钥路径
  ssl_certificate /etc/nginx/ssl/server.crt;
  ssl_certificate_key /etc/nginx/ssl/server.key;

  # SSL 优化配置(可选)
  ssl_protocols TLSv1.2 TLSv1.3;  # 支持的 TLS 版本
  ssl_ciphers HIGH:!aNULL:!MD5;   # 加密算法

  # 反向代理到原 3000 端口的 HTTP 服务(如果服务本身是 HTTP)
  location / {
    proxy_pass http://127.0.0.1:3000;  # 代理到本地 3000 端口的 HTTP 服务
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

检查配置并重启 Nginx

sudo nginx -s reload