[英]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.