web-dev-qa-db-ja.com

既知のCAに対して検証することなく、ApacheにクライアントSSL証明書を要求させるにはどうすればよいですか?

Apache2(2.2.3)を使用して、クライアントに証明書で認証してもらいたいサイトにサービスを提供しています。特定の証明書を提示するユーザーが過去にその証明書を提示したユーザーと同じであることを確認する必要があるだけなので、証明書に署名するCAは無関係です。ただし、SSLVerifyClient requireを使用するにはSSLCACertificateFile ...(またはSSLCACertificatePath ...)が必要であり、Apacheはそのファイル/パスでCAによって署名された証明書のみを受け入れるようです。発行/歌うCAに関係なく、Apacheがクライアント証明書を受け入れるようにする方法はありますか? (つまり、クライアントが提示された公開鍵に対応する秘密鍵を持っていることを確認しますが、発行/署名CAを確認する必要はありません)

9
Isaac

ご存知のとおり、SSLVerifyCLient optional_no_caを使用して、Apache Httpd内のSSL/TLSハンドシェイクレベルで証明書の検証を無効にできます。

あなたがしようとしていることで直面する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モデルを大幅に壊すことになります(詳細)。

    CN=Dummy CAなどの発行者DNに同意する場合(たとえば)。だれでも、サブジェクトDN(および発行者DN)としてCN=Dummy CAを使用して、場合によっては異なるキーを使用して、自己署名証明書を作成できます。 SSLCADNRequestFileディレクティブは、リストを作成するための証明書を使用して構成する必要がありますが、これらはクライアント証明書の検証にはまったく使用されません。これは、複雑な方法です(ただし、他のディレクティブのコンテキストでは自然です)。 certificate_authoritiesリストの構成。サービスとして、これらの名前の自己署名証明書をSSLCADNRequestFileに配置すると、CertificateRequest TLSメッセージはCN=Dummy CAリストのcertificate_authoritiesを使用するようになります(これらは単なる名前であり、この段階では証明書ではありません)。その後、クライアントは、発行者DN CN=Dummy CAを使用して独自の証明書を取得できます。署名がその証明書(同じキー)で検証できるかどうかにかかわらず、いずれの手順でも署名の検証は行われません。

ただし、SSLVerifyCLient optional_no_caでは実際の証明書の検証は行われないことに注意してください(手動検証が、構成したPKIのフォールバックソリューションにすぎない場合は、SSL_CLIENT_VERIFY変数を確認できます)。その段階でわかるのは、クライアントが提示した公開鍵証明書の秘密鍵を持っていることです(TLS CertificateVerifyメッセージによって保証されています)。必要に応じて、何らかの形式の検証を実行する必要があります。ある種の認証があるはずです。 (証明書の内容、つまり、公開鍵とそれに含まれる名前/属性との間のバインディングは信頼できません。)

これはファイルに対してはうまく機能しませんが、アプリケーション(たとえば、PHP/CGI/...)でこれを行うことができますJavaプロキシに証明書を渡す場合Javaサーバー)。1つの基本的な方法は、公開鍵の既知のリストを用意することです。または、アイデアを FOAF + SSL/WebID で確認できます。

10
Bruno

requireの代わりに)SSLVerifyCLient optional_no_caを使用すると、Apacheは発行CAをチェックしません(したがって、CA証明書ファイルまたはパスは必要ありません)。クライアント/ユーザーが証明書を送信できないようにするため、証明書がまったく使用されていないことの確認は、個別に行う必要があります。

(どうやら、私はmod_sslのドキュメントを完全に読めなかったようです。)

2
Isaac