gpt4 book ai didi

c# - 如何为非阻塞异步套接字创建 SslStream

转载 作者:行者123 更新时间:2023-11-30 12:26:06 29 4
gpt4 key购买 nike

我有一个多线程异步System.Net.Socket,它监听一个端口。如果我收到来自 HTTP 的请求,我没有任何问题,但最近我不得不向我的应用程序添加 https 支持。

客户给了我一个.arm认证文件。它包含 base-64 编码的 ASCII 数据。文件名为 cert.arm,它存储在我的解决方案文件夹的根目录中。

这是我到目前为止使用该证书所做的事情:

using System;
using System.Net;
using System.Threading;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace SocketExample
{
public class StackOverFlow
{
public static ManualResetEvent _manualResetEvent = new ManualResetEvent(false);
private static X509Certificate2 _cert = X509Certificate2("..\\..\\cert.arm");

static void Main(string[] args)
{
StartListening();
}

private static void StartListening()
{
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 9002);

if (localEndPoint != null)
{
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

if (listener != null)
{
listener.Bind(localEndPoint);
listener.Listen(10);

Console.WriteLine("Socket listener is running...");

listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
}
}
}

private static void AcceptCallback(IAsyncResult ar)
{
_manualResetEvent.Set();

Socket listener = (Socket)ar.AsyncState;

Socket handler = listener.EndAccept(ar);

SslStream sslStream = new SslStream(new NetworkStream(handler, false));
sslStream.AuthenticateAsServer(_cert); // I get exception on this line

StateObject state = new StateObject();
state.workSocket = handler;

handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);

listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
}

private static void ReceiveCallback(IAsyncResult result)
{
StateObject state = (StateObject)result.AsyncState;
Socket handler = state.workSocket;

int numBytesReceived = handler.EndReceive(result);

if (!handler.Connected)
{
handler.Close();
return;
}

if (numBytesReceived > 0)
{
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, numBytesReceived));

string[] lines = state.sb.ToString().Split('\n');

if (lines[lines.Length - 1] == "EOF")
{
// All Data Received. Do Something.
}
else
{
// All Data is not received. Continue reading...
handler.BeginReceive(state.buffer, 0, state.buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), state);
}
}
}
}
}

证书文件创建成功。我可以在 _cert 变量中看到数据。没关系。

问题是,当我调用 AuthenticateAsServer 方法时,我得到 NotSupportedException,它说:“服务器模式 SSL 必须使用具有关联私钥的证书”。

如何将此认证文件应用于我的套接字?

最佳答案

您可能应该使用 X509Certificate2 而不是 X509Certificate。它could be the only step required解决此错误。

X509Certificate2 有一个私钥成员,与 X509Certificate 不同,SSL 套接字需要私钥来完成它的工作。

关于c# - 如何为非阻塞异步套接字创建 SslStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29875726/

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