ご存じのとおり、を使用して、Apache Httpd内のSSL / TLSハンドシェイクレベルで証明書の検証を無効にできますSSLVerifyCLient optional_no_ca
。
あなたがしようとしていることで直面する2番目の問題は、クライアントに証明書を送信させることです。証明書はPKI内にあることを意図していないため、自己署名され、さまざまな発行者が存在する可能性があります。
クライアント証明書を要求すると、サーバーはハンドシェイク中にクライアントにCertificateRequest
TLSメッセージを送信します。このメッセージにはcertificate_authorities
リストが含まれています。
受け入れ可能な認証局の識別名のリスト。これらの識別名は、ルートCAまたは下位CAに必要な識別名を指定できます。したがって、このメッセージを使用して、既知のルートと目的の承認スペースの両方を説明できます。certificate_authoritiesリストが空の場合、反対の外部配置がない限り、クライアントは適切なClientCertificateTypeの証明書を送信できます(MAY)。
ブラウザーはこれを使用して、送信するクライアント証明書(ある場合)を選択します。
(空のリストに関する部分はTLS 1.1以降の仕様にのみ含まれていることに注意してください。SSL3.0およびTLS 1.0はこれについては何も記載しておらず、実際には機能します。)
これには2つのオプションがあります。
期待するクライアント証明書が自己署名される場合、それらはすべて異なる発行者を持つことになります。何を期待するかわからないため、サーバーは空のリストを送信する必要があります。これを行うには、SSLCADNRequestFile
ディレクティブを使用して、空の行のみを含むファイルを指定します(よく覚えているとしたら、完全に空のファイルでは機能しません)。
2番目の(あまりクリーンでない)オプション。そのCA証明書によって実際に発行されたかどうか(またはそのCAが存在するかどうか)に関係なく、期待するすべてのクライアント証明書に共通の発行者DNに同意することです。そうすることで、PKIモデルを大幅に壊すことになります(詳細)。
たとえば、発行者DNに同意した場合CN=Dummy CA
。CN=Dummy CA
サブジェクトDN(および発行者DN)として、おそらく異なるキーを使用して、誰でも自己署名証明書を作成できます。けれどもSSLCADNRequestFile
ディレクティブは、リストを構築するための証明書を使用して構成されることを想定し、これらは、それだけで設定の複雑な(しかし、他のディレクティブのコンテキストで自然な)方法です、すべてのクライアント証明書を検証するために使用されていないcertificate_authorities
リストを。あなたは、サービスとして、これらの名前の自己署名証明書を置く場合はSSLCADNRequestFile
、これが行いますCertificateRequest
TLSメッセージの使用CN=Dummy CA
中certificate_authorities
リスト(これらは単なる名称で、この段階では本命ではありません)。その後、クライアントは発行者DNを使用して独自の証明書を取得できますCN=Dummy CA
いずれにしてもこれらの手順には署名の検証が含まれていないため、署名がその証明書(同じキー)で検証できるかどうか。
このビーイングはしていることを覚えて、言ったSSLVerifyCLient optional_no_ca
本当の証明書の検証が行われていない、(私はあなたがチェックできると仮定しSSL_CLIENT_VERIFY
、あなたのマニュアル検証がとにかく設定したPKIにちょうど代替ソリューションの場合は、変数を)。その段階でわかることは、クライアントが提示した公開鍵証明書の秘密鍵を持っていることです(TLS CertificateVerify
メッセージによって保証されます)。いくつかの認証が必要な場合は、何らかの形式の検証を実行する必要があります。ソート。(証明書の内容、つまり、公開鍵とそれに含まれる名前/属性との間のバインディングは信頼できません。)
これはファイルに対してはうまく機能しませんが、アプリケーション(たとえば、プロキシされたJavaサーバーに証明書を渡した場合はJavaでもPHP / CGI / ...)に対してこれを行うことができます。基本的な方法の1つは、既知の公開鍵のリストを用意するか、FOAF + SSL / WebIDでアイデアを確認することです。