Bagaimana cara menggunakan ssl_verify_client = ON pada satu server virtual dan ssl_verify_client = OFF di yang lain?

9

Saya ingin memaksa verifikasi klien ssl untuk pada host virtual saya. Tetapi dapatkan kesalahan "Tidak diperlukan sertifikat SSL yang dikirim", mencoba MENDAPATKAN sesuatu darinya.

Berikut ini adalah konfigurasi pengujian saya:

# defaults                                                                                                                                                                    
ssl_certificate /etc/certs/server.cer;                                                                                                                                 
ssl_certificate_key /etc/certs/privkey-server.pem;                                                                                                                     
ssl_client_certificate /etc/certs/allcas.pem;                                                                                                                                 

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server1.example.com;                                                                                                                                          
    root /tmp/root/server1;                                                                                                                                                   

    ssl_verify_client off;                                                                                                                                                    
}                                                                                                                                                                             

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server2.example.com;                                                                                                                                          
    root /tmp/root/server2;                                                                                                                                                   

    ssl_verify_client on;                                                                                                                                                     
} 

Server pertama membalas dengan 200 kode http, tetapi yang kedua mengembalikan "400 Permintaan Buruk, Tidak diperlukan sertifikat SSL yang dikirim, nginx / 1.0.4".

Mungkin, tidak mungkin menggunakan ssl_verify_client pada IP yang sama? Haruskah saya mengikat server ini ke IP yang berbeda, apakah ini akan menyelesaikan masalah saya?

Alexander Artemenko
sumber

Jawaban:

4

Saya mengalami masalah yang sama, tetapi mencari untuk membedakan ssl_verify_clientsantara blok lokasi dalam blok server, daripada antara blok server. Anda mungkin dapat memecahkan masalah Anda dengan memindahkan hal-hal konfigurasi ssl default ke dua server (menduplikasinya, tentu saja, atau menempatkan semuanya dalam satu blok server, menerima beberapa sub-domain, dan menggunakan lokasi).

Untuk solusi berbasis lokasi, terlihat seperti karya berikut. Menggunakan

ssl_verify_client optional;

di blok server, dan gunakan pernyataan-if di berbagai lokasi, misalnya:

if ($ssl_client_verify != SUCCESS) { return 403; }

Saya perlu melakukan ini untuk memberikan akses admin ke aplikasi web, namun masih mengizinkan webhook dari github tanpa memberikan github sertifikat klien ssl.

Ethan
sumber
2

Anda harus meningkatkan setidaknya ke nginx> = 1.0.9 jika Anda ingin memiliki beberapa host virtual berbasis nama (menggunakan SNI) pada alamat dan port IP yang sama, tetapi dengan ssl_verify_clientpengaturan yang berbeda untuk host ini.

Dalam versi nginx yang lebih lama ssl_verify_clientpengaturan untuk virtual host default digunakan untuk semua host virtual berbasis nama lainnya pada kombinasi port IP + yang sama. Beberapa opsi SSL lainnya ( ssl_verify_depth, ssl_prefer_server_ciphers) juga ditangani dengan cara yang sama. Menggunakan IP atau port terpisah dapat menjadi solusi jika Anda benar-benar tidak dapat memutakhirkan.

Catatan dari nginx changelog untuk 1.0.9:

*) Bugfix: the "ssl_verify_client", "ssl_verify_depth", and
   "ssl_prefer_server_ciphers" directives might work incorrectly if SNI
   was used.

Perubahan yang relevan dalam sumber nginx: r4034 di bagasi, r4246 di cabang 1.0.

Sergey Vlasov
sumber
0

Sudahkah Anda memuat sertifikat klien (dalam format PKCS12) yang ditandatangani oleh CA "/etc/certs/allcas.pem" di browser Anda? Di Firefox, Anda dapat memeriksa sertifikat klien dengan masuk ke Preferensi -> Tingkat Lanjut -> Enkripsi -> Lihat Sertifikat -> Sertifikat Anda.

Nilai parameter "ssl_verify_client" jika "off" secara default. Anda juga dapat menggunakan nilai "opsional" jika sertifikat klien SSL tidak wajib.

pengguna1025596
sumber
Saya menggunakan curl --cert ... dengan hasil yang sama.
Alexander Artemenko
Apakah ada yang menarik di log kesalahan nginx? (mungkin /var/log/nginx/error.log)
user1025596
0

Saya bukan ahli nginx, tetapi saya telah melihat masalah yang sama dengan apache menggunakan SSL dan host virtual. Masalahnya adalah urutan di mana server menangani negosiasi SSL versus pilihan host virtual. Langkah pertama adalah membuat koneksi terenkripsi, dan hanya setelah itu dilakukan server melihat nama host yang Anda minta. Dan sampai ia tahu, ia akan menggunakan pengaturan default - yang dalam hal ini adalah host pertama, yang memerlukan sertifikat klien untuk membangun koneksi SSL.

Jadi, jawaban singkat - dalam hal ini, Anda sebaiknya memiliki port yang terpisah atau alamat IP yang terpisah.

Jenny D
sumber
-1

Saya mengalami masalah yang sama dan menemukan solusi.

Silakan coba tambahkan default_servertanda untuk server kedua

listen 443 ssl default_server;
yfliu
sumber