0%

dotnet core 3 container 無法連線 MSSQL 2016

情境

最近踩到 dotnet core 3 contaienr + ms sql 2016 的問題,問題的現象是,程式只要跑到建 sql connection 那行就會 hang 在那邊,沒有 timeout 也沒有 Exception … 追查之下後發現,原來 MS SQL 2016 如果沒有調整更新,預設 TLS 好像只支援 1.0、1.1 (待確認),而我用的 base image : mcr.microsoft.com/dotnet/core/runtime:3.1 的 TLS 設定要求最低版本是 1.2,這也就引發了上述的狀況

1
2
3
4
# cat /etc/ssl/openssl.cnf 
[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=2

解法

一般來說,基於安全性會建議至少停用 TLS 1.0 並支援 1.2 才是比較好的做法,但如果你跟我一樣只是在測試,那可以採用以下比較 workaround 的做法,在 dockerfile 加上以下幾行來調整 container tls 最低支援版本

1
2
3
4
RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /etc/ssl/openssl.cnf
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /etc/ssl/openssl.cnf
RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /usr/lib/ssl/openssl.cnf
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /usr/lib/ssl/openssl.cnf

這樣重新啟動也就會正常了