Tag: sslstream

相互SSL身份validation – sslstream中的本地证书在客户端上返回“null”而不是证书

我正在创建一个Windows服务,它将调用API。 对于此过程,我正在尝试建立Mutual(双向)SSL身份validation。 因为我是新手。 我试图实现一个简单的客户端和服务器项目,它将相互validation。 我创建了自签名证书,并在可信证书中添加。 我的客户 using System; using System.Configuration; using System.Net.Security; using System.Net.Sockets; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; using System.Text; namespace MutualSslDemo.Client { class Program { static void Main(string[] args) { // hostName var hostName = ConfigurationManager.AppSettings[“hostName”]; if (String.IsNullOrEmpty(hostName)) throw new ArgumentNullException(“hostName”, “Please specify a valid hostname to connect to.”); // port var port = […]

如何(重复)读取.NET SslStream超时?

我只需要从SslStream读取N个字节,但如果在超时之前没有收到任何字节,则取消,同时让流保持有效状态以便稍后再试。 (*) 对于非SSL流,即NetworkStream只需使用其ReadTimeout属性即可轻松完成,这将使流在超时时抛出exception。 不幸的是,根据官方文档,这种方法不适用于SslStream : SslStream假定当从内部流抛出一个IOException时,超时以及任何其他IOException将被其调用者视为致命的。 超时后重用SslStream实例将返回垃圾。 应用程序应该关闭SslStream并在这些情况下抛出exception。 [更新1]我尝试了一种不同的方法: task = stream->ReadAsync(buffer, 0, buffer->Length); if (task->Wait(timeout_ms)) { count = task->Result; … } 但是如果Wait()返回false则这不起作用:稍后再次调用ReadAsync()时会抛出exception: 抛出exception:System.dll Tests.exe中的“System.NotSupportedException”警告:0:从套接字读取失败:System.NotSupportedException:当另一个读取操作挂起时,无法调用BeginRead方法。 [更新2]我尝试了另一种通过在底层TcpClient套接字上调用Poll(timeout, …READ)来实现超时的TcpClient :如果它返回true ,则在SSlStream上调用Read() ,或者如果它返回false那么我们有一个超时。 这也不起作用:因为SslStream可能使用自己的内部中间缓冲区,即使在SslStream还有数据需要读取, Poll()也可以返回false 。 [更新3]另一种可能性是编写一个位于NetworkStream和SslStream之间的自定义Stream子类,捕获超时exception并返回0字节而不是SslStream 。 我不知道如何做到这一点,更重要的是,我不知道是否返回一个0字节读取到SslStream仍然不会以某种方式破坏它。 (*)我试图这样做的原因是,与非安全或安全套接字的超时同步读取是我已经在iOS,OS X,Linux和Android上用于某些跨平台代码的模式。 它适用于.NET中的非安全套接字,因此剩下的唯一情况是SslStream 。

C#SSL安全套接字

我有一个很好的,有效的沟通应用程序,用C#编写。 现在我需要实现与服务器的安全连接。 我已经尝试将Socket和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 == […]

如何在c#中通过客户端识别服务器身份validation的服务器名称

我最近一直在尝试用C#创建一个SSL加密的服务器/客户端。 我在MSDN上遵循了本教程,但是,它需要使用makecert.exe为服务器和客户端使用创建证书,所以我找到了一个示例并且它创建了证书: makecert -sr LocalMachine -ss My -n“CN = Test”-sky exchange -sk 123456 c:/Test.cer 但现在问题是服务器启动并等待客户端,当客户端连接它时使用机器名称 ,在这种情况下,我可以收集的是我的IP: 127.0.0.1 ,然后它需要服务器名称 ,该名称必须与证书( Test.cer )上的服务器名称匹配。 我尝试了多种组合(例如“Test”“LocalMachine”,“127.0.0.1”但似乎无法让客户端给出服务器名称以匹配,从而允许连接。我得到的错误是: 证书错误:RemoteCertificateNameMismatch,RemoteCertificateChainErrors例外:根据validation程序,远程证书无效 这里是我使用它的代码与MSDN示例的不同之处仅在于我在应用程序中为服务器分配证书路径以及客户端的机器名和服务器名称: SslTcpServer.cs using System; using System.Collections; using System.Net; using System.Net.Sockets; using System.Net.Security; using System.Security.Authentication; using System.Text; using System.Security.Cryptography.X509Certificates; using System.IO; namespace Examples.System.Net { public sealed class SslTcpServer { static X509Certificate serverCertificate = […]

通过TCP / .NET SSLStream发送文件很慢/不起作用

我正在编写一个服务器/客户端应用程序,它使用SSL(通过SSLStream ),它必须做很多事情(不仅仅是文件接收/发送)。 目前,它的工作原理是:只有一个连接。 我总是使用SSLStream.WriteLine()从客户端/服务器发送数据并使用SSLStream.WriteLine()接收它,因为我可以通过一个连接发送所有信息,我可以从所有线程发送而不会破坏数据。 现在我想实现文件发送和接收。 与我的客户端/服务器应用程序中的其他内容一样,每条消息都有一个前缀(如cl_files或sth)和base64编码的内容部分(前缀和内容由|分隔)。 我实现了这样的文件共享:上传器向接收器发送关于总文件大小的消息,然后上传者通过前缀r发送文件的base64编码部分。 我的问题是文件共享真的很慢。 我从localhost到localhost大约20KB / s。 我还有另一个问题。 如果我增加文件的base64编码部分的大小(这使文件共享更快),前缀r不再出现给接收器(因此数据无法识别)。 我怎样才能让它更快? 任何帮助将不胜感激。 我的(可能很糟糕的)代码是针对客户的: //its running inside a Thread FileInfo x = new FileInfo(ThreadInfos.Path); long size = x.Length; //gets total size long cursize = 0; FileStream fs = new FileStream(ThreadInfos.Path, FileMode.Open); Int16 readblocks = default(Int16); while (cursize < size) { byte[] buffer = […]

使用CA证书文件validation远程服务器X509Certificate

我使用OpenSSL生成了CA和多个证书(由CA签名),我有一个.NET / C#客户端和服务器都使用SslStream ,每个都有自己的证书/密钥,启用了相互身份validation并禁用了吊销。 我正在使用RemoteCertificateValidationCallback为SslStreamvalidation远程服务器的证书,我希望我只能在程序中加载CA的公共证书(作为文件)并使用它来validation远程证书,而不是在Windows中实际安装CA.证书商店。 问题是除非我将CA安装到商店中,否则X509Chain不会显示任何其他内容,当我打开其中一个证书的PEM版本时,Windows CryptoAPI shell也会显示。 我的问题是,当RemoteCertificateValidationCallback , X509Certificate和X509Chain似乎没有给我任何工作时,如何使用CA的公共证书文件而不使用Windows证书存储或WCF来validation我的特定CA是否签署了证书?

.NET 4.5中sslStream的密码选择

我正在尝试使用.Net的sslStream类创建TLS1.1 / TLS1.2服务器。 默认情况下,此流接受的唯一密码套件似乎是: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 我想启用这些的非ECDHE版本(即TLS_RSA_WITH_AES_128_CBC_SHA256)。 我搜索了一下,人们谈论通过修改默认的SChannel设置来更改密码套件 – 通过“SSL密码套件订单”或使用CNGfunction: http : //msdn.microsoft.com/en-us/library/窗户/桌面/ bb870930(v = vs.85)的.aspx 但是,我试过这个,我无法得到任何工作。 使用上面链接的C ++代码列出带有BCryptEnumContextFunctions()的启用密码套件,表明默认情况下启用了我想要的密码套件。 我甚至添加了TLS_RSA_WITH_AES_128_CBC_SHA256作为最高优先级套件,并且sslStream仍然拒绝来自仅支持该密码的客户端的TLS连接(例外:“客户端和服务器无法通信,因为它们没有通用算法”)任何想法是什么在这里? (顺便说一句,如果我的客户支持其中一个ECDHE密码套件,一切都很好) 其他人如何在.Net 4.5中实现TLS? 我应该关注开源解决方案吗? SChannel的包装器如何更直接地使用CNG api?

使用SSL和SslStream进行对等身份validation?

我需要在使用TCP / IP套接字进行通信的各种进程之间提供安全通信。 我想要身份validation和加密。 我不想重新发明轮子,而是真的想使用SSL和SslStream类以及自签名证书。 我想要做的是根据本地应用程序中的已知副本validation远程进程的证书。 (不需要是证书颁发机构,因为我打算手动复制证书)。 为此,我希望应用程序能够在第一次运行时自动生成新的证书。 除了makecert.exe之外,看起来此链接显示了一种自动生成自签名证书的方法,因此这是一个开始。 我查看了SslStream的AuthenticateAsServer和AuthenticateAsClient方法。 您可以提供回电validation,因此看起来可能。 但是现在我已经了解了它的细节,我真的不认为这样做是可能的。 我正朝着正确的方向前进吗? 还有更好的选择吗? 有没有人之前做过这样的事情(基本上是点对点SSL而不是客户端服务器)?