gpt4 book ai didi

c# - SSLStream: "A Call to SSPI Failed"异常

转载 作者:行者123 更新时间:2023-11-30 20:04:20 27 4
gpt4 key购买 nike


我有一个奇怪的问题:我在基于 .net2 的 c# 中编写了一个服务器和客户端,它们正在通过 .net 2 SslStream 聊天。 Cl和S之间有1个发送命令的连接,cl和s之间有1个发送文件的连接。
在本地,我的 Windows 机器上一切正常。但是如果我在我的 Linux 服务器上运行服务器(使用单声道),共享文件在某些​​情况下不起作用。我有不同的文件类别,在 3 个文件中有 2 个文件正常工作,在第三个文件中,服务器卡在 SSLStream.AuthenticateAsServer(....); 上,客户端抛出异常消息“对 SSPI 的调用失败,请参阅内部异常”。innerexception 是一个 System.ComponentModel.Win32Exception 消息“收到的消息是意外的或格式错误。”

我认为我在 linux 上运行它的方式可能是错误的。实际上我使用 VS2012 进行本地开发,当我想将它放在服务器上时,我通过 VS 上传编译后的 exe,我使用 mono server.exe 启动它。但我也尝试在 Windows 上使用 modevelop 来编译它(从 monodevelop 编译的东西也可以在本地工作)并在 linux 服务器上使用它,但结果相同。

任何帮助将不胜感激。



这是我的缩短代码:

客户:

//gets auth guid before, then it does
Thread Thre = new Thread(sendfile);
Thre.Start(authguid);


private void sendfile(string guid){
TcpClient cl = new TcpClient();
cl.Connect(hostname, 8789);
SslStream Stream = new SslStream(cl.GetStream(), true, new RemoteCertificateValidationCallback(ServerConnector.ValidateServerCertificate));
Stream.AuthenticateAsClient(hostname);//throws the exception
//sends auth guid and file

}

服务器:

 public class FServer
{

protected static bool halt = false;
protected List<FConnection> connections;
private TcpListener tcpServer;
private IPEndPoint ipEnde = new IPEndPoint(IPAddress.Any, 8789);
private delegate void dlgAccept();
private dlgAccept accepting;
private IAsyncResult resAccept;

public FServer()
{
tcpServer = new TcpListener(ipEnde);
connections = new List<FConnection>();
tcpServer.Start();
accepting = new dlgAccept(accept);
resAccept = accepting.BeginInvoke(null, null);


}

public void accept()
{
do
{
if (tcpServer.Pending())
connections.Add(new FConnection(tcpServer.AcceptTcpClient(), this));

else
Thread.Sleep(750);
} while (!halt && tcpServer != null);
}

public class FConnection
{
public SslStream stream;
//.....some other properties

public static bool ValidateClientCertificate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;

}

public FConnection(TcpClient cl, FServer inst)
{
instance = inst;
client = cl;

stream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateClientCertificate), null);
stream.AuthenticateAsServer(instance.mainserver.serverCert, false, SslProtocols.Tls, false);//hangs sometimes on this
if (stream.IsAuthenticated && stream.IsEncrypted)
{
}
else
{
this.Dispose();
}

//auth and receiving file

}

}
}

最佳答案

好的,我对 innerexception 进行了更深入的研究,并在此处找到了解决方案:

http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/18b4a0ce-b348-403d-8655-fe9d558f8d6b

感谢来自 MSDN 的 paksys

问题出在客户端,我改了

Stream.AuthenticateAsClient(hostname);

X509Certificates.X509Certificate2Collection xc = new X509Certificates.X509Certificate2Collection();
Stream.AuthenticateAsClient(hostname, xc, Security.Authentication.SslProtocols.Tls, false);

关于c# - SSLStream: "A Call to SSPI Failed"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13122093/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com