Bilinen bir CA'ya karşı doğrulamaya gerek olmadan apache istemcisini istemci SSL sertifikası nasıl alabilirim?


9

İstemcilerin sertifikalarla kimlik doğrulaması yapmak istediğim bir siteye hizmet vermek için apache2 (2.2.3) kullanıyorum. Yalnızca belirli bir sertifikayı sunan bir kullanıcının bu sertifikayı geçmişte sunanla aynı kullanıcı olduğunu doğrulamam gerektiğinden, sertifikayı imzalayan CA önemsizdir. Bununla birlikte, kullanmanın SSLVerifyClient requiregerektirir SSLCACertificateFile ...(veya SSLCACertificatePath ...) ve sonra apache yalnızca bu dosya / yolda bir CA tarafından imzalanan sertifikaları kabul edecek gibi görünüyor . Herhangi bir istemci sertifikasını almak için apache'yi yayınlama / şarkı söyleme CA'sına bakılmaksızın almanın bir yolu var mı? (yani, müşterinin sunulan ortak anahtara karşılık gelen özel anahtara sahip olduğunu doğrulayın, ancak veren / imzalayan CA'yı doğrulamakla uğraşmayın)


Hangi sertifikaların kimliğinin doğrulandığını izlemeyi nasıl planlıyorsunuz?
Shane Madden

@ShaneMadden: Sertifikaları dahili kullanıcı kimliklerine eşleyen bir tablo gibi bir şey. Açık anahtarlı kriptografinin mekaniği bir şifre değişiminin yerini alacaktı.
Isaac

2
Doğru - Apache'nin sertifikaları dahili kullanıcı kimlikleriyle eşleyen bir tablo yapmadığı . Kullanıcıların istemci sertifikalarıyla kimlik doğrulaması yapacaksanız neden kullanıcılara imzaladığınız sertifikaları vermiyorsunuz? Bahsettiğiniz gibi, tam olarak bunu yapan OpenID sağlayıcıları var. Apache's mod_ssl, bir sertifika imzalama ilişkisine dayanarak kullanıcıların kimliğini doğrulamak için tasarlanmıştır; herhangi bir nedenden dolayı dikkate almayı tercih etmiyorsanız, sertifika kimlik doğrulamasını kendi kodunuzda da sertifikadan kullanıcıya eşlemenizi işleyen uygulamanız gerekir.
Shane Madden

@ShaneMadden: Sertifika vermekten kaçınmayı umuyordum ve yalnızca verdiğim sertifikaları kabul edersem akıllı kart tabanlı sertifikalar çıktı. Ne yaparsam yapayım, sistemin bir kısmı uygulama düzeyinde gerçekleşecek, ancak orada tüm mod_sslmakineler olduğu için, bunun benim için bazı işlerle ilgilenebileceğini umuyordum.
Isaac

1
@ShaneMadden Bir avantajı optional_no_ca, kullanıcı arabirimi için daha iyi olabilmesidir, çünkü sertifika ile ilgili bir sorun varsa bir HTTP hata mesajı görüntüleyebilirsiniz (aksi halde yapamazsınız, çünkü kötü bir istemci sertifikası HTTP katmanından önce bağlantıyı durduracaktır) ). Bir sertifikayı doğrulamanın alternatif yollarını denemek istiyorsanız da yararlıdır (örn. WebID ). Doğrulamayı yapmak için bir şey isteyeceğinizi haklıyorsunuz ve bu istek yalnızca kodla (örn. PHP / CGI / Java içinde) işlendiğinde işe yarayacaktır, dosyalar ile çok fazla değil.
Bruno

Yanıtlar:


10

Bulduğunuz gibi, sertifikayı doğrulamayı Apache Httpd içinde SSL / TLS el sıkışma düzeyinde kullanarak devre dışı bırakabilirsiniz SSLVerifyCLient optional_no_ca.

Yapmaya çalıştığınız şeyle karşılaşacağınız ikinci sorun, istemcinin sertifikayı göndermesini sağlamaktır. Sertifikanızın bir PKI içinde olması amaçlanmadığından, kendinden imzalı olabilir ve çeşitli yayıncıları olabilir.

İstemci sertifikası istendiğinde , sunucu el teslimi sırasında istemciye bir CertificateRequestTLS iletisi gönderir . Bu mesaj certificate_authoritieslisteyi içerir :

