다음을 통해 공유


암호화 지원 이해

JDBC 드라이버 다운로드

SQL Server에 연결할 때 응용 프로그램에서 암호화를 요청하고 SQL Server 인스턴스가 TLS 암호화를 지원하도록 구성된 경우, Microsoft JDBC Driver for SQL Server는 TLS 핸드셰이크를 시작합니다. 핸드셰이크를 통해 서버와 클라이언트에서는 데이터 보호에 사용될 암호화 및 암호화 알고리즘을 협상할 수 있습니다. TLS 핸드셰이크가 완료되면 클라이언트와 서버가 암호화된 데이터를 안전하게 보낼 수 있습니다. TLS 핸드셰이크 중에 서버는 클라이언트에 공개 키 인증서를 보냅니다. 공개 키 인증서의 발급자를 CA(인증 기관)라고 합니다. 클라이언트는 클라이언트가 신뢰하는 인증 기관인지 여부를 확인할 책임이 있습니다.

응용 프로그램에서 암호화를 요청하지 않는 경우 Microsoft JDBC Driver for SQL Server는 SQL Server에서 TLS 암호화를 지원하도록 적용하지 않습니다. SQL Server 인스턴스가 TLS 암호화를 사용하도록 구성되어 있지 않으면 암호화 없이 연결이 설정됩니다. SQL Server 인스턴스가 강제로 TLS 암호화를 사용하도록 구성되어 있으면, 드라이버는 올바르게 구성된 JVM(Java Virtual Machine)에서 실행되는 경우 자동으로 TLS 암호화를 사용하도록 설정합니다. 그렇지 않으면 연결이 종료되고 드라이버에서 오류가 발생합니다.

참고 항목

TLS 연결이 성공하려면 serverName에 전달된 값이 서버 인증서의 SAN(주체 대체 이름)에 있는 CN(일반 이름) 또는 DNS 이름과 정확히 일치해야 합니다.

SQL Server에 TLS를 구성하는 방법에 대한 자세한 내용은 데이터베이스 엔진에 대해 암호화된 연결 사용을 참조하세요.

설명

응용 프로그램에서 TLS 암호화를 사용할 수 있도록 Microsoft JDBC Driver for SQL Server는 버전 1.2 릴리스부터 encrypt, trustServerCertificate, trustStore, trustStorePassword, hostNameInCertificate의 연결 속성을 제공합니다. 드라이버가 TLS 암호화와 함께 TDS 8.0을 사용할 수 있도록 하기 위해 버전 11.2 릴리스부터 연결 속성 serverCertificate가 도입되었습니다. 자세한 내용은 연결 속성 설정을 참조하세요.

다음 테이블에서는 가능한 TLS 연결 시나리오에 대해 Microsoft JDBC Driver for SQL Server 버전이 동작하는 방법을 요약합니다. 각 시나리오는 서로 다른 TLS 연결 속성 집합을 사용합니다. 다음의 테이블을 포함합니다.

  • blank: "연결 문자열 속성이 없음"
  • value: "속성이 연결 문자열에 있고 해당 값은 유효함"
  • any: "속성이 연결 문자열에 있는지, 또는 해당 값이 유효한지 여부는 중요하지 않음"

참고 항목

SQL Server 사용자 인증 및 Windows 통합 인증에 동일한 동작이 적용됩니다.

속성 설정 동작
encrypt = false 또는 blank
trustServerCertificate = any
hostNameInCertificate = any
trustStore = any
trustStorePassword = any
드라이버에서는 서버가 TLS 암호화를 지원하도록 강제로 적용하지 않습니다. 서버에 자체 서명된 인증서가 있는 경우 드라이버는 TLS 인증서 교환을 시작합니다. TLS 인증서는 유효성을 검사하지 않으며 (로그인 패킷의) 자격 증명만 암호화됩니다.

클라이언트에서 TLS 암호화를 지원하도록 서버가 요구할 경우 드라이버에서 TLS 인증서 교환을 시작합니다. TLS 인증서의 유효성은 검사되지 않지만 전체 통신은 암호화됩니다.
encrypt = true
trustServerCertificate = true
hostNameInCertificate = any
trustStore = any
trustStorePassword = any
드라이버가 서버에서 TLS 암호화를 사용하도록 요청합니다.

클라이언트에서 TLS 암호화를 지원하도록 서버에서 요구하거나, 서버에서 암호화를 지원하는 경우 드라이버에서 TLS 인증서 교환을 시작합니다. trustServerCertificate 속성이 "true"로 설정되어 있으면, 드라이버에서 TLS 인증서의 유효성을 확인하지 않습니다.

