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