Проблема при соединении веб-приложения к БД 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. Узнайте имя контейнера
docker ps | grep wsks-8В данном примере wsks-8.0_443
30007860dab4 wsks-8.0_4432. Узнайте версию ОС внутри контейнера
Вместо ${cont_name} укажите верное имя контейнера (см. п. 1).
docker exec ${cont_name} /bin/bash -c "cat /etc/os-release"или
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
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=03.2. Astra Linux 18, Debian 12
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=04. Перезагрузите контейнер
systemctl restart ${cont_name}Полезно знать
- Проверка поддерживаемых версий 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-8.0_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"Для Astra Linux 18, Debian 12
Вместо пункта 3.2 перед созданием контейнера можно изменить 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- Действия из настоящей статьи необходимо выполнять после каждого пересоздания контейнера.
После пересоздания контейнера настройки openssl.cnf сбрасываются.