2010-09-11 63 views
33

Cuando configura inicialmente IIS Express para habilitar SSL, establece el puerto por defecto en 44300. Desafortunadamente, cuando intento acceder a mi sitio en https://localhost/, no funciona a menos Utilizo el número de puerto 44300 - https://localhost:44300/.IIS Express está predeterminado en el puerto 44300 para https al habilitar SSL

Los enlaces se generan utilizando la siguiente:

<%= Html.ActionLink("Index", "Index", "Home", new { @action = "https://" + Request.Hostname + Url.Action("Index", "Home") }) %> 

Aunque una solución fea, la palabra clave @action puede anular la ruta generada, pero significa que la aplicación aparentemente tendría que estar al tanto de cualquier no-estándar puertos (por ejemplo, 44300).

El problema es que estaría escribiendo algo para resolver un problema que solo ocurriría en un entorno de desarrollo.

Así que mi pregunta es ... ¿Cómo cambio el puerto a 443 y me gusta IIS Express?

Config para mi sitio es el siguiente:

<site name="MySite" id="2" serverAutoStart="true"> 
    <application path="/"> 
    <virtualDirectory path="/" physicalPath="C:\Inetpub\MySite" /> 
    </application> 
    <bindings> 
    <binding protocol="http" bindingInformation=":80:" /> 
    <binding protocol="https" bindingInformation=":44300:" /> 
    </bindings> 
</site> 

Muchas gracias de antemano.

Actualización:

Esta pregunta ha sido answered por Divya más en los foros de IIS.

Respuesta

25

Esta pregunta ha sido answered por Divya over en los foros de IIS.

Una vez que habilita SSL para un sitio web en WebMatrix, su valor predeterminado es el puerto 44300 y realiza todas las vinculaciones en segundo plano. Espero que haya intentado cambiar este puerto a 443 en el archivo de configuración. Una vez hecho y guardado, también debe modificar el enlace en http.sys. Debería eliminar la entrada existente para el puerto 44300 y agregar la entrada para el puerto 443. Para hacer esto, puede usar httpcfg (WinXp/Win2003) o 'netsh http' (WinVista/Win2K8/Win7). Éstos son los comandos para netsh:

1) Obtener el id de aplicación y certhash para la entrada existente de 44.300 (I Asumo, que se va a utilizar el mismo certificado que WebMatrix se instala por defecto Si desea cambiar. el certificado también, obtener el hash del certificado del certificado tienda): netsh http show sslcert. En la búsqueda de resultados, ingrese , puerto 44300 y copie certhash y appID.

2) Eliminar la entrada de 44300: netsh http delete sslcert ipport=0.0.0.0:44300

3) Añadir una nueva entrada para el puerto 443 con certhash y appID copiado en el paso 1. netsh http add sslcert ipport=0.0.0.0:443 certhash=<certhash> appid=<appid>

Después de configurar la entrada en http.sys, debe reiniciar el servicio http para que los cambios surtan efecto.

net stop http

net start http

Como han dicho otros, hay varias maneras de conseguir sus agradables certificados SSL.

netsh http show sslcert > output.txt 

o (mi método preferido):

netsh http show sslcert | clip 
+1

en mi máquina Win7, 'netsh espectáculo http sslcert' devolvió más de 100 entradas y 44300 estaba en la parte superior. así que use los comandos 'netsh http show sslcert | más' o 'netsh http show sslcert> output.txt' para facilitarte las cosas. – rymo

+2

@rymo Como un enfoque lateral, puede usar 'netsh http show sslcert ipport = 0.0.0.0: 44300' que se filtrará a ese específico. – Alpha

+1

u otra solución: 'netsh http show sslcert | clip' para copiar el resultado al portapapeles y luego péguelo en su editor de texto y busque allí –

2

El puerto 44300 es secuencial: 00 significa que es la primera aplicación que se han configurado como activado SSL; 01 será el segundo y así sucesivamente.

Como también requiero que mi sitio web solo trabaje en HTTPS al agregar el atributo global [RequireHttps], tuve problemas para depurarme. Cuando se inicia, se redirige automáticamente a https://localhost/

Para solucionar este problema al depurar un sitio web, simplemente crear una nueva RequireHttpsAttribute que especifique el puerto

