Enkripsi dan TLS dengan mssql-python

Driver mssql-python mendukung koneksi terenkripsi melalui Transport Layer Security (TLS). Enkripsi melindungi data dalam transit antara aplikasi Anda dan SQL Server, serta mencegah penyadapan dan serangan musuh di tengah.

Enkripsi koneksi

Megaktifkan enkripsi

Gunakan Encrypt kata kunci untuk mengontrol enkripsi koneksi:

import mssql_python

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

Mengenkripsi nilai kata kunci

Nilai Deskripsi
yes Memerlukan enkripsi dan gagal jika server tidak mendukung TLS.
no Tidak mengenkripsi koneksi. Tidak disarankan untuk penggunaan di lingkungan produksi.
strict Menggunakan mode enkripsi ketat TDS 8.0. Memerlukan SQL Server 2022 atau yang lebih baru.

Penting

Azure SQL Database membutuhkan Encrypt=yes. Koneksi tanpa enkripsi ditolak.

Validasi sertifikat

TrustServerCertificate

Mengontrol apakah driver memvalidasi sertifikat TLS server:

# 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;"
)
Nilai Deskripsi
no Memvalidasi sertifikat terhadap CA tepercaya. Nilai ini adalah pengaturan default dan yang direkomendasikan.
yes Memercayai sertifikat apa pun dan melewati validasi. Pengaturan ini tidak aman.

Caution

Pengaturan TrustServerCertificate=yes dalam produksi mengekspos aplikasi Anda ke serangan musuh di tengah. Hanya gunakan pengaturan ini untuk pengembangan dengan sertifikat yang ditandatangani sendiri.

Enkripsi ketat TDS 8.0

SQL Server 2022 dan yang lebih baru mendukung TDS 8.0 dengan mode enkripsi yang ketat:

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

Mode ketat memberikan tingkat keamanan tertinggi:

  • Driver menetapkan TLS sebelum jabat tangan TDS.
  • Validasi sertifikat diperlukan, dan Anda tidak dapat menggunakan TrustServerCertificate=yes.
  • Mode ini memberikan tingkat perlindungan tertinggi terhadap intersepsi.

HostNameInCertificate

Ketika nama sertifikat server tidak cocok dengan nama server koneksi:

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

Kata kunci ini berguna ketika:

  • Aplikasi Anda terhubung melalui alamat IP, bukan nama host.
  • Server berada di belakang penyeimbang beban.
  • Sertifikat menggunakan nama subjek yang berbeda dari nama server koneksi.

Azure SQL Database

Azure SQL Database memerlukan enkripsi:

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

SQL Server lokal (produksi)

Untuk SQL Server lokal dengan sertifikat yang ditandatangani CA, simpan TrustServerCertificate=no agar driver memvalidasi identitas server:

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

Pengembangan dengan sertifikat yang ditandatangani sendiri

Selama pengembangan dengan sertifikat yang ditandatangani sendiri, atur TrustServerCertificate=yes untuk melewati validasi sertifikat:

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

SQL Server 2022 dan versi yang lebih baru dengan mode ketat

Gunakan Encrypt=strict untuk TDS 8.0, yang membungkus seluruh koneksi dalam TLS sejak awal:

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

Troubleshooting

"Penyedia SSL: Kegagalan validasi sertifikat"

Sertifikat server tidak dapat divalidasi. Jalankan pemeriksaan ini:

  • Verifikasi sertifikat berasal dari CA tepercaya.
  • Periksa apakah tanggal kedaluwarsa sertifikat valid.
  • Verifikasi nama host server cocok dengan sertifikat CN atau SAN.
  • Untuk pengembangan, gunakan TrustServerCertificate=yes.

"Penyedia TCP: Koneksi yang ada ditutup secara paksa"

Server mungkin memerlukan enkripsi, tetapi klien tidak memintanya. Coba langkah-langkah berikut:

  • Tambahkan Encrypt=yes ke string koneksi Anda.
  • Periksa konfigurasi SQL Server untuk pengaturan Enkripsi Paksa.

"Rantai sertifikat dikeluarkan oleh otoritas yang tidak dipercaya"

CA akar sertifikat ini tidak ada di penyimpanan root tepercaya sistem. Jalankan pemeriksaan ini:

  • Instal sertifikat CA di penyimpanan akar tepercaya.
  • Untuk Azure SQL, pastikan sistem Anda memercayai sertifikat CA Microsoft.
  • Untuk pengembangan, gunakan TrustServerCertificate=yes.

Koneksi gagal dengan enkripsi ketat

Mode ketat TDS 8.0 memiliki persyaratan berikut:

  • Server harus menjalankan SQL Server 2022 atau yang lebih baru.
  • Server harus memiliki sertifikat tepercaya yang valid.
  • Anda tidak dapat mengatur TrustServerCertificate=yes.

Jika server tidak mendukung TDS 8.0, gunakan Encrypt=yes sebagai gantinya.