Ubuntu 22.04가 설치된 호스트에 ansible을 설치했으며, 여기에서 winrm을 사용하여 Windows Server 2012 R2가 있는 호스트에 연결하려고 합니다. 문제는 연결 오류가 발생한다는 것입니다.
몇 시간 동안 오류를 추적한 결과 다음과 같은 이유를 발견했습니다.
- 사용SSL스캔(
--show-sigs
옵션 포함) Windows 호스트는rsa_pkcs1-sha1
서버 서명 알고리즘만 허용한다는 사실을 발견했습니다(조사한 바에 따르면 이 알고리즘은 키 교환 중에 사용되며 인증서와 관련된 서명 알고리즘과는 아무런 관련이 없다는 것을 알고 있습니다). 이것이 Windows Server 2012 R2의 정상적인 동작이라고 말하고 싶지만 이에 대해 확신할 수 있는 Windows 전문가는 아닙니다. - Ubuntu 22.04에는 기본적으로 seclevel 2로 구성된 openssl 3.0.2가 함께 제공됩니다. 내가 이해하는 한 해당 버전과 해당 seclevel의 openssl은 SHA1을 사용하는 알고리즘을 사용하지 않습니다. 이는 Windows 호스트와의 TLS 핸드셰이크 중에 openssl이
rsa_pkcs1-sha1
해당 알고리즘을 Client Hello의 서명_알고리즘 목록에 지원되는 알고리즘으로 표시하지 않는다는 것을 의미합니다(Wireshark를 통해 이를 확인했습니다). - Windows Server 2012 R2 호스트는 이해만
rsa_pkcs1-sha1
하지만 Client Hello에 표시되지 않으므로 호스트가 할 수 있는 유일한 작업은 연결을 종료하고 이벤트 뷰어에 다음 메시지를 남기는 것입니다.원격 클라이언트 애플리케이션에서 TLS 1.2 연결 요청을 받았지만 클라이언트 애플리케이션에서 지원하는 암호화 제품군 중 어느 것도 서버에서 지원되지 않습니다.. 암호 제품군에는 전혀 문제가 없기 때문에 메시지가 오해의 소지가 있다는 점에 유의하세요. 문제는 키 교환을 위한 서명 알고리즘에 있습니다.
이 정보를 바탕으로 나는 openssl의 seclevel을 2에서 0으로 다운그레이드하기로 결정했습니다. Seclevel 0은 openssl이 이전 버전의 openssl(특히 SHA1을 허용함)처럼 작동한다는 것을 의미합니다. 명령과 Wireshark를 사용하여 이 변경으로 openssl이 Windows 호스트에 연결할 수 있음을 확인할 수 있었습니다. openssl s_client
왜냐하면 seclevel 0에서 openssl은 실제로 rsa_pkcs1-sha1
Client Hello의 서명_알고리즘 목록에 알고리즘을 포함하기 때문입니다.
이제 문제는 /etc/ssl/openssl.cnf
seclevel 0으로 구성되었음에도 불구하고 ansible이 여전히 Windows 호스트에 연결할 수 없다는 것입니다. 내 생각엔 ansible이 구성 파일을 완전히 우회하는 openssl의 일부 Python 래퍼를 사용하는 것 같습니다 /etc/ssl/openssl.cnf
. 그래서 질문은: 어떻게 ansible(또는 해당 문제에 대한 Python)이 seclevel 0에서 openssl을 사용하도록 강제할 수 있습니까?