代码之家  ›  专栏  ›  技术社区  ›  thames

如何授予ASP.NET对证书存储中证书中私钥的访问权限?

  •  95
  • thames  · 技术社区  · 14 年前

    我有一个ASP.NET应用程序可以访问证书存储区中证书中的私钥。在WindowsServer2003上,我可以使用winhttpcertcfg.exe为网络服务帐户授予私钥访问权限。如何授予访问IIS 7.5网站中Windows Server 2008 R2的证书存储(本地计算机\个人)中证书中的私钥的权限?

    我尝试使用证书mmc(Server 2008 R2)向“所有人”、“IIS应用程序池\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";
        }
    }

    5 回复  |  直到 7 年前
        1
  •  164
  •   thames    7 年前
    1. 创建/购买证书。确保它有一个私钥。
    2. 将证书导入“本地计算机”帐户。最好使用证书MMC。 确保选中“允许导出私钥”
    3. 基于此,IIS 7.5应用程序池的标识使用以下其中之一。

      • IIS 7.5网站正在applicationPoolIdentity下运行。打开mmc=>添加证书(本地计算机)管理单元=>证书(本地计算机)=>个人=>证书=>右键单击感兴趣的证书=>所有任务=>管理私钥=>添加 IIS AppPool\AppPoolName 并授予它 Full control . 替换“ 应用程序池名称 “使用应用程序池的名称(有时 IIS_IUSRS )
      • IIS 7.5网站正在网络服务下运行。使用证书MMC,添加“网络服务”以完全信任“本地计算机\个人”中的证书。
      • IIS 7.5网站正在“myiSuser”本地计算机用户帐户下运行。使用证书mmc,添加“myiisuser”(一个新的本地计算机用户帐户)以完全信任“本地计算机\个人”中的证书。

    更新基于@phil hale comment:

    当心,如果你在一个域上,你的域将在“从位置”框中默认选择。确保将其更改为“本地计算机”。将位置更改为“本地计算机”以查看应用程序池标识。

        2
  •  39
  •   Garrett Goebel    12 年前

    有关通过MMC、证书授予权限的说明,选择证书,右键单击,所有任务,“管理私钥”

    “管理私钥”仅在“个人”菜单列表中…所以,如果你把你的证书交给信任的人等,你就走运了。

    我们找到了解决这个问题的方法。将证书拖放到“个人”,执行“管理私钥”操作以授予权限。记住要设置为使用对象类型内置项,并使用本地计算机而不是域。我们授予了DefaultAppPool用户权限,并将其保留在那里。

    完成后,将证书拖放回原来的位置。急板地。

        3
  •  10
  •   Simon_Weaver    7 年前

    如果您试图从IIS中的.pfx文件加载证书,解决方案可能与为 Application Pool .

    右键单击应用程序池并选择 Advanced Settings

    然后启用 Load User Profile


    enter image description here

        4
  •  7
  •   Ian Robertson    7 年前

    我在PowerShell中找到了解决方法,有人问我:

    $keyname=(((gci cert:\LocalMachine\my | ? {$_.thumbprint -like $thumbprint}).PrivateKey).CspKeyContainerInfo).UniqueKeyContainerName
    $keypath = $env:ProgramData + “\Microsoft\Crypto\RSA\MachineKeys\”
    $fullpath=$keypath+$keyname
    
    $Acl = Get-Acl $fullpath
    $Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("IIS AppPool\$iisAppPoolName", "Read", "Allow")
    $Acl.SetAccessRule($Ar)
    Set-Acl $fullpath $Acl
    
        5
  •  5
  •   Nathan Hartley    13 年前

    对我来说,这只不过是在选中“允许导出私钥”后重新导入证书。

    我想这是必要的,但它确实让我紧张,因为它是一个访问此证书的第三方应用程序。