web-dev-qa-db-ja.com

asp.netのX509証明書を介したクライアント認証

Asp.netアプリケーションがあり、X509証明書を使用してユーザーを認証する必要があります。つまり、ユーザーは、自分が発行した証明書をインストールして、自分のWebサイトを閲覧し、この証明書によってどのユーザーかを識別できるようにする必要があります。

IISでSSLを既に構成しましたが、今探しているものではなく、どこから始めればよいかわかりません。

Asp.net c#でこれをどのように達成できますか?

24
enb081

安全な認証メカニズムを作成するには、クライアント証明書とユーザー名/パスワードの両方を使用します。その理由は、証明書は盗まれた(コピーされた)ものですが、パスワードはその人だけが知っているものだからです。別の方法として、PINで保護されたスマートカード上の証明書があります。

ASP.NETアプリケーションでクライアント証明書を使用するには、次を実行する必要があります。

ステップ1: In IIS Manager、アプリケーションまたはWebサイトを開き、SSL設定を選択し、SSLが必要とクライアント証明書が必要の両方を選択します。

これで、ユーザーがWebサイトを開くと、ブラウザーは通信で使用されるクライアント証明書を選択するように求めます。

重要この時点で、信頼できる人によって証明書が発行されていることを確認する必要があります(誰でも独自の自己署名証明書を作成できるため)。

ステップ2:構成アイテム(web.config、データベースなど)を追加します。このリストでは、クライアント証明書のCA(証明機関)チェーン全体のthumb印を追加します。

<add key="ClientCertificateIssuerThumbprints" value="4901f5b87d736cd88792bd5ef7caee91bf7d1a2b,0113e31aa85d7fb02740a1257f8bfa534fb8549e,c9321de6b5a82666cf6971a18a56f2d3a8675602"/>

ステップ3:クラシックなユーザー名/パスワードのログインページを作成します。ユーザー名/パスワードを確認してください。

ステップ4:ログインページに次のコードを追加します。

var x509 = new X509Certificate2(this.Request.ClientCertificate.Certificate);
var chain = new X509Chain(true);
chain.ChainPolicy.RevocationMode = X509RevocationMode.Offline;
chain.Build(x509);

var validThumbprints = new HashSet<string>(
    System.Configuration.ConfigurationManager.AppSettings["ClientCertificateIssuerThumbprints"]
        .Replace(" ", "").Split(',', ';'),
    StringComparer.OrdinalIgnoreCase);

// if the certificate is self-signed, verify itself.
for (int i = chain.ChainElements.Count > 1 ? 1 : 0; i < chain.ChainElements.Count; i++)
{
    if (!validThumbprints.Contains(chain.ChainElements[i].Certificate.Thumbprint))
        throw new UnauthorizedAccessException("The client certificate selected is not authorized for this system. Please restart the browser and pick the certificate issued by XXXXX");
}

// certificate Subject would contain some identifier of the user (an ID number, SIN number or anything else unique). here it is assumed that it contains the login name and nothing else
if (!string.Equals("CN=" + login, x509.Subject, StringComparison.OrdinalIgnoreCase))
    throw new UnauthorizedAccessException("The client certificate selected is authorized for another user. Please restart the browser and pick another certificate.");

パスワードと証明書の両方がチェックされた場合にのみ、ユーザーはシステムで許可されます。

23
Knaģis

IIS 7.0以上がある場合、クライアント証明書マッピング認証を構成できます。

Active Directoryを使用 (非常に簡単で、マッピング作業はADサーバーに任せます)

<location path="Default Web Site">
   <system.webServer>
      <security>
         <access sslFlags="Ssl, SslNegotiateCert" />
          <authentication>
            <windowsAuthentication enabled="false" />
            <anonymousAuthentication enabled="false" />
            <digestAuthentication enabled="false" />
            <basicAuthentication enabled="false" />
            <clientCertificateMappingAuthentication enabled="true" />
         </authentication>
     </security>
   </system.webServer>
</location>

または IISを使用 (IISでさらに構成が必要で、クライアント証明書にアクセスする必要がありますが、スタンドアロンで動作し、ADへの往復はありません)。この場合、(1つ以上の)ユーザー資格情報を指定し、

  • 各ユーザーを証明書の公開キーに、資格情報を指定したユーザーにマップします。または
  • 証明書のフィールドの値に基づいて、複数の証明書をユーザーにマップします

構成(1対多):

<location path="Default Web Site">
   <system.webServer>
      <security>
         <authentication>
            <windowsAuthentication enabled="false" />
            <anonymousAuthentication enabled="false" />
            <digestAuthentication enabled="false" />
            <basicAuthentication enabled="false" />
            <iisClientCertificateMappingAuthentication enabled="true"
                  manyToOneCertificateMappingsEnabled="true">
               <manyToOneMappings>
                  <add name="Contoso Employees"
                        enabled="true"
                        permissionMode="Allow"
                        userName="Username"
                        password="[enc:AesProvider:57686f6120447564652c2049495320526f636b73:enc]">
                     <rules>
                        <add certificateField="Subject"
                           certificateSubField="O"
                           matchCriteria="Contoso"
                           compareCaseSensitive="true" />
                     </rules>
                  </add>
               </manyToOneMappings>
            </iisClientCertificateMappingAuthentication>
         </authentication>
         <access sslFlags="Ssl, SslNegotiateCert" />
      </security>
   </system.webServer>
</location>

(iis.netのドキュメントページのサンプルからかなり恥ずかしくコピーされたサンプル構成は非常に複雑です。)

または、クライアント証明書に基づいてクライアントを認証するセキュリティトークンサービス(STS)で クレームベース認証を使用 にアプリケーションを構成できます。 ADFS 2.0はこの役割をフルフィルメントできますが、使用できない場合は、 Thinktecture Identity Server を確認できます。

10
flup