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

基于Apollo与GraphQL搭建安全(wss)WebSocket服务器

如何将Apollo/GraphQL的WebSocket订阅升级为WSS(安全连接)

嘿,我看你已经基于Express搭好了Apollo/GraphQL的WebSocket订阅服务,要把它升级成安全的WSS(WebSocket Secure)连接其实很简单,只需要几步调整就行,我给你详细拆解下:

1. 准备SSL证书

首先你需要一份有效的SSL证书:

  • 开发环境:可以用openssl生成自签名证书,执行以下命令:
    openssl req -x509 -newkey rsa:4096 -nodes -keyout server.key -out server.crt -days 365
    
    执行后会在当前目录生成server.key(私钥)和server.crt(证书文件)。
  • 生产环境:建议使用Let's Encrypt等权威CA机构颁发的免费证书,或者购买商业证书,避免浏览器提示安全风险。

2. 修改服务器代码

你只需要把原来的HTTP服务器替换为HTTPS服务器,并调整SubscriptionServer的绑定逻辑,完整代码如下:

import express from 'express';
import { graphqlExpress, graphiqlExpress } from 'apollo-server-express';
import bodyParser from 'body-parser';
import cors from 'cors';
import { execute, subscribe } from 'graphql';
import { createServer } from 'https'; // 替换原有的http模块
import fs from 'fs'; // 用于读取SSL证书文件
import { SubscriptionServer } from 'subscriptions-transport-ws';
import { schema } from './src/schema';

const PORT = 3000;
const server = express();

// 配置SSL证书路径
const sslOptions = {
  key: fs.readFileSync('./server.key'), // 你的私钥文件路径
  cert: fs.readFileSync('./server.crt') // 你的证书文件路径
};

// 原有中间件配置保持不变
server.use(cors());
server.use(bodyParser.json());
server.use('/graphql', graphqlExpress({ schema }));
server.use('/graphiql', graphiqlExpress({
  endpointURL: '/graphql',
  subscriptionsEndpoint: `wss://localhost:${PORT}/subscriptions` // 这里改成wss协议
}));

// 创建HTTPS服务器并启动
const httpsServer = createServer(sslOptions, server);
httpsServer.listen(PORT, () => {
  console.log(`安全服务器运行在 https://localhost:${PORT}/graphql`);
  
  // 绑定SubscriptionServer到HTTPS服务器
  new SubscriptionServer({
    execute,
    subscribe,
    schema
  }, {
    server: httpsServer, // 传入HTTPS服务器实例
    path: '/subscriptions'
  });
});

3. 额外注意事项

  • 开发环境信任证书:自签名证书会被浏览器标记为不安全,你可以在浏览器中手动信任该证书,或者在测试客户端(比如Apollo Client)中临时关闭证书验证(设置rejectUnauthorized: false),但生产环境绝对不能这么做。
  • 生产环境反向代理方案:如果你的服务部署在生产环境,更推荐用Nginx等反向代理来处理SSL,此时Node服务器依然用HTTP运行,由Nginx负责将WSS请求转发到Node的WebSocket服务,这种方式性能更好,还能实现负载均衡等高级功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:51:39