Eu tenho uma ferramenta de configuração que configura o certificado SSL do IIS para um site. Ele cria uma nova ligação na configuração do IIS para "Site padrão" e, em seguida, atribui um certificado SSL a ele. A ferramenta funciona bem quando a executo em nome de uma conta administrativa, mas falha ao ser executada em uma conta de usuário normal com erro de "acesso negado".
Aqui está o código da ferramenta:
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();
}
}
}
Aqui está o erro que estou recebendo quando o executo como usuário:
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()
Adicionei controle total sobre as seguintes pastas:
- "C:\Windows\System32\inetsrv\config"
- "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys"
- "C:\inetpub\wwwroot"
Também tentei o seguinte link, mas não ajudou:https://support.comodo.com/index.php?/Knowledgebase/Article/View/1129/37/access-denied-exception-from-hresult-0x80070005-e_accessdenied
Existe alguma outra configuração ou política de segurança que preciso conceder ao meu usuário?
Alguns detalhes adicionais: Verifiquei se há algo que possa exigir permissões no ProcessMonitor, mas não encontrei nenhuma chave de registro nem arquivos com "ACESSO NEGADO". Havia apenas uma chave de registro, que adicionei, mas não faz nenhuma diferença: HKLM\System\CurrentControlSet\Services\WinSock2\Parameters.
Também é possível adicionar uma nova ligação sem certificado, mas quando especifico o hash do certificado, ele falha. É como se alguma política não me permitisse executar o código, provavelmente algo relacionado ao COM, já que Microsoft.Web.Administration é um wrapper de interfaces COM, mas não tenho certeza.
Responder1
Tentei executar a mesma operação com 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).
Parece que não há solução alternativa para isso e devo usar uma conta de administrador. Também consegui um semelhanterespostapara a mesma pergunta no fórum do IIS.
Responder2
Eu tinha os mesmos requisitos e depois de tantas pesquisas ficou claro que os direitos de administrador são necessários em qualquer caso.
Resolvi esse problema criando um novo pool de aplicativos com conta personalizada como identidade.
Basicamente meu servidor estava tendo 2 usuários. um administrador e outro user_account com o mesmo grupo de administradores. Mas ainda assim user_account não conseguiu hospedar nenhum site por meio de código no IIS.
- Vá para o IIS
- Em seguida, clique em Pool de aplicativos
- Adicione um novo pool de aplicativos, escolha as configurações apropriadas e pressione OK.
- Clique no pool recém-criado e selecione Propriedade avançada
- Vá para a seção do modelo de processo e clique nos três pontos na propriedade Identidade
- Selecione Conta personalizada.
- Digite Administrador (ou qualquer nome da conta de administrador)
- Digite a senha do administrador (se você não tiver, pergunte ao chefe da rede ou a quem tiver a mesma senha apenas uma vez) e pressione OK
Agora seu site/API da web será executado como conta de administrador.
Espera que ajude de alguma forma