基于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 365server.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
相关产品推荐
相关产品推荐

