OpenSSLを使用してIISでクライアント証明書認証を構成する


こんにちは、%username%!
以前、楕円曲線を使用した証明書の生成について説明しました。
今日は、従来のRSAクライアント証明書を使用してIIS認証を簡単に構成し、サーバーとクライアントの証明書を生成する方法について説明します。 そして、いつものように、OpenSSLはこれを助けてくれます。
すべてが機能するためには、少なくとも3つの証明書が必要です。
  1. ルート証明書(認証局またはCA)。 残りすべてに署名します。
  2. ドメイン(サーバー)証明書。 IISはクライアントをチェックします。 逆に、クライアントはサーバーを認証できます。
  3. 顧客証明書

画像


作業には、 c:\ iisなどの別のフォルダーが必要です。 その中で、 シリアル拡張子なしでファイルを作成し、そこに01を書き込む必要があります。同様に、 そこに空のindex.txtファイルを作成する必要があります。 構成によっては、OpenSSLからこのフォルダー内にさらにいくつか作成するように求められる場合があります。 私の場合、それはnewcertsフォルダーでした。 また、OpenSSL.cfgで、 [CA_default]の dirをc:/ iisに変更する必要があります

1)ルート自己署名証明書を作成します。
openssl req -new -x509 -newkey rsa:2048 -days 1000 -out c:\iis\ca.crt -keyout c:\iis\ca.key

一連の簡単な質問の後、 ca.crt証明書とca.key秘密キーがiisフォルダーに表示されます

次に、IISがルートによって署名されたすべての証明書を認識するために、コンピューターの信頼できる認証局ストアにルート証明書インストールする必要があります。
  1. MMCを開始します
  2. 証明書スナップインを追加し、 コンピューターアカウントの証明書を管理することを示します 。そうしないと、何も開始されません。
  3. 「信頼されたルート証明機関」を開き、CAをそこにインポートします。

画像

できた! サーバーでの作業を開始できます。

2)IIS管理コンソールで[サーバー証明書]に移動し、右ボタンでメニューを開き、[ 新しい証明書要求を作成 ]をクリックします 。 c:\ iisにserver.csrとして保存します

ルート証明書を使用してサーバー証明書リクエストに署名します。
openssl ca -days 1000 -policy policy_anything -keyfile c:\iis\ca.key -cert c:\iis\ca.crt -in c:\iis\server.csr -out c:\iis\server.cer
-policy policy_anythingは、証明書にすべての可能なアプリケーションポリシーが提供されることを意味します。 最も簡単なオプション。 残りのパラメーターについては、説明の必要はないと思います。 主なことは、どのファイルを指定するか混乱しないことです。
その後、 server.cerサーバー証明書がc:\ iisに表示されます。これはIISにインストールする必要があります。
これを行うには、再び「サーバー証明書」に進み、「証明書のインストール要求」を選択して、c:\ iis \ server.cerを指定します。
それだけです、サーバーには証明書があります。
次に、ノードのバインディングに新しいhttpsバインディングを作成し、リストからサーバー証明書を選択する必要があります。
画像

その後、次のようにノードのSSL設定でオプションを設定する必要があります。 画像

できた! クライアントが残っています。 ただし、この段階でも、すでにhttps:// localhost /にアクセスして、証明書がないと許可されないことがわかります。

3)クライアント証明書のリクエストを生成します
openssl req -new -newkey rsa:2048 -days 1000 -keyout c:\iis\client.key -out c:\iis\client.csr
ここでは-x509を指定しなかったため、通常の証明書リクエストとクライアントの秘密キーを受け取りました。

リクエストに署名します。
openssl ca -days 1000 -policy policy_anything -keyfile c:\iis\ca.key -cert c:\iis\ca.crt -in c:\iis\client.csr -out c:\iis\client.crt
ここでもすべてが明らかです。その結果、 client.crtクライアント証明書を取得します。

ここで、キーとともにクライアント証明書をWindows証明書ストアにインポートするには、crt +キーを.pfxコンテナーに変換する必要があります。
openssl pkcs12 -export -inkey c:\iis\client.key -in c:\iis\client.crt -out c:\iis\client.pfx
やった! client.pfxを取得しました 。これをダブルクリックすると、証明書インポートダイアログを呼び出して、実際に個人ストアで発生したことをインストールできます。

すべてが正しく完了したら、証明書を個人用ストレージにインポートした後、 https:// localhost /にアクセスして内容を表示できるようになります

他のデータを使用して別の証明書を生成し、インポートすることもできます。 次に、サーバーに入ると、いずれかを選択するように求められます。 画像

それだけです)
最後に、ページのaspxコード(Default.aspxとして保存)を使用すると、すべてを確認できます。クライアント証明書に関する情報が表示されます。
<%@ Page Language="C#"%>
<%@ Import Namespace="System.Security.Cryptography" %>
< script runat ="server" >
private void Page_Load( object sender, System.EventArgs e)
{
Response.Write( "<table width=50% cellspacing=1><tr> <th colspan=2>Current ClientCertificate Settings</th></tr>" );

Response.Write( "<tr><td>Subject</td><td>" +Request.ClientCertificate.Subject+ "</td></tr>" );
Response.Write( "<tr><td>SHA1 Fingerprint</td><td>" +GetCertificateFingerPrint()+ "</td></tr>" );
Response.Write( "<tr><td>Valid from</td><td>" +Request.ClientCertificate.ValidFrom+ "</td></tr>" );
Response.Write( "<tr><td>Valid Until</td><td>" +Request.ClientCertificate.ValidUntil+ "</td></tr>" );
Response.Write( "<tr><td>Issuer</td><td>" +Request.ClientCertificate.Issuer+ "</td></tr></table>" );
}
private String GetCertificateFingerPrint()
{
if (Request.ClientCertificate.IsPresent)
{
byte [] raw = Request.ClientCertificate.Certificate;
SHA1 sha1 = new SHA1CryptoServiceProvider();
byte [] hash = sha1.ComputeHash(raw);
StringBuilder res = new StringBuilder();
for ( int i = 0; i < hash.Length; i++)
{
res.Append(hash[i].ToString( "X2" ));
}
return res.ToString();
}
return "" ;
}
</ script >



楽しんでください!

Source: https://habr.com/ru/post/J96827/


All Articles