Kabul edilebilir sertifika yetkililerinin ayırt edici adlarının listesi. Bu ayırt edici adlar, bir kök CA veya bir alt CA için istenen bir ayırt edici ad belirtebilir; bu nedenle, bu mesaj hem bilinen kökleri hem de istenen bir yetkilendirme alanını tarif etmek için kullanılabilir. Certificate_authorities listesi boşsa, aksi yönde bir dış düzenleme olmadıkça, istemci uygun ClientCertificateType sertifikasını gönderebilir.

Tarayıcılar, hangi istemci sertifikasının gönderileceğini (varsa) seçmek için bunu kullanır.

(Boş listeyle ilgili kısmın yalnızca TLS 1.1'den sonraki spesifikasyonda olduğunu unutmayın. SSL 3.0 ve TLS 1.0 bu konuda sessizdir ve pratikte de çalışacaktır.)

Bunun için iki seçeneğiniz var.

  • Kendinden imzalı olmasını beklediğiniz istemci sertifikalarının hepsinin farklı yayıncıları olacaktır. Ne bekleyeceğinizi bilemeyeceğiniz için, sunucunun boş bir liste göndermesi gerekir. Bunu yapmak için, SSLCADNRequestFileyönergeyi kullanın ve yalnızca boş bir satır içeren bir dosyaya yönlendirin (iyi hatırlarsam, tamamen boş bir dosyayla çalışmaz).

  • İkinci (daha az temiz) seçenek. Bu CA sertifikası tarafından verilmiş olsun ya da olmasın (ya da CA'nın var olup olmadığını) beklediğiniz tüm istemci sertifikaları için ortak olan bir Sertifikayı Veren DN'yi kabul etmektir. Bunu yaparak, PKI modelini önemli ölçüde kırarsınız (daha fazla).

    Aşağıdaki gibi bir İhraççı DN'yi kabul ediyorsanız CN=Dummy CA(örneğin). Herkes CN=Dummy CA, muhtemelen farklı anahtarlarla, Konu DN'si (ve Sertifikayı Veren DN) olarak kullanarak kendinden imzalı bir sertifika oluşturabilir . Her ne kadar SSLCADNRequestFiledirektif listesi oluşturmak için bir sertifika ile yapılandırılmalıdır beklediğini, bu sadece yapılandırarak bir karmaşık (ama diğer direktifler kapsamında doğal) yolu, hiç istemci sertifikasını doğrulamak için kullanılmaz certificate_authoritieslistesi. Eğer, bir hizmetin, bu adlarla koyar kendinden imzalı sertifika olarak ise SSLCADNRequestFile, bu yapacak CertificateRequestTLS mesajı kullanımını CN=Dummy CAiçinde certificate_authoritieslistesinde (bunlar, sadece isimler değil bu aşamada certs). Müşteri daha sonra İhraççı DN ile kendi sertifikasını alabilecekCN=Dummy CA, imzasının bu sertifika (aynı anahtarlar) tarafından doğrulanıp doğrulanamayacağı, bu adımlara zaten imza doğrulaması dahil edilmediğinden.

Bununla birlikte SSLVerifyCLient optional_no_ca, gerçek bir sertifika doğrulaması yapılmadığını unutmayın (sanırım SSL_CLIENT_VERIFYmanuel doğrulamanız zaten yapılandırdığınız bir PKI için sadece bir geri dönüş çözümü ise değişkeni kontrol edebilirsiniz ). Bu aşamada bildiğiniz tek şey, müşterinin sunduğu ortak anahtar sertifikası için özel anahtarın (TLS CertificateVerifymesajı ile garanti edilir ) olmasıdır: bazılarının kimlik doğrulaması olmasını istiyorsanız, bir tür doğrulama gerçekleştirmeniz gerekecektir. çeşit. (Sertifikanın içeriğine, yani ortak anahtarı ile içerdiği adlar / öznitelikler arasındaki herhangi bir bağlamaya güvenemezsiniz.)

Bu dosyalar için iyi çalışmaz, ancak bunu bir uygulama için yapabilirsiniz (örneğin, sertifikayı proxy sunucusuna geçirirseniz PHP / CGI / ... Java bile). Temel yollardan biri, önceden bilinen bir ortak anahtar listesine sahip olmak olabilir veya FOAF + SSL / WebID'deki fikirlere bakabilirsiniz .


2

Kullanılması SSLVerifyCLient optional_no_ca(yerine require) apache veren CA'yı kontrol neden olur (ve böylece bir CA sertifikası dosyası veya yolunu gerekmez). İstemcinin / kullanıcının sertifika göndermemesine izin verir, bu nedenle bir sertifikanın kullanılıp kullanılmadığını kontrol etmek ayrı olarak yapılmalıdır.

(Görünüşe göre mod_sslbelgeleri tam olarak okuyamadım .)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.