首页新闻找找看学习计划

升级至 .NET Core 3.0 Preview 5 遇到的 SqlClient 问题

0
悬赏园豆:30 [已解决问题] 解决于 2019-05-09 15:21

将一个项目从 .net core 3.0 preview 4 升级至 .net core 3.0 preview 5 之后,SqlClient 出现异常,无法连接数据,报错信息如下:

System.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 35 - An internal exception was caught) ---> System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception. ---> Interop+OpenSsl+SslException: SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL. ---> Interop+Crypto+OpenSslCryptographicException: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol
   --- End of inner exception stack trace ---
   at Interop.OpenSsl.DoSslHandshake(SafeSslHandle context, Byte[] recvBuf, Int32 recvOffset, Int32 recvCount, Byte[]& sendBuf, Int32& sendCount)
   at System.Net.Security.SslStreamPal.HandshakeInternal(SafeFreeCredentials credential, SafeDeleteContext& context, ArraySegment`1 inputBuffer, Byte[]& outputBuffer, SslAuthenticationOptions sslAuthenticationOptions)
   --- End of inner exception stack trace ---
   at System.Net.Security.SslStream.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, ExceptionDispatchInfo exception)
...
   at System.Data.SqlClient.SNI.SNITCPHandle.EnableSsl(UInt32 options)
...

请问如何解决?

问题补充:

从 System.Data.SqlClient 的源码看,即使连接字符串中设置了 Encrypt=false (默认就是这个设置),在数据库登录验证阶段也会使用 SSL ,所以问题不是出在 System.Data.SqlClient

dudu的主页 dudu | 高人七级 | 园豆:40863
提问于:2019-05-09 11:38
< >
分享
最佳答案
1

终于搞定!ssl_choose_client_version:unsupported protocol 是 openssl 返回的错误,后来从 openssl 的角度把问题解决了。

出现问题的 asp.net core 程序是跑在容器中的,容器镜像用的是 mcr.microsoft.com/dotnet/core/aspnet:3.0

运行容器内的 openssl 命令发现 openssl 的版本比较高

# docker exec -t $(docker ps --filter name=blog_api -q) openssl version
OpenSSL 1.1.1b  26 Feb 2019

查看 openssl.cnf 配置文件

# docker exec -t $(docker ps --filter name=blog_api -q) cat /etc/ssl/openssl.cnf
[system_default_sect]
MinProtocol = TLSv1.1
CipherString = DEFAULT@SECLEVEL=2

发现允许的 ssl 最低版本是 TLSv1.2 ,而程序所使用的 SQL Server 数据库版本比较低不支持 TLSv1.2 ,修改为 TLSv1.0 后问题解决

修改方法:在 Dockerfile 中添加下面的指令

RUN sed -i 's/TLSv1.2/TLSv1.0/g' /etc/ssl/openssl.cnf
dudu | 高人七级 |园豆:40863 | 2019-05-09 15:18
其他回答(3)
0

SSL证书的问题?

收获园豆:5
nil | 园豆:660 (小虾三级) | 2019-05-09 12:34

根本没用到 SSL

支持(0) 反对(0) dudu | 园豆:40863 (高人七级) | 2019-05-09 12:54
0

没使用代理吧

收获园豆:5
大志若愚 | 园豆:967 (小虾三级) | 2019-05-09 13:31

没有,只是在 .net core 3.0 preview 5 下才出现这个问题

支持(0) 反对(0) dudu | 园豆:40863 (高人七级) | 2019-05-09 13:35

@dudu: 几小时前 System.Data.SqlClient又更新了一版,不知道有没有解决该问题

支持(0) 反对(0) 大志若愚 | 园豆:967 (小虾三级) | 2019-05-09 13:42

@大志若愚: 现在用的就是最新版

支持(0) 反对(0) dudu | 园豆:40863 (高人七级) | 2019-05-09 13:49

@dudu: SSL routines:ssl_choose_client_version:unsupported protocol,这个应该是个突破口

支持(0) 反对(0) 大志若愚 | 园豆:967 (小虾三级) | 2019-05-09 13:54
0

老大看看此链接,瞧瞧是否有突破口:https://github.com/dotnet/corefx/issues/29620

收获园豆:20
Jeffcky | 园豆:2544 (老鸟四级) | 2019-05-09 13:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册