使用 TLS/SSL 保护 Spike Engine Websocket
使用 TLS/SSL 层保护 Spike Engine HTTP 和 Websocket。
概述
本文展示了如何使用 SSL/TLS 安全层来保护 Spike-Engine 通道。 这允许以安全的方式传输 HTTP 和 WebSocket 信息。 我假设读者已经熟悉 Spike-Engine,我将解释通过 websocket 进行简单安全通信的设置过程。
创建证书
首先,我们将为我们的示例目的创建一个自签名证书。 虽然有很多方法可以做到这一点,但我发现了 Pluralsight 的优秀实用程序,只需单击一下即可创建一个。
完成证书后,我们应该创建一个 .PFX 文件,该文件包含私钥并允许服务器被验证为服务器。 我们将证书保存在服务器的 Data 文件夹中,只需告诉 Visual Studio 将其作为内容发布。 反过来,Spike-Engine 会扫描数据文件夹中是否存在任何 pfx 文件并获取第一个可用的文件。 提供证书的另一种方法是使用 Service.Tls.Certificate
属性,其中 Tls
属性只是解析 TlsProvider
,如果您有需要解决的特定需求,您可以自己实现。
服务器端实现
我们的服务器端实现非常简单,如上面的屏幕截图所示,我们有一个简单的协议,它发送一条秘密消息,并将响应回显。 如下图所示。
<operation name="SecretMessage"
direction="Pull"
suppresssecurity="true">
<incoming>
<member name="Name" type="String" />
<member name="Message" type="String" />
</incoming>
<outgoing>
<member name="Name" type="String" />
<member name="Message" type="String" />
</outgoing>
</operation>
这里唯一的区别是我们有 Certificate.pfx,我们需要启动服务器侦听端口 443,这是 HTTPS 和 WSS 的默认端口。 在此示例中,我们还告诉服务器为我们托管一些文件,因此我们可以通过 HTTPS 访问它们,并避免启动另一个 Web 服务器的麻烦。 实际上,可以使用像 IIS 这样的东西来托管网站并仅访问安全套接字。
// Just for simplicity here, and to avoid us spinning a web server, we ask Spike-Engine
// to host the files for us on HTTP protocol. That way, we can access them from the
// browser.
Service.Http.Host("/index", "../../../MySecret.Client/index.html");
Service.Http.Host("/spike-sdk.js.src.js", "../../../MySecret.Client/spike-sdk.js.src.js");
// We also start listening to the port 443, which is default for HTTPS and WSS
Service.Listen(
new TcpBinding(IPAddress.Any, 80),
new TcpBinding(IPAddress.Any, 443)
);
客户端实现
我们的示例客户端将通过安全 websocket 通道不断地向服务器发送消息,服务器将回显这些消息。 实现如下图所示。
var server, message = 0;
function sendSecret(){
// Send a secret message
var secret = "Secret #" + (++message);
server.secretMessage("Bob", secret);
}
// We need to create a server on a secure port, the default port of WSS is 443, which
// we have opened on the server.
server = new spike.ServerChannel('https://127.0.0.1');
// When the browser is connected to the server, we simply send random messages here
server.on('connect', function () {
server.on('secretMessageInform', function (p) {
var element = document.getElementById("response");
element.innerHTML = "" + p.name +": " +p.message;
});
// We will send a random message 5 times per second
setInterval(sendSecret, 200);
});
唯一不同寻常的区别是,当我们创建一个通道时,我们在 https 协议上创建它,该协议告诉底层的 socket.io 连接使用安全通道进行 websocket 通信。 这将在 wss://127.0.0.1 端点上发出 connect 消息。
尝试一下
现在,如果我们运行服务器,我们可以访问 https://127.0.0.1/index 资源,浏览器应该告诉我们证书不安全。 这是正常的,因为我们只是为了测试目的创建了一个自签名证书。 通过之后,您可以使用 F12 工具检查底层网络,您会注意到 websocket 现在正在使用安全模式,并且每个数据包都会即时加密/解密。
历史
- 2015 年 6 月 23 日 - 源代码和文章已更新为 Spike v3
- 2014 年 6 月 10 日 - 初始版本