Tengo una herramienta de configuración que configura el certificado SSL IIS para un sitio web. Crea un nuevo enlace en la configuración de IIS para el "Sitio web predeterminado" y luego le asigna un certificado SSL. La herramienta funciona bien cuando la ejecuto en nombre de una cuenta administrativa, pero falla cuando se ejecuta con una cuenta de usuario normal con el error "acceso denegado".
Aquí está el código de la herramienta:
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();
}
}
}
Este es el error que recibo cuando lo ejecuto como usuario:
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()
He agregado control total sobre las siguientes carpetas:
- "C:\Windows\System32\inetsrv\config"
- "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys"
- "C:\inetpub\wwwroot"
También probé el siguiente enlace pero no ayudó:https://support.comodo.com/index.php?/Knowledgebase/Article/View/1129/37/access-denied-exception-from-hresult-0x80070005-e_accessdenied
¿Existe alguna otra configuración o política de seguridad que deba otorgarle a mi usuario?
Algunos detalles adicionales: Verifiqué si hay algo que pueda requerir permisos en ProcessMonitor, pero no encontré ninguna clave de registro ni archivos con "ACCESO DENEGADO". Solo había una clave de registro, que agregué, pero no hace ninguna diferencia: HKLM\System\CurrentControlSet\Services\WinSock2\Parameters.
También es posible agregar un nuevo enlace sin certificado, pero cuando especifico el hash del certificado falla. Es como si alguna política no me permitiera ejecutar el código, probablemente algo relacionado con COM, ya que Microsoft.Web.Administration es un contenedor de interfaces COM, pero no estoy seguro.
Respuesta1
Intenté ejecutar la misma operación con 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 no hay solución para esto y debo usar una cuenta de administrador. También tengo uno similarrespuestapara la misma pregunta en el foro de IIS.
Respuesta2
Tenía los mismos requisitos y después de tantas búsquedas quedó claro que en cualquier caso se requieren derechos de administrador.
Resolví este problema creando un nuevo grupo de aplicaciones con una cuenta personalizada como identidad.
Básicamente mi servidor tenía 2 usuarios. un administrador y otra cuenta de usuario con el mismo grupo de administradores. Pero aún así, user_account no pudo alojar ningún sitio a través del código en IIS.
- Ir a IIS
- Luego haga clic en Grupo de aplicaciones
- Agregue un nuevo grupo de aplicaciones, elija la configuración adecuada y presione Aceptar.
- Haga clic en el grupo recién creado y seleccione Propiedad avanzada
- Vaya a la sección del modelo de proceso y haga clic en tres puntos en la propiedad Identidad
- Seleccione Cuenta personalizada.
- Ingrese Administrador (o el nombre que sea para la cuenta de administrador)
- Ingrese la contraseña de administrador (si no la tiene, pregúntele al jefe de red o a quien tenga la misma, solo una vez) y presione OK
Ahora su sitio/API web se ejecutará como cuenta de administrador.
Espero que ayude de alguna manera.