繁体   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