서버가 암호화를 지원하도록 구성되어 있지 않은 경우 드라이버에서 오류가 발생하고 연결이 종료됩니다.
encrypt = true
trustServerCertificate = false 또는 blank
hostNameInCertificate = blank
trustStore = blank
trustStorePassword = blank
드라이버가 서버에서 TLS 암호화를 사용하도록 요청합니다.

클라이언트에서 TLS 암호화를 지원하도록 서버에서 요구하거나, 서버에서 암호화를 지원하는 경우 드라이버에서 TLS 인증서 교환을 시작합니다.

드라이버는 연결 URL에 지정된 serverName 속성을 사용하여 서버 TLS 인증서의 유효성을 확인하고 신뢰 관리자 팩터리의 조회 규칙을 사용하여 사용할 인증서 저장소를 결정합니다.

서버가 암호화를 지원하도록 구성되어 있지 않은 경우 드라이버에서 오류가 발생하고 연결이 종료됩니다.
encrypt = true
trustServerCertificate = false 또는 blank
hostNameInCertificate = value
trustStore = blank
trustStorePassword = blank
드라이버가 서버에서 TLS 암호화를 사용하도록 요청합니다.

클라이언트에서 TLS 암호화를 지원하도록 서버에서 요구하거나, 서버에서 암호화를 지원하는 경우 드라이버에서 TLS 인증서 교환을 시작합니다.

드라이버는 hostNameInCertificate 속성에 지정된 값을 사용하여 TLS 인증서 주체 값의 유효성을 확인합니다.

서버가 암호화를 지원하도록 구성되어 있지 않은 경우 드라이버에서 오류가 발생하고 연결이 종료됩니다.
encrypt = true
trustServerCertificate = false 또는 blank
hostNameInCertificate = blank
trustStore = value
trustStorePassword = value
드라이버가 서버에서 TLS 암호화를 사용하도록 요청합니다.

클라이언트에서 TLS 암호화를 지원하도록 서버에서 요구하거나, 서버에서 암호화를 지원하는 경우 드라이버에서 TLS 인증서 교환을 시작합니다.

드라이버는 trustStore 속성 값을 사용하여 인증서 trustStore 파일 및 trustStorePassword 속성 값을 찾아 trustStore 파일의 무결성을 검사합니다.

서버가 암호화를 지원하도록 구성되어 있지 않은 경우 드라이버에서 오류가 발생하고 연결이 종료됩니다.
encrypt = true
trustServerCertificate = false 또는 blank
hostNameInCertificate = blank
trustStore = blank
trustStorePassword = value
드라이버가 서버에서 TLS 암호화를 사용하도록 요청합니다.

클라이언트에서 TLS 암호화를 지원하도록 서버에서 요구하거나, 서버에서 암호화를 지원하는 경우 드라이버에서 TLS 인증서 교환을 시작합니다.

드라이버는 trustStorePassword 속성 값을 사용하여 기본 trustStore 파일의 무결성을 검사합니다.

서버가 암호화를 지원하도록 구성되어 있지 않은 경우 드라이버에서 오류가 발생하고 연결이 종료됩니다.
encrypt = true
trustServerCertificate = false 또는 blank
hostNameInCertificate = blank
trustStore = value
trustStorePassword = blank
드라이버가 서버에서 TLS 암호화를 사용하도록 요청합니다.

클라이언트에서 TLS 암호화를 지원하도록 서버에서 요구하거나, 서버에서 암호화를 지원하는 경우 드라이버에서 TLS 인증서 교환을 시작합니다.

드라이버는 trustStore 속성 값을 사용하여 trustStore 파일의 위치를 조회합니다.

서버가 암호화를 지원하도록 구성되어 있지 않은 경우 드라이버에서 오류가 발생하고 연결이 종료됩니다.
encrypt = true
trustServerCertificate = false 또는 blank
hostNameInCertificate = value
trustStore = blank
trustStorePassword = value
드라이버가 서버에서 TLS 암호화를 사용하도록 요청합니다.

클라이언트에서 TLS 암호화를 지원하도록 서버에서 요구하거나, 서버에서 암호화를 지원하는 경우 드라이버에서 TLS 인증서 교환을 시작합니다.

드라이버는 trustStorePassword 속성 값을 사용하여 기본 trustStore 파일의 무결성을 검사합니다. hostNameInCertificate 속성 값을 사용하여 TLS 인증서의 유효성도 확인합니다.

서버가 암호화를 지원하도록 구성되어 있지 않은 경우 드라이버에서 오류가 발생하고 연결이 종료됩니다.
encrypt = true
trustServerCertificate = false 또는 blank
hostNameInCertificate = value
trustStore = value
trustStorePassword = blank
드라이버가 서버에서 TLS 암호화를 사용하도록 요청합니다.

클라이언트에서 TLS 암호화를 지원하도록 서버에서 요구하거나, 서버에서 암호화를 지원하는 경우 드라이버에서 TLS 인증서 교환을 시작합니다.

