![](https://habrastorage.org/getpro/habr/post_images/e74/174/f44/e74174f448bcfd2a5d679ec5a75bd170.png)
こんにちは、%username%!
以前、楕円曲線を使用した証明書の生成について説明しました。
今日は、従来のRSAクライアント証明書を使用してIIS認証を簡単に構成し、サーバーとクライアントの証明書を生成する方法について説明します。 そして、いつものように、OpenSSLはこれを助けてくれます。
すべてが機能するためには、少なくとも3つの証明書が必要です。
- ルート証明書(認証局またはCA)。 残りすべてに署名します。
- ドメイン(サーバー)証明書。 IISはクライアントをチェックします。 逆に、クライアントはサーバーを認証できます。
- 顧客証明書
![画像](https://habrastorage.org/getpro/habr/post_images/b35/581/5d8/b355815d825cceaf4b38c06b1f62325e.png)
作業には、 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
- -newは、新しいリクエストを作成することを意味します
- すぐに自己署名証明書が必要な-x509
- -newkey rsa:2048 2048ビットの長さのキーをすぐに生成しましょう。 ちなみに、rsa:<ビット数>の代わりに、 dsa :<パラメータ付きファイル>またはec :<パラメータ付きファイル>を指定できます
- -days 1000-証明書は1000日後に期限切れになります
- -outおよび-keyoutは、証明書とその秘密キーを保存する場所を示します
一連の簡単な質問の後、 ca.crt証明書とca.key秘密キーがiisフォルダーに表示されます
次に、IISがルートによって署名されたすべての証明書を認識するために、コンピューターの信頼できる認証局ストアにルート証明書をインストールする必要があります。
- MMCを開始します
- 証明書スナップインを追加し、 コンピューターアカウントの証明書を管理することを示します 。そうしないと、何も開始されません。
- 「信頼されたルート証明機関」を開き、CAをそこにインポートします。
![画像](https://habrastorage.org/getpro/habr/post_images/3f9/72d/83b/3f972d83bfb134a371242b8900f60c7d.png)
できた! サーバーでの作業を開始できます。
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バインディングを作成し、リストからサーバー証明書を選択する必要があります。
![画像](https://habrastorage.org/getpro/habr/post_images/3e4/ea5/817/3e4ea58173a039d9fd1a54d0a4e3e8b5.png)
その後、次のようにノードのSSL設定でオプションを設定する必要があります。
![画像](https://habrastorage.org/getpro/habr/post_images/873/39c/271/87339c271faae3d32bcfbf718a0a6b9d.png)
できた! クライアントが残っています。 ただし、この段階でも、すでに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 /にアクセスして内容を表示できるようになります 。
他のデータを使用して別の証明書を生成し、インポートすることもできます。 次に、サーバーに入ると、いずれかを選択するように求められます。
![画像](https://habrastorage.org/getpro/habr/post_images/b6a/403/b0a/b6a403b0a1365a8db91f9df5bd81f3e4.png)
それだけです)
最後に、ページの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 >