作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个多线程异步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/
我是一名优秀的程序员,十分优秀!