드라이버는 trustStore 속성 값을 사용하여 trustStore 파일의 위치를 조회합니다. hostNameInCertificate 속성 값을 사용하여 TLS 인증서의 유효성도 확인합니다.

서버가 암호화를 지원하도록 구성되어 있지 않은 경우 드라이버에서 오류가 발생하고 연결이 종료됩니다.
encrypt = true
trustServerCertificate = false 또는 blank
hostNameInCertificate = value
trustStore = value
trustStorePassword = value
드라이버가 서버에서 TLS 암호화를 사용하도록 요청합니다.

클라이언트에서 TLS 암호화를 지원하도록 서버에서 요구하거나, 서버에서 암호화를 지원하는 경우 드라이버에서 TLS 인증서 교환을 시작합니다.

드라이버는 trustStore 속성 값을 사용하여 인증서 trustStore 파일 및 trustStorePassword 속성 값을 찾아 trustStore 파일의 무결성을 검사합니다. hostNameInCertificate 속성 값을 사용하여 TLS 인증서의 유효성도 확인합니다.

서버가 암호화를 지원하도록 구성되어 있지 않은 경우 드라이버에서 오류가 발생하고 연결이 종료됩니다.
encrypt = strict
hostNameInCertificate = value
trustStore = blank
trustStorePassword = blank
serverCertificate = value
드라이버가 서버에서 TDS 8.0 strict TLS 암호화를 사용하도록 요청합니다.

드라이버는 첫 번째 작업으로 서버와 TLS 핸드셰이크 및 인증서 교환을 시작합니다.

trustServerCertificate 설정은 무시되고 strict 모드에서 false로 처리됩니다.

드라이버는 선택적 hostNameInCertificate 또는 serverCertificate 속성을 사용하여 서버 TLS 인증서의 유효성을 검사합니다.

서버가 TDS 8 연결을 지원하도록 구성되어 있지 않은 경우 드라이버에서 오류가 발생하고 연결이 종료됩니다.

encrypt 속성이 true로 설정되어 있는 경우 Microsoft JDBC Driver for SQL Server에서는 JVM의 기본 JSSE 보안 공급자를 사용하여 SQL Server와 SSL 암호화를 협상합니다. 기본 보안 공급자는 TLS 암호화를 성공적으로 협상하는 데 필요한 모든 기능을 지원하지 않을 수 있습니다. 예를 들어 기본 보안 공급자가 SQL Server TLS 인증서에 사용되는 RSA 공개 키의 크기를 지원하지 않을 수 있습니다. 이 경우 기본 보안 공급자에서 오류가 발생해 JDBC 드라이버가 연결을 종료하게 될 수 있습니다. 이 문제를 해결하기 위해 다음 옵션 중 하나를 사용할 수 있습니다.

  • 더 작은 RSA 공개 키가 있는 서버 인증서를 사용하여 SQL Server 구성
  • “<java-home>/lib/security/java.security” 보안 속성 파일에서 다른 JSSE 보안 공급자를 사용하도록 JVM 구성
  • 다른 JVM을 사용합니다.

TLS 인증서의 유효성 검사

TLS 핸드셰이크 중에 서버는 클라이언트에 공개 키 인증서를 보냅니다. JDBC 드라이버 또는 클라이언트는 클라이언트에서 신뢰하는 인증 기관에서 발행된 서버 인증서인지 유효성을 확인해야 합니다. 드라이버는 서버 인증서가 다음 조건을 충족하도록 요구합니다.

  • 신뢰할 수 있는 인증 기관에서 인증서에 서명했습니다.
  • 인증서는 서버 인증용으로 발행되어야 합니다.
  • 인증서가 만료되지 않았습니다.
  • 주체의 CN(일반 이름) 또는 인증서 SAN(주체 대체 이름)의 DNS 이름은 연결 문자열에 지정된 serverName 값, 또는 지정된 경우 hostNameInCertificate 속성 값과 정확히 일치합니다.
  • DNS 이름에는 와일드 카드 문자가 포함될 수 있습니다. 7.2 이전 버전에서는 Microsoft JDBC Driver for SQL Server에서 와일드 카드 일치를 지원하지 않습니다. 즉, abc.com은 *.com과 일치하지 않지만 *.com은 *.com과 일치합니다. 버전 7.2 이상에서는 표준 인증서 와일드 카드 일치가 지원됩니다.

strict 암호화에 TDS 8.0을 사용하기 위해 serverCertificate 속성 값은 서버 인증서 유효성 검사에 사용할 서버 인증서의 경로를 제공합니다. 이 파일은 PEM 파일 형식을 사용해야 합니다. 서버에서 받은 인증서가 이 인증서와 정확히 일치해야 합니다.

참고 항목

암호화 사용
JDBC 드라이버 애플리케이션 보안