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


9

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


認証された証明書の追跡をどのように計画しますか?
シェーンマッデン

@ShaneMadden:証明書を内部ユーザーIDにマッピングするテーブルのようなもの。公開鍵暗号の仕組みは、パスワード交換の代わりになります。
アイザック

2
正しい-私が得ているのは、Apacheが証明書を内部ユーザーIDにマッピングするテーブルを実行しないことです。ユーザーにクライアント証明書による認証を行わせる場合は、署名したユーザーに証明書を与えてみませんか?あなたが述べたように、まさにそれを行うOpenIDプロバイダーがあります。Apache mod_sslは、証明書の署名関係に基づいてユーザーを認証するように設計されています。何らかの理由でそれを無視したい場合は、証明書とユーザーのマッピングも処理する独自のコードに証明書認証を実装する必要があります。
シェーン・マッデン

@ShaneMadden:証明書の発行を避けたいと考えていました。発行した証明書のみを受け入れる場合は、スマートカードベースの証明書は発行されません。私が何をしても、システムの一部はアプリケーションレベルで実行されますが、そこにはすべてのmod_ssl機構があるので、それが私のためにいくつかの作業を処理できることを望んでいました。
アイザック

1
@ShaneMadden利点の1つoptional_no_caは、証明書に問題がある場合はHTTPエラーメッセージを表示できるため、UIの方が優れている可能性があります(不正なクライアント証明書がHTTPレイヤーの前に接続を停止するため、それ以外の場合はできません) )。また、証明書を検証する別の方法(WebIDなど)を試したい場合にも役立ちます。しかし、検証を行うために何かをしたいのは当然のことです。これは、要求がコード(たとえば、PHP / CGI / Java内)で処理され、ファイルでは処理されない場合にのみ機能します。
ブルーノ

回答:


10

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

あなたがしようとしていることで直面する2番目の問題は、クライアントに証明書を送信させることです。証明書はPKI内にあることを意図していないため、自己署名され、さまざまな発行者が存在する可能性があります。

クライアント証明書を要求すると、サーバーはハンドシェイク中にクライアントにCertificateRequestTLSメッセージを送信します。このメッセージには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 CACN=Dummy CAサブジェクトDN(および発行者DN)として、おそらく異なるキーを使用して、誰でも自己署名証明書を作成できます。けれどもSSLCADNRequestFileディレクティブは、リストを構築するための証明書を使用して構成されることを想定し、これらは、それだけで設定の複雑な(しかし、他のディレクティブのコンテキストで自然な)方法です、すべてのクライアント証明書を検証するために使用されていないcertificate_authoritiesリストを。あなたは、サービスとして、これらの名前の自己署名証明書を置く場合はSSLCADNRequestFile、これが行いますCertificateRequestTLSメッセージの使用CN=Dummy CAcertificate_authoritiesリスト(これらは単なる名称で、この段階では本命ではありません)。その後、クライアントは発行者DNを使用して独自の証明書を取得できますCN=Dummy CAいずれにしてもこれらの手順には署名の検証が含まれていないため、署名がその証明書(同じキー)で検証できるかどうか。

このビーイングはしていることを覚えて、言ったSSLVerifyCLient optional_no_ca本当の証明書の検証が行われていない、(私はあなたがチェックできると仮定しSSL_CLIENT_VERIFY、あなたのマニュアル検証がとにかく設定したPKIにちょうど代替ソリューションの場合は、変数を)。その段階でわかることは、クライアントが提示した公開鍵証明書の秘密鍵を持っていることです(TLS CertificateVerifyメッセージによって保証されます)。いくつかの認証が必要な場合は、何らかの形式の検証を実行する必要があります。ソート。(証明書の内容、つまり、公開鍵とそれに含まれる名前/属性との間のバインディングは信頼できません。)

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


2

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

(どうやら、私はmod_sslドキュメントを完全に読み損なっただけです。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.