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

作業には、
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をそこにインポートします。
できた! サーバーでの作業を開始できます。
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 >
楽しんでください!