Skip to content

Проблема при соединении веб-приложения к БД MSSQL 2008-2012

Ошибка:

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) @ Msg 0, Level 20, State 0, Line 0.

Ошибка:

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)

Решение:

Необходимо подправить конфигурационный файл /etc/ssl/openssl.cnf в контейнере.
А именно на:

MinProtocol = TLSv1
CipherString = DEFAULT@SECLEVEL=1

Примечание:
При этом на MSSQL-сервере должны быть установлены все патчи.

1. Узнайте имя контейнера

bash
docker ps | grep wsks-8
В данном примере wsks-8.0_443
30007860dab4 wsks-8.0_443

2. Узнайте версию ОС внутри контейнера

Вместо ${cont_name} укажите верное имя контейнера (см. п. 1).

bash
docker exec ${cont_name} /bin/bash -c "cat /etc/os-release"

или

bash
docker exec ${cont_name} /bin/bash -c "cat /tmp/dks_version"

Возможные образы на момент написания статьи:

  • (Tp11) Alt p11;
  • (D12) Debian 12.11;
  • (A18) Astra 1.8.

3. Выполните команды в зависимости от ОС внутри контейнера

Действия отличаются от версии операционной системы внутри контейнера.

Вместо ${cont_name} укажите верное имя контейнера.

3.1. ALT Container (altlinux) 11

bash
docker exec ${cont_name} bash -c "cp /etc/openssl/openssl.cnf /etc/openssl/openssl.cnf_$(mktemp -u XXXX)"
docker exec ${cont_name} /bin/bash -c "sed -i 's/openssl_conf = openssl_init/# openssl_conf = openssl_init\nopenssl_conf = default_conf/' /etc/openssl/openssl.cnf"

docker exec ${cont_name} /bin/bash -c "printf '\n\n[default_conf]\nssl_conf = ssl_sect' >> /etc/openssl/openssl.cnf"
docker exec ${cont_name} /bin/bash -c "printf '\n\n[ssl_sect]\nsystem_default = ssl_default_sect' >> /etc/openssl/openssl.cnf"
docker exec ${cont_name} /bin/bash -c "printf '\n\n[ssl_default_sect]\nMinProtocol = TLSv1\nCipherString = DEFAULT@SECLEVEL=0\n' >> /etc/openssl/openssl.cnf"
Конфигурационный файл /etc/openssl/openssl.cnf
# openssl_conf = openssl_init
openssl_conf = default_conf
...........................................
[default_conf]
ssl_conf = ssl_sect

[ssl_sect]
system_default = ssl_default_sect

[ssl_default_sect]
MinProtocol = TLSv1
CipherString = DEFAULT@SECLEVEL=0

3.2. Astra Linux 18, Debian 12

bash
docker exec ${cont_name} bash -c "cp /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf_$(mktemp -u XXXX)"
docker exec ${cont_name} /bin/bash -c "sed -i 's/\[openssl_init\]/# [openssl_init]/' /etc/ssl/openssl.cnf"

docker exec ${cont_name} /bin/bash -c "printf '\n\n[openssl_init]\nssl_conf = ssl_sect' >> /etc/ssl/openssl.cnf"
docker exec ${cont_name} /bin/bash -c "printf '\n\n[ssl_sect]\nsystem_default = ssl_default_sect' >> /etc/ssl/openssl.cnf"
docker exec ${cont_name} /bin/bash -c "printf '\n\n[ssl_default_sect]\nMinProtocol = TLSv1\nCipherString = DEFAULT@SECLEVEL=0\n' >> /etc/ssl/openssl.cnf"

docker exec ${cont_name} /bin/bash -c "cat /etc/ssl/openssl.cnf"

systemctl restart ${cont_name}
systemctl status ${cont_name}
Конфигурационный файл /etc/openssl/openssl.cnf
[openssl_init]
ssl_conf = ssl_sect

[ssl_sect]
system_default = ssl_default_sect

[ssl_default_sect]
MinProtocol = TLSv1
CilpherStrin = DEFAULT@SECLEVER=0

4. Перезагрузите контейнер

bash
systemctl restart ${cont_name}

Полезно знать

  1. Проверка поддерживаемых версий SSL и TLS на удаленном сервере MSSQL (адрес 10.38.46.67, порт 1433) инструментом nmap (Nwtwork Mapper):
bash
nmap -script ssl-enum-ciphers -p 1433 10.38.46.67
  1. Проверка поддержки определенной версии SSL или TLS удаленным MSSQL-сервером (адрес 10.38.46.67, порт 1433) из контейнера wsks-8.0_443:
bash
docker exec -ti ${cont_name} /bin/bash -c "openssl s_client -connect 10.38.46.67:1433 -tls1_2"
docker exec -ti ${cont_name} /bin/bash -c "openssl s_client -connect 10.38.46.67:1433 -tls1_1"
docker exec -ti ${cont_name} /bin/bash -c "openssl s_client -connect 10.38.46.67:1433 -tls1"

Для Astra Linux 18, Debian 12

Вместо пункта 3.2 перед созданием контейнера можно изменить Dockerfile.

bash
RUN sed -i 's/\[openssl_init\]/# [openssl_init]/' /etc/ssl/openssl.cnf

RUN printf "\n\n[openssl_init]\nssl_conf = ssl_sect" >> /etc/ssl/openssl.cnf
RUN printf "\n\n[ssl_sect]\nsystem_default = ssl_default_sect" >> /etc/ssl/openssl.cnf
RUN printf "\n\n[ssl_default_sect]\nMinProtocol = TLSv1\nCipherString = DEFAULT@SECLEVEL=0\n" >> /etc/ssl/openssl.cnf
  1. Действия из настоящей статьи необходимо выполнять после каждого пересоздания контейнера.

После пересоздания контейнера настройки openssl.cnf сбрасываются.

© 2003—2025 ООО «Кейсистемс». Все права защищены.