#if DEBUG 
public class RequireHttpsAttribute : System.Web.Mvc.RequireHttpsAttribute 
{ 
    protected override void HandleNonHttpsRequest(System.Web.Mvc.AuthorizationContext filterContext) 
    { 
     base.HandleNonHttpsRequest(filterContext); 

     var result = (RedirectResult)filterContext.Result; 

     var uri = new UriBuilder(result.Url); 
     uri.Port = 44301; 

     filterContext.Result = new RedirectResult(uri.ToString()); 
    } 
} 
#endif 

Utilice esta clase al depurar solamente. Cuando se implementa en IIS7, debe usar la reescritura de Url para redirigir a HTTPS.

+0

Esto es exactamente lo que quería evitar - Tener un código que intenta manejar esta situación. Al final, me mudé a Windows 7 e IIS 7, eliminando efectivamente mi necesidad de este truco. –

+2

Claro, al implementar, usted confía en el método probado y de confianza que ya proporciona IIS, pero cuando se depura, es útil. –

+0

Absolutamente.Posiblemente agregaría regiones de depuración en el código para evitar que se libere código que no sea de producción. –

0

Como he dedicado mucho tiempo a este tema, me gustaría compartir mi hallazgo. Estoy volviendo a publicar el segmento de mi otra publicación menos el código. Algunos antecedentes y explicación:

========================================= =

Después de investigar aroud, pude resolver este problema con IIS Express y una anulación del método de la clase Controller OnAuthorization (Ref # 1). También me he ido con la ruta recomendada por Hanselman (Ref # 2). Sin embargo, yo no estaba completo satisfecho con estas dos soluciones debido a dos razones:

  1. Ref # 1 de OnAuthorization sólo funciona en el nivel de acción, no a nivel de clase controlador
  2. Ref # 2 requiere una gran cantidad de configuración (Win7 SDK para makecert), netsh comandos, y, para usar el puerto 80 y el puerto 443, necesito iniciar VS2010 como administrador, lo cual frunzo el ceño.

Por lo tanto, se me ocurrió con esta solución que es bastante simple y posee las siguientes condiciones:

  1. Quiero ser capaz de utilizar el atributo RequireHttps en clase o acción a nivel de controlador

  2. Quiero MVC utilizar HTTPS cuando el atributo RequireHttps está presente, y el uso de HTTP si está ausente

  3. no quiero tener que correr Visual Studio como administrador

  4. Quiero ser capaz de utilizar cualquier HTTP y HTTPS puertos asignados por IIS expreso

  5. puedo volver a utilizar el certificado SSL autofirmado de IIS Express, y no me importa si veo el SSL no válido Prompt

==================================== Es posible encontrar mi solución/código aquí ==>ASP.NET MVC RequireHttps in Production Only

+0

La respuesta general es más o menos la misma que la de Pierre-Alain Vigeant, que divide el código de desarrollo del código de producción. –

0

Dan respuesta es correcta, pero si usted todavía tiene problemas con la configuración de IIS Express para servir a su sitio web con HTTP y HTTPS en los puertos estándar aquí es agradable tutorial que esa guía paso a paso:

http://www.lansweeper.com/kb/54/How-to-configure-SSL-in-IIS-Express.html

En en mi caso, borré accidentalmente el certificado IIS Express. Creo que se genera la primera vez que usa SSL en Visual Studio (F4 en el proyecto seleccionado para obtener la ventana de propiedades y marcar la casilla 'SSS habilitado'). Este tutorial me guió para crear un certificado y arreglarlo.

0

Crear clase

public class RequireSSLAttribute: RequireHttpsAttribute 
    { 
     protected override void HandleNonHttpsRequest(AuthorizationContext filterContext) 
     { 
      base.HandleNonHttpsRequest(filterContext); 

      if (filterContext.HttpContext.Request.Url.Host.ToLower().Equals("localhost")) 
      { 
       // redirect to HTTPS version of page 
       string localhostSSLPort = System.Configuration.ConfigurationManager.AppSettings["localhostSSLPort"]; 
       string url = "https://" + filterContext.HttpContext.Request.Url.Host + ":" + localhostSSLPort + filterContext.HttpContext.Request.RawUrl; 
       filterContext.Result = new RedirectResult(url); 
      }   
     } 
    } 

Y dentro de su web.config añadir algo como esto

<appSettings>  
    <add key="localhostSSLPort" value="44300"/> 
    </appSettings> 

Y luego lo utiliza como

[RequireSSL]    
    public class AdminController : Controller 
    { 
       ... 
    } 
Cuestiones relacionadas