Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#SSL安全套接字_C#_Sockets_Ssl_Ssl Certificate_Sslstream - Fatal编程技术网

C#SSL安全套接字

C#SSL安全套接字,c#,sockets,ssl,ssl-certificate,sslstream,C#,Sockets,Ssl,Ssl Certificate,Sslstream,我有一个很好的通信器应用程序,用C#编写。现在我需要实现到服务器的安全连接。我曾尝试将套接字和TcpClient对象更改为SslStream,但出现了一些错误 首先,我使用makecert生成了一个.cer证书。OpenSSL证书不适用于我,因为它们不包含私钥。接下来,我在服务器上创建了一个证书对象,并将其绑定到SslStream: X509Certificate serverCertificate = X509Certificate.CreateFromCertFile("ca.cer");

我有一个很好的通信器应用程序,用C#编写。现在我需要实现到服务器的安全连接。我曾尝试将套接字和TcpClient对象更改为SslStream,但出现了一些错误

首先,我使用makecert生成了一个.cer证书。OpenSSL证书不适用于我,因为它们不包含私钥。接下来,我在服务器上创建了一个证书对象,并将其绑定到SslStream:

X509Certificate serverCertificate = X509Certificate.CreateFromCertFile("ca.cer");
TcpClient clientSocket = this.tcpListener.AcceptTcpClient();
SslStream ssls = new SslStream(clientSocket.GetStream(), false);
ssls.AuthenticateAsServer(serverCertificate, false, SslProtocols.Tls, true);
在客户端,我正在这样做:

TcpClient client = new TcpClient(settings.IP, settings.Port);                                
sslStream = new SslStream(client.GetStream(), false,
    new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
sslStream.AuthenticateAsClient(settings.IP);

public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
        return true;

    Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
    return false;
}
但是客户端函数抛出一个异常。我尝试了其他几种方法参数,但这些都不适用于我

谁能帮助我,或者一步一步地解释如何把简单的插座换成安全的插座?要明确的是,SSL不是要求-如果有更简单的方法使连接安全,我可以使用它


编辑: 异常消息如下:

The remote certificate is invalid according to the validation procedure.
有什么例外

我猜您会遇到异常,因为您的客户端证书被服务器拒绝为有效(除非您做了必要的事情来建立信任)


当使用自签名证书(由makecert创建的证书)时,在创建SslStream对象时,还必须提供客户端证书验证回调。使用此构造函数重载。CER文件通常包含没有私钥的证书。把它加载到服务器上是行不通的。您还需要一个私钥。最简单的方法是生成证书和密钥,并将它们一起保存为PFX格式。然后从服务器上的PFX加载证书和密钥


现在,仅使用代码对服务器进行身份验证。这是您想要做的吗(即,您不想在服务器上对客户端进行身份验证吗)?

对不起-“根据验证过程,远程证书无效。”对于自签名证书。总是从证书验证处理程序(ValidateServerCertificate)返回true,我听说这个问题(不包括私钥),但我认为我的.cer没有问题。在此错误之前,我得到了关于私钥的异常。然后我用另一个程序生成了证书文件,并传递了这个错误。我需要d SSL,只是为了安全传输。认证其实并不必要。对不起,我的腿瘸了,但我好像在听关于安全的讲座:)@Matthew当然编辑这个问题改变了一切。你在sslPolicyErrors中得到了什么?