C#-实现安全的Web套接字

时间:2018-08-06 12:47:02

标签: c# sockets websocket ssl-certificate protocols

我想问一下您是否知道如何使用.Net实现安全Web套接字。 我已经实现了ws://,一切正常,但是我不知道如何切换到wss://。 预先感谢。

2 个答案:

答案 0 :(得分:1)

您可以尝试Fleck

  

Fleck是C#中的WebSocket服务器实现

从他们的示例中:

var server = new WebSocketServer("wss://0.0.0.0:8431");
server.Certificate = new X509Certificate2("MyCert.pfx");
server.Start(socket =>
{
  //...use as normal
});

答案 1 :(得分:0)

这个问题很老了,但这是我如何让我的 C# 服务器接受来自客户端的 SSL 连接(在 Chrome/Firefox 上运行的 js 代码)。

假设您已经拥有一个有效且有效的证书(在我的情况下,该证书在我的 Apache 网络服务器上为 SSL 提供服务),由受信任的 CA(在我的情况下为letsencrypt.org,它允许您为以下内容请求证书)签名免费),这是工作代码的摘录:

public static X509Certificate2 serverCertificate = null;

public Server(string ip_addr, int port)
{
        serverCertificate = GetCertificateFromStore("CN=mydomain.com");

        string resultsTrue = serverCertificate.ToString(true); // Debugging purposes
        bool hasPrivateKey = serverCertificate.HasPrivateKey; // Debugging purposes (MUST return true)
        Console.WriteLine("Certificate validation results: " + resultsTrue);
        Console.WriteLine("Has private key? " + hasPrivateKey);
        server = new TcpListener(IPAddress.Parse(ip_addr), port);

        server.Start();

        Console.WriteLine("Server has started on ip: " + ip_addr + ":"+port + " - Waiting for a connection...", Environment.NewLine);
 }

 public class ClientHandler
 {
    TcpClient client { get; set; }
    //NetworkStream stream { get; set; } // Old plain non-secure tcp stream
    SslStream stream { get; set; } // New secure tcp stream

    ....

    public ClientHandler(TcpClient client, string room_id)
    {
        ....
        stream = new SslStream(client.GetStream(), false);
        try
        {
            stream.AuthenticateAsServer(Server.serverCertificate, clientCertificateRequired: false, checkCertificateRevocation: false);

            // Set timeouts for the read and write to 5 seconds.
            stream.ReadTimeout = 5000;
            stream.WriteTimeout = 5000;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error during SSL authentication with the client:" + ex);
            return;
        }
    }
}

棘手的部分是类 X509Certificate2 需要不是从文件而是从您的本地密钥库检索证书。 您还需要证书文件和您的私钥才能使 SSL 工作。

我正在 Linux 和 Mono.Net 上进行开发,但在其他平台上应该不会有太大变化。我需要的工具是:openssl 和 certmgr(单声道证书管理器)。

要创建包含证书和私钥的 .pfx 文件:

openssl pkcs12 -export -in yourcertfile.cer -inkey yourprivatekeyfile.pem -out finalfile.pfx

要将获取的文件添加到我的本地存储:

certmgr -add -c -m Trust finalfile.pfx 

最后,您可以编辑客户端连接代码以指向您托管服务器的同一个域(应该与您的证书中报告的域相同)。

这个:

var mySocket = new WebSocket("ws://127.0.0.1:5050");

变成:

var mySocket = new WebSocket("wss://yourdomain.com:5050");

请记住,一旦您实施了 SSL,您就必须修改整个网络代码,因为您正在向 TCP 流添加开销,并且在解析字节和位时必须将其考虑在内查找和解码标头。 这是我被困住的地方,但除此之外,SSL 连接效果很好:)