Skip to content

Проблема при соединении NEXT (Linux) к БД 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.

Решение:

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

MinProtocol = TLSv1
CipherString = DEFAULT@SECLEVEL=1

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

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

bash
docker ps
В данном примере wsks-6.0.9_443
CONTAINER ID   IMAGE            COMMAND       CREATED        STATUS          PORTS     NAMES
b0696a2f24ea   wsks-6.0.9_443   "/bin/bash"   2 days ago     Up 17 minutes             wsks-6.0.9_443

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

Вместо wsks-6.0.9_443 укажите верное имя контейнера (см. п. 1).

cont_name="wsks-6.0.9_443"
docker exec ${cont_name} /bin/bash -c "cat /etc/os-release"
VERSION="12 (bookworm)"
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

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

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

Вместо wsks-6.0.9_443 укажите верное имя контейнера.

Debian 9, 10, 11

cont_name="wsks-6.0.9_443"
docker exec ${cont_name} /bin/bash -c "sed -i -e 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/' /etc/ssl/openssl.cnf"
docker exec ${cont_name} /bin/bash -c "sed -i -e 's/CipherString = DEFAULT@SECLEVEL=2/CipherString = DEFAULT@SECLEVEL=1/' /etc/ssl/openssl.cnf"
docker exec ${cont_name} /bin/bash -c "cat /etc/ssl/openssl.cnf"
systemctl restart ${cont_name}
systemctl status ${cont_name}

Debian 12

cont_name="wsks-6.0.9_443"
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}
Корректный результат выполнения команд
[openssl_init]
ssl_conf = ssl_sect

[ssl_sect]
system_default = ssl_default_sect

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

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

  1. Проверка поддерживаемых версий SSL и TLS на удаленном сервере MSSQL (адрес 10.38.46.67, порт 1433) инструментом nmap (Nwtwork Mapper):
nmap -script ssl-enum-ciphers -p 1433 10.38.46.67
  1. Проверка поддержки определенной версии SSL или TLS удаленным MSSQL-сервером (адрес 10.38.46.67, порт 1433) из контейнера wsks-6.0.9_443:
cont_name="wsks-6.0.9_443"
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"

Для Debian 12 (ОС внутри контейнера)

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

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

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