mssql-python을 이용한 암호화 및 TLS

mssql-python 드라이버는 전송 계층 보안(TLS)을 통한 암호화된 연결을 지원합니다. 암호화는 애플리케이션과 SQL Server 간 전송 중인 데이터를 보호하고, 도청과 중간 공격을 방지합니다.

연결 암호화

암호화 사용

연결 암호화를 제어하기 위해 키워드를 Encrypt 사용하세요:

import mssql_python

# Require encryption (recommended)
conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
)

키워드 값 암호화

설명
yes 암호화가 필요하고 서버가 TLS를 지원하지 않으면 실패합니다.
no 연결을 암호화하지 않습니다. 프로덕션에 권장되지 않습니다.
strict TDS 8.0 엄격한 암호화 모드를 사용합니다. SQL Server 2022 이상이 필요합니다.

중요합니다

Azure SQL Database는 Encrypt=yes이 필요합니다. 암호화되지 않은 연결은 거부됩니다.

인증서 유효성 검사

서버 인증서 신뢰 여부

드라이버가 서버의 TLS 인증서를 검증하는지 제어합니다:

# Validate server certificate (recommended for production)
conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
)

# Skip certificate validation (development only)
conn = mssql_python.connect(
    "Server=<server>;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=yes;"
)
설명
no 신뢰할 수 있는 CA와 인증서를 검증합니다. 이 값이 기본값이자 권장 설정입니다.
yes 어떤 인증서든 신뢰하고 검증은 건너뛴다. 이 설정은 불안정합니다.

주의

운영 환경에서 TrustServerCertificate=yes을 설정하면 애플리케이션이 적대적 중간자 공격에 노출됩니다. 이 설정은 자체 서명 인증서 개발에만 사용하세요.

TDS 8.0 엄격한 암호화

SQL Server 2022 이후 버전은 엄격한 암호화 모드로 TDS 8.0을 지원합니다:

conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Encrypt=strict;"
)

엄격한 모드는 최고 보안 수준을 제공합니다:

  • 운전자는 TDS 핸드셰이크 전에 TLS를 설정합니다.
  • 인증서 검증은 필수이며, TrustServerCertificate=yes를 사용할 수 없습니다.
  • 이 모드는 도청에 대한 최고 수준의 보호를 제공합니다.

HostNameInCertificate

서버의 인증서 이름이 연결 서버 이름과 일치하지 않을 때:

conn = mssql_python.connect(
    "Server=192.168.1.100;"  # IP address
    "Database=<database>;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
    "HostNameInCertificate=<server>.contoso.com;"  # Certificate CN
)

이 키워드는 다음과 같은 경우에 유용합니다:

  • 애플리케이션은 호스트네임 대신 IP 주소를 통해 연결됩니다.
  • 서버는 로드 밸런서 뒤에 있습니다.
  • 인증서는 연결 서버 이름과 다른 주제 이름을 사용합니다.

Azure SQL 데이터베이스

Azure SQL Database는 암호화가 필요합니다:

conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
)

온프레미스 SQL Server (프로덕션)

CA 서명 인증서가 있는 온프레미스 SQL Server의 경우, 드라이버가 서버 신원을 검증하도록 유지 TrustServerCertificate=no 하세요:

conn = mssql_python.connect(
    "Server=<server>;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
)

자기 서명 인증서를 통한 개발

자체 서명 인증서를 사용할 때 인증서 검증을 건너뛰도록 설정 TrustServerCertificate=yes 하세요:

conn = mssql_python.connect(
    "Server=localhost;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=yes;"
)

엄격한 모드가 적용된 SQL Server 2022 및 이후 버전

TDS 8.0에는 Encrypt=strict를 사용하세요. 이 방법은 처음부터 전체 연결을 TLS로 감쌉니다:

conn = mssql_python.connect(
    "Server=<server>;"
    "Database=<database>;"
    "Encrypt=strict;"
)

Troubleshooting

"SSL 제공자: 인증서 검증 실패"

서버 인증서가 검증되지 않았습니다. 다음 점검을 실행하세요:

  • 인증서가 신뢰할 수 있는 CA에서 온 것인지 확인하세요.
  • 증명서 만료일이 유효한지 확인하세요.
  • 서버 호스트네임이 인증서 CN 또는 SAN과 일치하는지 확인하세요.
  • 개발에 TrustServerCertificate=yes을 사용하십시오.

"TCP 제공자: 기존 연결이 강제로 종료됨"

서버는 암호화를 필요로 할 수 있지만, 클라이언트는 암호화를 요청하지 않았습니다. 다음 단계를 시도합니다.

  • 연결 문자열에 Encrypt=yes를 추가하세요.
  • SQL Server 설정에서 강제 암호화 설정을 확인해 보세요.

"인증서 체인은 신뢰할 수 없는 기관에 의해 발급되었습니다"

인증서의 루트 CA는 시스템의 신뢰 루트 저장소에 없습니다. 다음 점검을 실행하세요:

  • CA 인증서를 신뢰받는 루트 스토어에 설치하세요.
  • Azure SQL의 경우, 시스템이 Microsoft의 CA 인증서를 신뢰하는지 확인하세요.
  • 개발에 TrustServerCertificate=yes을 사용하십시오.

엄격한 암호화로 연결 실패

TDS 8.0 엄격한 모드는 다음과 같은 요구사항을 가지고 있습니다:

  • 서버는 SQL Server 2022 이상을 실행해야 합니다.
  • 서버는 유효하고 신뢰할 수 있는 인증서를 가져야 합니다.
  • TrustServerCertificate=yes을(를) 설정할 수 없습니다.

서버가 TDS 8.0을 지원하지 않는다면 대신 사용 Encrypt=yes 하세요.