簡體   English   中英

C# - 實現安全的 Web 套接字

[英]C# - Implement Secure Web Socket

我想問您是否知道如何使用.Net 實現安全Web Socket。 我已經實現了 ws://,一切正常,但我不知道如何切換到 wss://。 提前致謝。

你可以試試弗萊克

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
});

這個問題很老了,但這是我如何讓我的 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 連接效果很好:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM