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 CertificateRequest
TLS iletisi gönderir . Bu mesaj certificate_authorities
listeyi 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, SSLCADNRequestFile
yö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 SSLCADNRequestFile
direktif 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_authorities
listesi. Eğer, bir hizmetin, bu adlarla koyar kendinden imzalı sertifika olarak ise SSLCADNRequestFile
, bu yapacak CertificateRequest
TLS mesajı kullanımını CN=Dummy CA
içinde certificate_authorities
listesinde (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_VERIFY
manuel 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 CertificateVerify
mesajı 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 .