MS-SQL Server의 Encryption(ssl/tls) handshake failed 관하여

안녕하세요, 닷넷으로 개발중인 입문자 입니다.

현재 C# .NET 8.0 Avalonia UI 를 이용하여
Windows 와 Linux (Ubuntu 22.04 / 24.04) 쪽에서 둘다 실행이 가능한
프로그램을 만드려 하는데,

MS SQL Server와의 연결을 위하여 Microsoft.Data.SqlClient 의
SqlConnection 을 이용하여 Open()을 하려 했습니다.

접속하려고 테스트한 SQL Server는 총 3개 입니다.

  1. Microsoft SQL Server 2005 - 9.0.3077
  2. Microsoft SQL Server 2008 R2 (SP2) - 10.50.4042.0 (X64)
  3. Microsoft SQL Server 2022 - 16.0.1000

처음에는
"
Error: A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: SSL Provider, error: 31 - Encryption(ssl/tls/ handshake failed)
" 오류가 발생하였는데, 자료를 찾던 중

위 링크의 내용을 참고하면서 테스트를 진행해봤습니다.

2번과 3번의 경우에는 답변의 내용대로 openssl.cnf 를 수정하니
Connection O.K 가 되었는데,

1번 Server의 경우에는 오류 내용이
"
Error: Connection Timeout Expired. The timeout period elapsed during the post-login phase. The connection could have timed out while waiting for server to complete the login process and respond; Or it could have timed out while attempting to create multiple active connections. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=0; handshake=9; [Login] initialization=0; authentication=0; [Post-Login] complete=14005;
"
로 바뀌었으나 실제로 연결이 되지는 않습니다.

이것저것 찾아보다 보니,
Linux (ubuntu)의 경우 SSL 의 TLS 정책을 따라가는데
Microsoft.Data.SqlClient를 Linux 에서 사용하려면
최소 TLS v1.2 가 필요한데

MS SQL Server 2005와 패치가 안 된 2008의 경우에는
TLS v1.0 만 지원하므로 사용할 수 없다라고 하네요.

이 경우에, 만약
MS SQL Server 2005 와 Microsoft.Data.SqlClient 간에
연결이 가능한 다른 방법이 있을까요?

아니면 구형 서버는
System.Data.SqlClient 를 이용하는 방법밖에 없을까요?

1개의 좋아요

질문 답변은 자유게시판이 아닌 적절한 질문 답변 게시판에 올려주시면 감사하겠습니다. 카테고리는 변경해드렸습니다.

2개의 좋아요

결론부터 얘기하면 System.Data.SqlClient를 사용하는 방법이나 Encrypt=Optional;TrustServerCertificate=True 를 넣어서 사용하는 방법 밖에 없을 거 같습니다. 보안적으로 보면 좋지 않은 선택들인데 2019 정도로만 올리면 best긴 할텐데 여건이 어떠신지 몰라 적어도 2012 SP4 이상으로 올리시는 건 어떨지 의견드려봐요.

네, 감사합니다.

  1. Encrypt=False;
  2. Encrypt=False; TrustServerCertificate=True;
  3. Encrypt=True; TrustServerCertificate=True;
  4. Encrypt=Optional; TrustServerCertificate=True;

4가지를 모두 해봤는데 Linux 에서는
Encrypt = True ; 일 때와 Encrypt = Optional; 일 때도 마찬가지로 접속이 안 되네요.

확인해봤을 때 새로 발견한 점은,

AMD64 기반 PC판 Ubuntu 24.04 에서는
MS SQL Server 2008 SP2 를 Encrypt=False로도 접속이 되는데

Arm64 (aarch64기반) Ubuntu 22.04 에서는
같은 connection string 에 같은 조건으로 맞춰놓아도
접속이 안 되고
Error: A connection was successfully establisehd with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error:35 - An internal exception was caught)
오류가 발생하네요.

일단은 새 프로그램에서는 구 버전 지원을 안 하는걸로 고려해보아하겠네요.
감사합니다.

1개의 좋아요