web-dev-qa-db-ja.com

証明書ストアの証明書の秘密キーへのASP.NETアクセスを許可する方法は?

証明書ストアの証明書の秘密キーにアクセスするASP.NETアプリケーションがあります。 Windows Server 2003では、winhttpcertcfg.exeを使用して、NETWORK SERVICEアカウントへのプライベートキーアクセスを与えることができました。 IIS 7.5 WebサイトのWindows Server 2008 R2の証明書ストア(ローカルコンピューター\個人)の証明書にある秘密キーにアクセスするためのアクセス許可を与えるにはどうすればよいですか?

「Everyone」、「IIS AppPool\DefaultAppPool」、「IIS_IUSRS」、および証明書MMC(Server 2008 R2)を使用して見つけることができる他のすべてのセキュリティアカウントへの完全信頼アクセスを許可しようとしました。ただし、以下のコードは、コードがプライベートキーでインポートされた証明書のプライベートキーにアクセスできないことを示しています。代わりに、コードは秘密キープロパティにアクセスするたびにスローおよびエラーを発生させます。

Default.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>

Default.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";
    }
}
103
thames
  1. 証明書を作成/購入します。秘密鍵があることを確認してください。
  2. 証明書を「ローカルコンピューター」アカウントにインポートします。証明書MMCを使用するのが最適です。 「秘密キーのエクスポートを許可する」を必ず確認してください
  3. これに基づいて、IIS 7.5アプリケーションプールのIDは次のいずれかを使用します。

    • IIS 7.5 WebサイトはApplicationPoolIdentityで実行されています。 MMC =>証明書の追加(ローカルコンピューター)スナップイン=>証明書(ローカルコンピューター)=>個人=>証明書=>目的の証明書を右クリック=>すべてのタスク=>秘密キーの管理= > IIS AppPool\AppPoolNameを追加して、Full controlを付与します。 「AppPoolName」をアプリケーションプールの名前(場合によってはIIS_IUSRS)に置き換えます
    • IIS 7.5 Webサイトは、NETWORK SERVICEで実行されています。証明書MMCを使用して、「ローカルコンピューター\個人」の証明書の完全信頼に「ネットワークサービス」を追加しました。
    • IIS 7.5 Webサイトは、「MyIISUser」ローカルコンピューターユーザーアカウントで実行されています。証明書MMCを使用して、「MyIISUser」(新しいローカルコンピューターユーザーアカウント)を「Local Computer\Personal」の証明書の完全信頼に追加しました。

@Phil Haleコメントに基づく更新:

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

182
thames

MMC、証明書、証明書の選択、右クリック、すべてのタスク、「秘密鍵の管理」を介した許可の付与に関する注意

秘密鍵の管理は、個人用のメニューリストにのみあります。

これを回避する方法を見つけました。証明書を[個人]にドラッグアンドドロップし、[秘密キーの管理]を実行してアクセス許可を付与します。オブジェクトタイプのビルトインを使用し、ドメインではなくローカルマシンを使用するように設定することを忘れないでください。 DefaultAppPoolユーザーに権限を付与し、そのままにしました。

完了したら、証明書を元の場所にドラッグアンドドロップします。プレスト。

41
Garrett Goebel

IISの.pfxファイルから証明書をロードしようとする場合、ソリューションはApplication Poolに対してこのオプションを有効にするのと同じくらい簡単です。

アプリプールを右クリックし、Advanced Settingsを選択します。

次に、Load User Profileを有効にします


enter image description here

11
Simon_Weaver

私は誰かが尋ねた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
7
Ian Robertson

私にとっては、「秘密鍵のエクスポートを許可する」にチェックマークを付けて証明書を再インポートするだけでした。

必要だと思いますが、この証明書にアクセスするサードパーティのアプリなので、緊張します。

6
Nathan Hartley

答えを補完する これはガイドです 証明書の秘密鍵を見つけて権限を追加します。

これは、証明書の秘密キーを見つけるためのガイドにある FindPrivateKey.exe を取得するためのガイドです。

0
Juan Lozoya