簡體   English   中英

C#SSL客戶端消息未在服務器上打印

[英]C# SSL Client Message Not Printing on Server

我正在編寫一個將Protobuf-net加密消息發送到服務器的C#客戶端。 客戶端代碼的部分內容如下:

public static void RunClient() {
    TcpClient client = new TcpClient("168.72.70.62", 8443);
    Console.WriteLine("Client connected.");
    var stream = new MemoryStream();
    Serializer.Serialize<String>(stream, "Our client sends.");
    byte[] messsage = stream.ToArray();
    SslStream sslStream = new SslStream(client.GetStream(), false, 
            new RemoteCertificateValidationCallback(ValidateServerCertificate), 
            null);
    try {  // Server name must match name on server certificate
        sslStream.AuthenticateAsClient("168.72.70.62");
        sslStream.Write(messsage);
        sslStream.Flush();
        Console.WriteLine("Message sent.");
    } catch (AuthenticationException e) {
    ....
    }
    client.Close();
    Console.WriteLine("Client closed.");
}

該代碼基於我在這里看到的內容: http : //msdn.microsoft.com/zh-cn/library/system.net.security.sslstream(v=vs.110).aspx

該服務器旨在注冊發生消息事件並打印出消息。 它適用於其他類型的客戶。 服務器和其他客戶端均使用Java並基於Netty的SecureChatServer: https : //github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/securechat/SecureChatServerHandler .java 對於此客戶端,服務器注冊發送了一條消息,但未打印出該消息。

如何獲得服務器以打印出消息?

編輯:實際的解決方案

Netty希望最后一個\\n字符附加到字符串中。 使用Write()不會追加最后一個字符,因此該字符串永遠不會在服務器上刷新。 請注意: Environment.NewLine依賴於平台,並且如果消息是從Windows客戶端發送的,則可能會附加\\r\\n 相反,Netty遵循需要Linux兼容換行符的通信協議。 為了遵守Netty的協議,在序列化之前,請在字符串后手動添加文字\\n


您確定正確驗證服務器嗎?

new RemoteCertificateValidationCallback(ValidateServerCertificate)

嘗試刪除此行。 即使沒有經過認證的服務器上,您也可以讓客戶端進行連接,但其余部分應保持不變。

如果服務器現在正確接收到消息,則是客戶端無法正確驗證服務器。

這可能取決於許多缺陷。 通常是CA或證書。 如果服務器未通過認證,則可以附加自定義驗證處理程序。 使用它,看看會遇到什么錯誤。

指針: 驗證回調

順便說一句:您確定必須認證服務器嗎? 您可以進行加密而無需認證客戶端或服務器。 這些都是SSL的所有不同安全功能,並非總是需要所有這些功能。

暫無
暫無

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

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