証明書ストアの証明書の秘密キーにアクセスする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";
}
}
これに基づいて、IIS 7.5アプリケーションプールのIDは次のいずれかを使用します。
IIS AppPool\AppPoolName
を追加して、Full control
を付与します。 「AppPoolName」をアプリケーションプールの名前(場合によってはIIS_IUSRS
)に置き換えます@Phil Haleコメントに基づく更新:
ドメインにいる場合は、デフォルトで[from locationボックス]でドメインが選択されることに注意してください。必ず「ローカルコンピュータ」に変更してください。場所を「ローカルコンピューター」に変更して、アプリプールIDを表示します。
MMC、証明書、証明書の選択、右クリック、すべてのタスク、「秘密鍵の管理」を介した許可の付与に関する注意
秘密鍵の管理は、個人用のメニューリストにのみあります。
これを回避する方法を見つけました。証明書を[個人]にドラッグアンドドロップし、[秘密キーの管理]を実行してアクセス許可を付与します。オブジェクトタイプのビルトインを使用し、ドメインではなくローカルマシンを使用するように設定することを忘れないでください。 DefaultAppPoolユーザーに権限を付与し、そのままにしました。
完了したら、証明書を元の場所にドラッグアンドドロップします。プレスト。
私は誰かが尋ねた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
私にとっては、「秘密鍵のエクスポートを許可する」にチェックマークを付けて証明書を再インポートするだけでした。
必要だと思いますが、この証明書にアクセスするサードパーティのアプリなので、緊張します。
答えを補完する これはガイドです 証明書の秘密鍵を見つけて権限を追加します。
これは、証明書の秘密キーを見つけるためのガイドにある FindPrivateKey.exe を取得するためのガイドです。