将一个项目从 .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
终于搞定!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
SSL证书的问题?
根本没用到 SSL
没使用代理吧
没有,只是在 .net core 3.0 preview 5
下才出现这个问题
@dudu: 几小时前 System.Data.SqlClient又更新了一版,不知道有没有解决该问题
@大志若愚: 现在用的就是最新版
@dudu: SSL routines:ssl_choose_client_version:unsupported protocol,这个应该是个突破口
@dudu: .net core 3.1 也出这个问题
太感激了,我找了一天才发现这个问题,我以为是efcore3.0问题,然后排查后,发现是netcore3.0问题,我升级3.1依然问题存在,看到你的解答,终于搞好了
找了半天, 终于解决了, 楼主牛逼解决问题思路清奇