问题标签 [sslstream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3209 浏览

c# - 如何允许服务器同时接受 SSL 和纯文本(不安全)连接?

我正在尝试创建一个可以接受安全 SSL 和不安全纯文本连接的服务器(为了向后兼容)。我的代码几乎可以工作,除了从不安全的客户端接收到的第一个传输数据在服务器上丢失了前 5 个字节(字符)。更具体地说,如果我在不安全的连接上传输 30 个字节,当服务器到达OnClientDataReceived()函数时,行“ int iRx = nwStream.EndRead(asyn);”,然后iRx = 25. 从客户端传输的任何后续消息都按预期包含所有发送的字节/字符。我怀疑连接的最初假设是SSLStream可能正在剥离前 5 个字节,然后当它失败时,这 5 个字节已经从缓冲区中提取并且不再可用。有没有人知道我可以采取另一种方法来编写代码,以便服务器可以自动即时切换?

我试图避免执行以下操作:

  • 要求客户端使用纯文本连接NetworkStream,然后请求升级到 SSL 流
  • 在两个不同的端口上设置两个TcpListeners(一个用于安全,一个用于不安全)

这是我的代码:

什么有效:

  • 如果服务器没有证书,则仅使用 NetworkStream,并从客户端接收所有消息的所有字节。
  • 如果服务器确实有证书(设置了 SSLStream)并且可以建立安全连接(使用 https:// 的 Web 浏览器)并且收到所有消息的完整消息。

什么不起作用:

  • 如果服务器确实具有证书(SSLStream已设置)并且从客户端建立了不安全的连接,则当从该客户端接收到第一条消息时,代码会正确检测到SSLStream未通过身份验证并切换NetworkStreamTCPClient. 但是,当EndRead为第一条消息调用它时NetworkStream,发送的消息中缺少前 5 个字符(字节),但仅限于第一条消息。只要TCPClient已连接,所有剩余的消息都是完整的。如果客户端断开连接然后重新连接,则第一条消息被剪裁,然后所有后续消息再次正常。

是什么导致前 5 个字节被剪裁,我该如何避免呢?

我的项目目前正在使用 .NET v3.5...如果可以避免的话,我想保持在这个版本并且不升级到 4.0。


后续问题

Damien 下面的回答确实允许我保留那些丢失的 5 个字节,但是,我更愿意在我的代码中坚持使用BeginReadandEndRead方法以避免阻塞。是否有任何好的教程在覆盖这些时显示“最佳实践”?更具体地说,如何使用IAsyncResult对象。我知道我需要添加存储在 RestartableStream 缓冲区中的任何内容,然后进入内部流(基础)以获取其余内容并返回 toral。但自从IAsyncResultobject 是一个自定义类,我无法弄清楚在返回之前可以将 RestartableStream 的 buff 与内部流的 buff 结合起来的通用方式。我是否还需要实现 BeginRead() 以便我知道用户希望将内容存储到的缓冲区?我猜另一个解决方案是,由于丢弃字节问题仅与来自客户端的第一条消息有关(之后我知道是否将其用作 aSSLStream或 a NetworkStream),因此将通过直接调用Read()RestartableStream 的方法来处理第一条消息(暂时阻止代码),然后对于所有未来的消息,使用异步回调来读取内容,就像我现在所做的那样。

0 投票
1 回答
1709 浏览

c# - SslStream 独立线程

我正在尝试在屏幕上显示来自 ssl 流(来自网站)的任何数据。因为我不知道数据什么时候到达,所以我使用了另一个线程,它一直从流中读取,直到读取字节。这非常有效,但是,我的 CPU 使用率跃升至 25% 并保持在那里(最大使用率为 1 个线程,我的 PC 有 4 个线程)。虽然这确实有点道理,因为线程卡在了一个while循环中,但我没想到线程类的一个实例会消耗我的CPU的整个线程(我可以发誓这在使用简单的客户端时不会发生/服务器应用程序)。

一旦连接初始化,线程就开始运行,用户可以随时向网站发送数据,并且应用程序应该打印出响应。什么是替代解决方案?我应该放弃 SslStream 并开始使用其他东西吗?

这是在这个单独的线程上运行的代码:

谢谢大家,感谢您的帮助

编辑:
我尝试改用 BeginRead 和 EndRead,正如“gt”所建议的那样。为此,每当用户发送请求时,我都会使用 BeginRead。收到所有数据后,我将它们打印在屏幕上。这似乎工作正常,但我担心将来是否会有任何问题。数据包有没有可能弄乱?例如,是否有可能 EndRead 在第一个数据包的末尾没有返回 0 并且它继续读取第二个数据包?如果可能的话,我将如何继续解决这个问题?接收到的数据只是http层的body,所以无法事先访问IP层知道包的长度。

再次感谢

0 投票
2 回答
2118 浏览

c#-4.0 - SslStream TcpClient - 从传输流接收到意外的 EOF 或 0 字节

我正在尝试通过 SslStream / Tcp 客户端连接到服务器。每次我这样做时都会收到一个异常说明:在 AuthenticateAsClient 行的传输流中收到了意外的 EOF 或 0 字节。

我已启用跟踪日志记录,并在日志中收到以下两个错误:

System.Net 信息:0 : [12260] SecureChannel#66702757::.ctor(hostname=xxx.xx.xx.xxx, #clientCertificates=0, encryptionPolicy=RequireEncryption)

System.Net 信息:0:[12260] SecureChannel#66702757 - 剩下 0 个客户端证书可供选择。

有人可以就如何解决这个问题给我任何建议吗?不知道为什么,但如果这有什么不同,它就会扔到外面。

0 投票
1 回答
273 浏览

ssl - 关于 STARTTLS SMTP 命令

STARTTLS 命令是 TLS 通道专用的还是可以与 SSL 通道一起使用?是否有任何 TlsStream 可以用作 SslStream,因为 .Net4 不支持 TLS,即使它可以作为 SslProtocols 枚举的成员使用。

0 投票
1 回答
447 浏览

c# - Windows 商店应用程序和 WPF 应用程序之间的公共类

我正在开发两个应用程序。一个是在 WinRT 上运行的 Windows 商店应用程序,一个是在 Windows 7 或 8 上运行的 WPF 应用程序。

这两个应用程序应该通过 SSL 连接 (Tcp) 进行通信。我想创建一个将由两个应用程序使用的公共类(这样对类的更改将影响两个项目)。

我尝试过使用可移植类库,但是,它不支持任何 SSL 甚至 TCP 连接(没有 System.Net.Sockets 命名空间)。这可能是因为 Windows 商店应用程序使用 StreamSocket 而不是 SslStream 或 TcpClient,而 WPF 应用程序没有 StreamSocket。

有什么共同点可以帮助我发展这门课吗?是否有任何方法可以在 Windows 商店应用程序中使用 SslStream/TcpClient 或在 WPF 应用程序中使用 StreamSocket?为相同的功能设置两个不同的类是非常糟糕的设计。

0 投票
1 回答
1804 浏览

c# - 无法使用分发证书发送 APNS 消息

我已经使用开发证书设置并成功测试了 APNS 消息传递和gateway.sandbox.push.apple.com.
当我切换到我的分发证书并且gateway.push.apple.com消息没有通过并且我遇到异常时:

无法将数据写入传输连接:已建立的连接被主机中的软件中止。

我已按照这些教程生成 p12 证书:

http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1 http://code.google.com/p/apns-sharp/wiki/HowToCreatePKCS12Certificate

我从中发送通知的服务器软件是一个使用SslStreamX509Certificate2类的 .NET 应用程序。

下面是连接代码:

这是发送消息的代码:

在第二次或第三次尝试发送 APNS 消息时引发异常。但是,没有任何消息可以通过设备。我可以换回我的开发证书,并且此代码运行良好(并且 APNS 消息到达设备)。

在我寻找解决问题的过程中,我遇到了一些帖子,指出开发证书以某种方式干扰了部署,但是我不明白这是怎么发生的,或者我应该怎么做才能解决它。

提前感谢您提供的任何帮助。

0 投票
1 回答
3257 浏览

c# - 如何将 C# SSLStream 客户端连接到 OpenSSL 服务器?

我正在为已经存在的用 C++ 编写的OpenSSL 服务器编写C# 客户端(使用 SSLStream 的 Mono) 。我知道理论上,他们应该能够交流,但我总​​是得到一个例外:

身份验证或解密失败。

当我调用时,这发生在Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallbacksslStream.AuthenticateAsClient(ServerName)中;

我不需要客户端身份验证,因此我不使用任何客户端证书,也无法将服务器证书加载到客户端的信任库中,因为我无法在客户端使用命令行。

在服务器上,我似乎收到了一些不应该发生的随机数据,因为我从未sslStream.Write()在客户端代码中调用过。也许我不完全理解握手是如何发生的。我有一个运行良好的 OpenSSL C++ 客户端。

有人知道我怎么能让这个工作吗?

我在服务器端使用由 OpenSSL 生成的自签名证书,我将其转换为 DER 格式。

我如何进行:

服务器端

  1. 初始化 OpenSSL
  2. 加载服务器证书 (DER) 和私钥 (PEM)
  3. 打开非 SSL 监听套接字
  4. 当客户端连接时,我打开一个连接到 SSL_Bio 并接受连接的新套接字
  5. 读取 SSL 套接字以获取传入数据。

客户端

我正在尝试使用改编自本主题中的临时客户端进行连接。

  1. 打开一个新的 TCPClient
  2. 使用与上述线程中相同的验证回调将新的 SSLStream 链接到它;
  3. 调用 AuthenticateAsClient(ServerName) 会带来此异常。
  4. 调用sslStream.Write但执行永远不会到达这里。

任何帮助将不胜感激,因为我不确定 sslStream 内部是如何工作的。

0 投票
1 回答
632 浏览

c# - SslStream 解密问题?

我正在使用 TcpClient 和 SslStream 向服务器发送 https 请求,它通常可以正常工作,并且我能够看到以纯文本形式返回的标头,但页面内容是乱码。我不确定我做错了什么。

这是一个代码片段:

写入控制台的示例结果:

0 投票
1 回答
123 浏览

ssl - 我需要从我的证书中获得什么才能在 .NET 中使用 SSL?

The server mode SSL must use a certificate with the associated private key.

我有我的 Base64 编码的.crt文件和另一个包含大量信息的巨大文本文件,来自我的证书提供商,其中包括等效格式的 RSA 私钥。
我尝试将其放入.pvk文件中,以便稍后制作.pfx文件,但它没有用。(不错的尝试,对吧?)
要在我的 .NET 应用程序中使用此证书,我实际上需要做什么?

编辑:制作了正确的.pvk,制作了.pfx,仍然是同样的错误。

0 投票
1 回答
1303 浏览

vb.net - SslStream:使用可用的检查数据来执行轮询 IO

不久前,我在 vb.net 中编写了一些基本的 Http 网络服务器。我试图避免阻塞 IO,所以基本上我为所有当前连接创建了一个轮询线程。

因此,每当连接有一些新数据时,我都可以读取它,否则立即检查下一个连接。

现在我正在使用 https 扩展网络服务器。因此,我使用了 .Net SslStream 类。我想应用相同的原则(一个轮询线程来读取所有流)

由于没有 .DataAvailable 属性,我尝试了宽度 .Length > 0,但这给出了 NotSupportedException(此流不支持查找操作)

那么,我如何确定某个解密的流是否有可用的数据而不阻塞线程呢?