1. ホーム
  2. asp.net

[解決済み] ASP.NETが証明書ストアにある証明書の秘密鍵にアクセスできるようにするにはどうしたらいいですか?

2022-08-08 17:25:14

質問

私は、証明書ストアにある証明書の秘密鍵にアクセスする ASP.NET アプリケーションを持っています。Windows Server 2003 で、私は winhttpcertcfg.exe を使用して、NETWORK SERVICE アカウントに秘密鍵へのアクセス権を与えることができました。IIS 7.5 ウェブサイトで、Windows Server 2008 R2の証明書ストア(Local ComputerPersonal)にある証明書の秘密鍵にアクセスする許可をどのように与えればよいですか?

私は、証明書 MMC (Server 2008 R2) を使用して見つけた "Everyone", "IIS AppPoolDefaultAppPool", "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. 証明書を作成/購入する。秘密鍵があることを確認します。
  2. 証明書を "ローカル コンピュータ" アカウントにインポートします。証明書 MMC を使用するのが最善です。 秘密鍵のエクスポートを許可する(Allow private key to be exported")」にチェックが入っていることを確認してください。
  3. に基づいて、IIS 7.5 Application PoolのIDは、次のいずれかを使用します。

    • IIS 7.5 ウェブサイトは ApplicationPoolIdentity の下で実行されています。MMC を開く => [証明書(ローカル コンピュータ)]スナップインを追加 => [証明書(ローカル コンピュータ)]=> [個人]=> [証明書]=> 対象の証明書を右クリック => すべてのタスク => [秘密鍵の管理]=> 追加 IIS AppPool\AppPoolName を追加し、それを Full control . "を置き換えます。 AppPoolName をアプリケーション プールの名前に置き換えます (場合によっては IIS_IUSRS )
    • IIS 7.5 Web サイトは NETWORK SERVICE の下で実行されています。証明書 MMC を使用して、quot;Local ComputerPersonal の証明書の完全信頼に "NETWORK SERVICE" を追加しました。
    • IIS 7.5 Web サイトが "MyIISUser" ローカル コンピューターのユーザー アカウントで実行されています。証明書 MMC を使用して、"MyIISUser; (新しいローカル コンピューターのユーザー アカウント) を "Local ComputerPersonal" の証明書の完全信頼に追加しました。

Phil Hale 氏のコメントに基づいて更新しました。

ドメイン上にいる場合、'from location box' でドメインがデフォルトで選択されることに注意してください。これを必ず "ローカル コンピュータ" に変更してください。アプリ プールの ID を表示するには、場所を "ローカル コンピュータに変更します。