如何使用SSL身份认证?解决套接字权限禁止访问错误
问题解决:Socket权限禁止访问错误
你遇到的"An attempt was made to access a socket in a way forbidden by its access permissions"错误,主要和端口绑定权限、证书权限或端口占用有关,以下是具体解决步骤:
1. 检查端口是否被占用
打开命令提示符,执行以下命令查看44300端口是否被其他进程占用:
netstat -ano | findstr :44300
如果返回结果中有进程ID(PID),打开任务管理器结束对应进程,或者修改代码中的端口号为未被占用的数值。
2. 以管理员权限运行程序
Windows系统中,绑定网络端口可能需要管理员权限:
- 右键点击你的Web应用程序或调试工具(如Visual Studio),选择以管理员身份运行,再重新执行代码。
3. 配置证书私钥访问权限
你的代码中使用的证书必须包含私钥,且运行Web应用的账户需要有读取私钥的权限:
- 按下Win+R输入
certmgr.msc打开证书管理器; - 找到你的
MyServer.cer证书(通常在「个人」→「证书」目录下); - 右键证书→「所有任务」→「管理私钥」;
- 添加运行应用的账户(如IIS应用池账户、当前登录用户),并赋予读取权限。
4. 预留端口权限(可选)
如果需要长期固定使用44300端口,可通过命令为指定用户预留端口权限:
netsh http add urlacl url=http://+:44300/ user=你的账户名
替换「你的账户名」为实际运行应用的账户(如DESKTOP-XXXXXX\张三)。
附你提供的代码:
X509Certificate2 CER = new X509Certificate2(Server.MapPath("MyServer.cer"), "password");// Has to be a private X509cert with key TcpListener listener = new TcpListener(IPAddress.Any, 44300); listener.Start(); TcpClient client = listener.AcceptTcpClient(); Console.WriteLine("client accepted"); try { SslStream stream = new SslStream(client.GetStream()); stream.AuthenticateAsServer(CER, false, SslProtocols.Tls12, false); Console.WriteLine("server authenticated"); stream.Close(); Console.Read(); } catch (AuthenticationException err) { Console.WriteLine("Exception: {0}", err.Message); Console.WriteLine("Authentication failed - closing the connection."); return; }
内容的提问来源于stack exchange,提问作者Tavakkoli
相关产品推荐
相关产品推荐

