Web サイトの IIS SSL 証明書を構成する構成ツールがあります。このツールは、IIS 構成に「既定の Web サイト」の新しいバインドを作成し、それに SSL 証明書を割り当てます。このツールは、管理者アカウントに代わって実行すると正常に動作しますが、通常のユーザー アカウントで実行すると「アクセスが拒否されました」というエラーが発生して失敗します。
ツールのコードは次のとおりです。
using Microsoft.Web.Administration;
using System;
using System.Globalization;
using System.Linq;
namespace TestIisSslCert
{
class Program
{
static void Main(string[] args)
{
try
{
var sslCertThumbprint = "733AD4B4A8FA5F7DE2F4640F91B176BDB1D2BE25";
// calculating certificate hash
var certificateHash = new byte[20];
for (int i = 0, j = 0; i < sslCertThumbprint.Length; i += 2, j++)
{
string s = sslCertThumbprint[i].ToString().ToLower() + sslCertThumbprint[i + 1].ToString().ToLower();
byte o = byte.Parse(s, NumberStyles.HexNumber);
certificateHash[j] = o;
}
// adding a binding with a reference to the certificate:
var siteName = "Default Web Site";
using (var serverManager = new ServerManager())
{
var site = serverManager.Sites[siteName];
var bindings = site.Bindings.ToList();
foreach (var binding in bindings)
{
if (binding.Protocol == "https")
site.Bindings.Remove(binding);
}
site.Bindings.Add(":443:", certificateHash, "My");
serverManager.CommitChanges();
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
Console.ReadKey();
}
}
}
ユーザーとして実行したときに表示されるエラーは次のとおりです。
System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
at Microsoft.Web.Administration.Interop.IAppHostMethodInstance.Execute()
at Microsoft.Web.Administration.Binding.AddSslCertificate(Byte[] certificateHash, String certificateStoreName)
at Microsoft.Web.Administration.BindingManager.Save()
at Microsoft.Web.Administration.ServerManager.CommitChanges()
次のフォルダーに対するフルコントロールを追加しました:
- 「C:\Windows\System32\inetsrv\config」
- 「C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys」
- 「C:\inetpub\wwwroot」
次のリンクも試しましたが、役に立ちませんでした。https://support.comodo.com/index.php?/Knowledgebase/Article/View/1129/37/access-denied-exception-from-hresult-0x80070005-e_accessdenied
ユーザーに付与する必要があるその他のセキュリティ設定またはポリシーはありますか?
追加の詳細: ProcessMonitor でアクセス許可を必要とするものがあるかどうかを確認しましたが、「アクセスが拒否されました」というレジストリ キーやファイルは見つかりませんでした。追加したレジストリ キーは 1 つだけでしたが、違いはありませんでした: HKLM\System\CurrentControlSet\Services\WinSock2\Parameters。
また、証明書なしで新しいバインディングを追加することも可能ですが、証明書ハッシュを指定すると失敗します。Microsoft.Web.Administration は COM インターフェイスのラッパーであるため、何らかのポリシーによってコードの実行が許可されていないようですが、これは COM に関連するものと思われますが、よくわかりません。
答え1
同じ操作を netsh で実行してみました:
netsh http add sslcert ipport=0.0.0.0:443 certhash=35e010f567bf61
62e8eb7974ee98eb64c4ed2c55 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
SSL Certificate add failed, Error: 5
The requested operation requires elevation (Run as administrator).
どうやらこれに対する回避策はなく、管理者アカウントを使用する必要があるようです。また、同様の問題が発生しました応答IIS フォーラムで同じ質問がありました。
答え2
私も同じ要件を抱えており、何度も検索した結果、いずれにしても管理者権限が必要であることは明らかでした。
カスタム アカウントを ID として新しいアプリケーション プールを作成することで、この問題を解決しました。
基本的に、私のサーバーには 2 人のユーザーがいました。1 人は管理者で、もう 1 人は同じ管理者グループの user_account です。しかし、user_account は IIS 上のコードを通じてサイトをホストできませんでした。
- IISへ移動
- 次にアプリケーションプールをクリックします
- 新しいアプリケーション プールを追加し、適切な設定を選択して、[OK] を押します。
- 新しく作成されたプールをクリックし、Advance propertyを選択します
- プロセスモデルセクションに移動し、アイデンティティプロパティの3つのドットをクリックします。
- カスタムアカウントを選択します。
- 管理者(または管理者アカウントの名前)を入力します
- 管理者パスワードを入力します(持っていない場合は、ネットワーク管理者か、同じパスワードを持っている人に尋ねてください。これは1回だけです)。[OK]を押します。
これで、サイト/Web API は管理者アカウントとして実行されるようになります。
少しでもお役に立てれば幸いです