[解決済み] ASP.NETが証明書ストアにある証明書の秘密鍵にアクセスできるようにするにはどうしたらいいですか?
質問
私は、証明書ストアにある証明書の秘密鍵にアクセスする 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";
}
}
どのように解決するのですか?
- 証明書を作成/購入する。秘密鍵があることを確認します。
- 証明書を "ローカル コンピュータ" アカウントにインポートします。証明書 MMC を使用するのが最善です。 秘密鍵のエクスポートを許可する(Allow private key to be exported")」にチェックが入っていることを確認してください。
-
に基づいて、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" の証明書の完全信頼に追加しました。
-
IIS 7.5 ウェブサイトは ApplicationPoolIdentity の下で実行されています。MMC を開く => [証明書(ローカル コンピュータ)]スナップインを追加 => [証明書(ローカル コンピュータ)]=> [個人]=> [証明書]=> 対象の証明書を右クリック => すべてのタスク => [秘密鍵の管理]=> 追加
Phil Hale 氏のコメントに基づいて更新しました。
ドメイン上にいる場合、'from location box' でドメインがデフォルトで選択されることに注意してください。これを必ず "ローカル コンピュータ" に変更してください。アプリ プールの ID を表示するには、場所を "ローカル コンピュータに変更します。
関連
-
ASP.NET Core ディペンデンシーインジェクションの詳細
-
.NET 6における暗黙の名前空間参照
-
[解決済み] OpenSSLを使用して自己署名入りSSL証明書を生成する方法を教えてください。
-
[解決済み] C#では、public、private、protected、アクセス修飾子がないことの違いは何ですか?
-
[解決済み] IISのAppPoolIdentityとファイルシステムの書き込みアクセス権
-
[解決済み】開発環境と本番環境で異なるWeb.configを使用する。
-
[解決済み] ASP.NETの新しいセキュリティ脆弱性の深刻度と回避方法について教えてください。
-
[解決済み] Server.UrlEncode vs. HttpUtility.UrlEncode
-
[解決済み] ASP.NET Web API - PUT & DELETE 動詞が許可されない - IIS 8
-
[解決済み] ASP.NET Web APIでのユーザー認証
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
認証プロセスの記録にjwtを使用したネット
-
.NET 6における暗黙の名前空間参照
-
[解決済み] System.Data.Entity.Internal.AppConfig' の型イニシャライザーで例外が発生しました。
-
[解決済み] リクエストは中断されました。SSL/TLSセキュアチャネルを作成できませんでした
-
[解決済み] IIS7 の「クラシック」パイプラインモードと「統合」パイプラインモードの違いは何ですか?
-
[解決済み] ASP.NET MVCのAjaxポストでantiforgerytokenを含める。
-
[解決済み] inheritInChildApplicationsを使用して子Webアプリケーションでweb.configの継承を回避する。
-
[解決済み] ASP.NET Web APIでのユーザー認証
-
[解決済み] HTTPハンドラ vs HTTPモジュール
-
[解決済み] FormsAuthentication.SignOut()がユーザーをログアウトしない