无法在C#中获取SslStream以接受.net框架4.6的TLS 1.2协议

时间:2016-03-03 13:58:18

标签: c# .net ssl tls1.2

我制作了一个应该接受SSL连接的程序。我希望它只接受TLS 1.2来提高安全性。

要做到这一点,我已经安装了.net framework 4.6并使用Visual Studio 2015 express在Windows 7 Professional SP1 pc上编译了SW。目标框架在"应用程序"在VS中已经设置为4.6

在SW中,我使用SslStream方法验证证书,并确保只使用TLS 1.2,我输入行

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

我已尝试在main()插入此行,并在创建新的SSL流之前

对于测试我使用openssl连接,命令:

  

openssl s_client -connect 10.0.0.101:1400 -tls1_2 -cert MyCert.pem   -key private.pem -CAfile entrust.cer

我的问题是C#程序得到以下异常:

  

异常:对SSPI的调用失败,请参阅内部异常。

     

内部异常:不支持请求的功能

OpenSsl的输出

  

CONNECTED(00000150)7964:错误:1408F10B:SSL   例程:SSL3_GET_RECORD:错误的版本号:。\ ssl \ s3_pkt.c:362:

     

没有可用的对等证书

     

没有发送客户端证书CA名称

     

SSLL握手已读取5个字节并写入7个字节

     

新增,(无),密码是(无)安全重新协商不受支持   压缩:无扩展:无无ALPN协商SSL会话:       协议:TLSv1.2       密码:0000       会话ID:       会话ID-CTX:       主密钥:       Key-Arg:无       PSK身份:无       PSK身份提示:无       SRP用户名:无       开始时间:1457011106       超时:7200(秒)       验证返回码:0(ok)

如果我使用-tls1没有问题,所以我认为这是因为.net SslStream不支持tls1_2(或tls1_1)

有没有人可以解释我做错了什么

/卡斯滕

1 个答案:

答案 0 :(得分:13)

ServicePointManager安装程序将修复Web调用(例如使用WebClient),但对于SslStream,您需要更多。您需要在调用AuthenticateAsClient时提供可接受的安全协议。而不是

sslStream.AuthenticateAsClient(hostname);

这样做

sslStream.AuthenticateAsClient(hostname, null, SslProtocols.Tls12, true);