web-dev-qa-db-fra.com

IIS Express utilise par défaut le port 44300 pour https lors de l'activation de SSL

Lorsque vous configurez initialement IIS Express pour activer SSL, le port par défaut est 44300. Malheureusement, lorsque j'essaie d'accéder à mon site sur https://localhost/, il ne fonctionne que si j'utilise le numéro de port 44300 - https://localhost:44300/.

Les liens sont générés à l'aide des éléments suivants:

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

Bien que la solution soit laide, le mot clé @action peut remplacer la route générée, mais cela signifie que l’application aurait apparemment besoin de connaître les ports non standard (par exemple, 44300).

Le problème, c'est que j'écrirais quelque chose pour résoudre un problème qui ne se produirait que dans un environnement de développement.

Ma question est donc ... Comment puis-je changer le port en 443 et que IIS Express l’aime?

La configuration pour mon site est ci-dessous:

<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>

Merci d'avance.

Mettre à jour:

Cette question a été répondue par Divya sur les forums IIS.

35
Dan Atkinson

Cette question a été réponse de Divya sur les forums IIS.

Une fois que vous avez activé SSL pour un site Web dans WebMatrix, le port par défaut est 44300 et toutes les liaisons sont effectuées en arrière-plan. J'espère que vous avez essayé de changer ce port en 443 dans le fichier de configuration. Une fois que cela est fait et enregistré, vous devez également modifier la liaison dans http.sys. Vous devez supprimer l'entrée existante pour le port 44300 et ajouter l'entrée pour le port 443 . Pour ce faire, vous pouvez utiliser httpcfg (WinXp/Win2003) ou 'netsh http' (WinVista/Win2K8/Win7) . Voici les commandes pour netsh:

1) Obtenez l'appid et certhash pour l'entrée existante de 44300 (je suppose. Vous supposerez utiliser le même certificat que WebMatrix Installe par défaut. Si vous souhaitez également modifier le certificat, obtenir le hachage du certificat du certificat auprès du certificat store): netsh http show sslcert. Dans la sortie, recherchez l'entrée pour port 44300 et copiez certhash et appID.

2) Supprimer l'entrée pour 44300: netsh http delete sslcert ipport=0.0.0.0:44300

3) Ajoutez une nouvelle entrée pour le port 443 avec certhash et appID copiés à l'étape 1. netsh http add sslcert ipport=0.0.0.0:443 certhash=<certhash> appid=<appid>

Après avoir configuré l'entrée dans http.sys, vous devez redémarrer http service pour que les modifications prennent effet.

net stop http

net start http

Comme l'ont noté d'autres personnes, il existe plusieurs méthodes pratiques pour obtenir vos certificats SSL.

netsh http show sslcert > output.txt

ou (ma méthode préférée):

netsh http show sslcert | clip
27
Dan Atkinson

Le port 44300 est séquentiel: 00 signifie que c’est la première application que vous avez configurée comme compatible SSL; 01 sera le deuxième et ainsi de suite.

Comme je demande également à mon site Web de ne fonctionner qu'en HTTPS en ajoutant l'attribut global [RequireHttps], j'ai eu quelques problèmes de débogage. Au lancement, il était automatiquement redirigé vers https://localhost/

Pour résoudre ce problème lors du débogage d'un site Web , je crée simplement une nouvelle RequireHttpsAttribute qui spécifie le port

#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

Utilisez cette classe uniquement lors du débogage. Une fois déployé sur IIS7, vous devez utiliser la réécriture d’URL pour rediriger vers HTTPS.

2

Depuis que j'ai passé beaucoup de temps sur ce sujet, je voudrais partager ma conclusion. Je republie le segment de mon autre poste moins le code. Quelques fondements et explications:

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

Après des recherches approfondies, j'ai pu résoudre ce problème avec IIS Express et une substitution de la méthode OnAuthorization de la classe de contrôleurs (réf. N ° 1). J'ai également suivi l'itinéraire recommandé par Hanselman (réf. N ° 2). Cependant, je n'étais pas complètement satisfait de ces deux solutions pour deux raisons:

  1. La variable OnAuthorization de la référence 1 ne fonctionne qu'au niveau action, pas au niveau de la classe du contrôleur
  2. La référence n ° 2 nécessite de nombreuses commandes d'installation (SDK Win7 pour makecert), netsh et, afin d'utiliser les ports 80 et 443, je dois lancer VS2010 en tant qu'administrateur, ce que je désapprouve.

J'ai donc proposé cette solution assez simpliste avec les conditions suivantes:

  1. Je veux pouvoir utiliser l'attribut RequireHttps au niveau de la classe de contrôleur ou du niveau d'action

  2. Je souhaite que MVC utilise HTTPS lorsque l'attribut RequireHttps est présent et utilise HTTP s'il est absent

  3. Je ne veux pas avoir à exécuter Visual Studio en tant qu'administrateur

  4. Je souhaite pouvoir utiliser tous les ports HTTP et HTTPS attribués par IIS Express. 

  5. Je peux réutiliser le certificat SSL auto-signé de IIS Express et je ne me soucie pas de voir l'invite SSL non valide.

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

Vous pouvez trouver ma solution/code ici ==> ASP.NET MVC RequireHttps en production uniquement

2
Leng Keng

La réponse de Dan est correcte, mais si vous rencontrez toujours des problèmes pour configurer IIS Express afin de desservir votre site Web avec http et https sur des ports standard, voici le didacticiel Nice qui vous guide pas à pas:

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

Dans mon cas, j'ai accidentellement supprimé le certificat Express IIS. Je pense qu'il est généré la première fois que vous utilisez SSL dans Visual Studio (F4 sur le projet sélectionné pour obtenir la fenêtre des propriétés et cochez la case "SSS activé"). Ce tutoriel m'a guidé comment créer un certificat et le corriger.

0
Mariusz Pawelski

Créer une classe

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);
            }           
        }
    }

Et dans votre configuration Web, ajoutez quelque chose comme ça

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

Et puis vous l'utilisez comme 

    [RequireSSL]            
    public class AdminController : Controller
    {
              ...
    }
0
Alex Vaghin