web-dev-qa-db-ja.com

Make IIS最初のハンドシェイク中にSSLクライアント証明書を要求する

IIS WebサイトをSSLクライアント証明書を要求するように構成しようとしています。WebサイトはIIS 6と7の両方でセットアップされていますが、もっと興味があります7で機能するようにします。requireclientcertificatesプロパティをIISに設定し、Webブラウザーからサイトにアクセスすると正常に機能しますが、Javaベースのクライアントでアクセスに問題があります。

問題は、IISが最初のSSLハンドシェイク中にクライアント証明書を要求しないことだと思います。代わりに、通常のSSL接続をネゴシエートし、リソースにクライアント証明書が必要かどうかを確認します。次に、クライアント証明書を要求する新しいSSLハンドシェイクを開始します。IISこれにより、特定のリソースのクライアント証明書のみを必要とするサイトがサポートされます。Webサイト全体に要件が指定されている場合でも、= IISはまだ2つのSSLハンドシェイクを開始します。最初のSSLハンドシェイクでクライアント証明書を要求するようにIISを強制したいので、クライアントのためにうまくいくことを願っています。 (クライアントは外部パートナーによって開発されており、そのセットアップ方法やソースコードへのアクセスについては事実上知りません)

誰かが以前にIISでこの問題に対処したことがありますか?

20
nslowes

このメタベース設定を見つけるのに少し時間がかかりました。新しいcerticomライブラリを使用しているクライアントでも同じ問題が発生していました。 SSL再ネゴシエーションを取り巻くMITM攻撃が発見されて以来、多くのサークルでの答えは、再ネゴシエーション要求でハングアップすることでした。

\ inetpub\adminscriptsから次のcmdを実行すると、IISは常にクライアント証明書を要求します。

IIS 6:cscript adsutil.vbs set\w3svc\siteID\SSLAlwaysNegoClientCert True

(したがって、デフォルトのWebサイトの場合、cscriptadsutil.vbsは\ w3svc\1\SSLAlwaysNegoClientCert Trueを設定します)

一部のクライアントInternet Explorerクライアント証明書が必要かどうかに関係なく、パケットを受信するとクライアント証明書の入力を求められることに注意してください。

IIS 7の場合:

次のテキストを「Enable_SSL_Renegotiate_Workaround.js」というファイルに保存します

var vdirObj=GetObject("IIS://localhost/W3svc/1"); 
// replace 1 on this line with the number of the web site you wish to configure 

WScript.Echo("Value of SSLAlwaysNegoClientCert Before: " + vdirObj.SSLAlwaysNegoClientCert); 
vdirObj.Put("SSLAlwaysNegoClientCert", true); 
vdirObj.SetInfo(); 
WScript.Echo("Value of SSLAlwaysNegoClientCert After: " + vdirObj.SSLAlwaysNegoClientCert);

管理者特権/管理者コマンドプロンプトから次のコマンドを実行します。

cscript.exe enable_ssl_renegotiate_workaround.js

(977377のKB記事からジャック)

7
Wayne Weeks

これが私がこれを行った方法です、IIS 7.5:

  1. 管理コマンドプロンプトで次を実行します:netsh http show sslcert
  2. 出力をテキストファイルに保存します。次のようになります。

    IP:port                 : 0.0.0.0:443
    Certificate Hash        : [a hash value]
    Application ID          : {[a GUID]}
    Certificate Store Name  : MY
    Verify Client Certificate Revocation    : Enabled
    Verify Revocation Using Cached Client Certificate Only    : Disabled
    Usage Check    : Enabled
    Revocation Freshness Time : 0
    URL Retrieval Timeout   : 0
    Ctl Identifier          : (null)
    Ctl Store Name          : (null)
    DS Mapper Usage    : Disabled
    Negotiate Client Certificate    : Disabled
    
  3. その情報を使用してバッチファイルを作成します。

    netsh http show sslcert
    netsh http delete sslcert ipport=0.0.0.0:443
    netsh http add sslcert ipport=0.0.0.0:443 certhash=[your cert hash from above] appid={[your GUID from above]} certstorename=MY verifyclientcertrevocation=enable VerifyRevocationWithCachedClientCertOnly=disable UsageCheck=Enable clientcertnegotiation=enable
    netsh http show sslcert
    

    (はい、削除して再追加する必要があります。clientcertnegotiationをインプレースで変更することはできません。そのため、ハッシュとGUIDを保存して、何を再追加するかがわかるようにすることが重要です。)

  4. そのバッチファイルを実行し、エラーがないか確認します。

この設定が適用されることに注意してください証明書ごと、サーバーごとではありません。したがって、複数の証明書を使用する場合、または証明書を変更/更新する場合は、これを再度行う必要があります。

11
CrazyPyro