証明書ストア内の証明書の秘密キーにアクセスする ASP.NET アプリケーションがあります。Windows Server 2003 では、winhttpcertcfg.exe を使用して、NETWORK SERVICE アカウントに秘密キーのアクセスを許可できました。IIS 7.5 Web サイトの Windows Server 2008 R2 の証明書ストア (Local Computer\Personal) 内の証明書の秘密キーにアクセスするためのアクセス許可を与えるにはどうすればよいですか?
証明書 MMC (Server 2008 R2) を使用して、「Everyone」、「IIS AppPool\DefaultAppPool」、「IIS_IUSRS」、およびその他すべてのセキュリティ アカウントに完全信頼アクセスを許可しようとしました。ただし、以下のコードは、秘密キーとともにインポートされた証明書の秘密キーにコードがアクセスできないことを示しています。代わりに、コードは秘密キー プロパティにアクセスするたびにエラーをスローします。
デフォルト.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="repeater1" runat="server">
<HeaderTemplate>
<table>
<tr>
<td>
Cert
</td>
<td>
Public Key
</td>
<td>
Private Key
</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%#((X509Certificate2)Container.DataItem).GetNameInfo(X509NameType.SimpleName, false) %>
</td>
<td>
<%#((X509Certificate2)Container.DataItem).HasPublicKeyAccess() %>
</td>
<td>
<%#((X509Certificate2)Container.DataItem).HasPrivateKeyAccess() %>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table></FooterTemplate>
</asp:Repeater>
</div>
</form>
</body>
</html>
デフォルト.aspx.cs
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Web.UI;
public partial class _Default : Page
{
public X509Certificate2Collection Certificates;
protected void Page_Load(object sender, EventArgs e)
{
// Local Computer\Personal
var store = new X509Store(StoreLocation.LocalMachine);
// create and open store for read-only access
store.Open(OpenFlags.ReadOnly);
Certificates = store.Certificates;
repeater1.DataSource = Certificates;
repeater1.DataBind();
}
}
public static class Extensions
{
public static string HasPublicKeyAccess(this X509Certificate2 cert)
{
try
{
AsymmetricAlgorithm algorithm = cert.PublicKey.Key;
}
catch (Exception ex)
{
return "No";
}
return "Yes";
}
public static string HasPrivateKeyAccess(this X509Certificate2 cert)
{
try
{
string algorithm = cert.PrivateKey.KeyExchangeAlgorithm;
}
catch (Exception ex)
{
return "No";
}
return "Yes";
}
}
ベストアンサー1
- 証明書を作成/購入します。秘密鍵があることを確認してください。
- 証明書を「ローカル コンピューター」アカウントにインポートします。証明書 MMC を使用するのが最適です。「秘密鍵のエクスポートを許可する」に必ずチェックを入れてください
これに基づいて、IIS 7.5 アプリケーション プールの ID は次のいずれかを使用します。
- IIS 7.5 Web サイトは ApplicationPoolIdentity で実行されています。MMC を開く => 証明書 (ローカル コンピューター) スナップインの追加 => 証明書 (ローカル コンピューター) => 個人 => 証明書 => 対象の証明書を右クリック => すべてのタスク => 秘密キーの管理 => 追加して
IIS AppPool\AppPoolName
付与しますFull control
。"アプリケーションプール名" アプリケーションプールの名前に置き換えます(場合によってはIIS_IUSRS
) - IIS 7.5 Web サイトは NETWORK SERVICE で実行されています。証明書 MMC を使用して、「Local Computer\Personal」の証明書の完全信頼に「NETWORK SERVICE」を追加しました。
- IIS 7.5 Web サイトは、「MyIISUser」ローカル コンピューター ユーザー アカウントで実行されています。証明書 MMC を使用して、「MyIISUser」(新しいローカル コンピューター ユーザー アカウント) を「Local Computer\Personal」の証明書の完全信頼に追加しました。
- IIS 7.5 Web サイトは ApplicationPoolIdentity で実行されています。MMC を開く => 証明書 (ローカル コンピューター) スナップインの追加 => 証明書 (ローカル コンピューター) => 個人 => 証明書 => 対象の証明書を右クリック => すべてのタスク => 秘密キーの管理 => 追加して
@Phil Hale のコメントに基づく更新:
注意してください。ドメインを使用している場合は、ドメインが [場所] ボックスでデフォルトで選択されます。必ず「ローカル コンピューター」に変更してください。アプリ プール ID を表示するには、場所を「ローカル コンピューター」に変更します。