Certificati SSL SNI e jolly sullo stesso server con IIS


12

Vorrei ospitare un sito Web che dovrebbe ascoltare i sottodomini (ad esempio sub.dominio.com) insieme a più siti Web che vivono appena sotto un dominio di secondo livello (ad esempio dominio2.com, dominio3.com) con IIS e con SSL.

Per il sito Web con i sottodomini ho un certificato con caratteri jolly (* .domain.com) e ho anche certificati specifici per gli altri siti (domain2.com e domain3.com).

È possibile ospitare tale configurazione nello stesso IIS (se ciò è importante, in un ruolo Web del servizio cloud di Azure)?

Il problema è esattamente ciò che titobf ha spiegato qui : teoricamente per questo avremmo bisogno di collegamenti usando SNI, con l'host specificato per domain2 / 3.com e quindi un sito Web generico con * host per * .domain.com. Ma in pratica, indipendentemente dal modo in cui i collegamenti sono impostati se il sito Web generale è su di esso, riceverà anche tutte le richieste a domain2 / 3.com (anche se presumibilmente è abbinato solo come ultima risorsa).

Qualsiasi aiuto sarebbe apprezzato.

Ancora irrisolto

Purtroppo non sono stato in grado di risolverlo: sembra essere risolvibile solo in modi estremamente complicati, come la creazione di un software che si trova tra IIS e Internet (quindi sostanzialmente un firewall) e modifica le richieste in arrivo (prima che avvenga l'handshake SSL! ) per consentire lo scenario. Sono abbastanza sicuro che questo non sia possibile con IIS, indipendentemente da quale sia un modulo nativo.

Devo chiarire: usiamo Azure Cloud Services, quindi abbiamo un ulteriore vincolo che non possiamo usare più indirizzi IP (vedere: http://feedback.azure.com/forums/169386-cloud-services-web-and -worker-role / suggestions / 1259311-multiple-ssl-and-domains-to-one-app ). Se puoi indirizzare più IP al tuo server, non hai questo problema poiché puoi creare collegamenti anche per IP, e questi funzioneranno insieme collegamenti jolly. Più specificamente, è necessario un IP per il sito jolly (ma poiché si dispone di un IP separato ora non è necessario configurare un'associazione del nome host jolly) e un altro IP per tutti gli altri non jolly.

In realtà la nostra soluzione alternativa era l'uso di una porta SSL non standard, 8443. Quindi l'associazione SNI è in realtà associata a questa porta, quindi funziona insieme alle altre associazioni. Non carino, ma una soluzione accettabile per noi fino a quando non puoi utilizzare più IP per ruoli Web.

I vincoli non funzionanti ora

La prima associazione https è SNI con un certificato semplice, la seconda non è SNI, con un certificato jolly.

Il sito http funziona, così come il sito https SNI, ma quello con l'associazione jolly fornisce un "Errore HTTP 503. Il servizio non è disponibile." (senza ulteriori informazioni, nessuna traccia di richiesta non riuscita o voce del registro eventi). Attacchi

Finalmente funziona praticamente

L'abilitazione del registro di traccia ETW come descritto da Tobias ha mostrato che l'errore di root era il seguente:

Richiesta (ID richiesta 0xF500000080000008) rifiutata a causa del motivo: UrlGroupLookupFailed.

A quanto ho capito, ciò significa che http.sys non è in grado di indirizzare la richiesta a nessun endpoint disponibile.

Il controllo degli endpoint registrati con ha netsh http show urlaclmostrato che c'era effettivamente qualcosa registrato per la porta 443:

Reserved URL            : https://IP:443/
    User: NT AUTHORITY\NETWORK SERVICE
        Listen: Yes
        Delegate: No
        SDDL: D:(A;;GX;;;NS)

Rimuovendolo con netsh http delete urlacl url=https://IP:443/finalmente abilitato il mio binding SSL.


Dovresti assolutamente essere in grado di farlo su IIS utilizzando SNI, senza ricorrere a più IP o porte non standard.
Joe Sniderman,

Vuoi dire che IIS dovrebbe supportare questo? Sono d'accordo :-).
Piedone,

Sono totalmente d'accordo con te, Piedone. Sono davvero deluso dal fatto che IIS (o per essere più precisamente http.sys) NON supporti la combinazione di un certificato jolly come certificato SSL predefinito e più certificati concreti con SNI COME PREVISTO. Il problema è ben noto dal 2012, come puoi vedere qui: forums.iis.net/t/1192170.aspx . Ho appena scritto un'email a Microsoft e spero di ricevere presto un feedback.
Tobias J.,

Grazie Tobias. Torna qui una volta che Microsoft ha risposto.
Piedone,

2
Probabilmente http.sys sta rifiutando la richiesta, quindi nessuna richiesta non riuscita viene registrata in IIS. Creare un registro di traccia ETW http.sys: 1) avviare il registro di traccia. eseguire: logman start httptrace -p Microsoft-Windows-HttpService 0xFFFF -o httptrace.etl -ets2) eseguire la richiesta 503 3) interrompere il registro di traccia. eseguire: logman stop httptrace -ets4) scrivere il registro di traccia su file. esegui: tracerpt.exe httptrace.etl -of XML -o httptrace.xml5) controlla il motivo di 503 nel file xml e pubblicalo qui.
Tobias J.,

Risposte:


6

Baris ha ragione! Il certificato SSL configurato su un binding IP: PORT (esempio: 100.74.156.187:443) ha sempre la precedenza in http.sys! Quindi la soluzione è la seguente:

Non configurare un'associazione IP: 443 per il certificato con caratteri jolly di fallback, ma configurare un'associazione *: 443 (* significa "Tutti non assegnati") .

Se il certificato con caratteri jolly è stato configurato sull'endpoint SSL del servizio cloud di Azure (come ho fatto io), è necessario modificare l'associazione SSL creata da Azure Cloud Service Runtime (IISconfigurator.exe) da IP: PORT a *: PORT. Sto chiamando il seguente metodo in OnStart del mio ruolo Web:

public static void UnbindDefaultSslBindingFromIp()
{
    Trace.TraceInformation(">> IISTenantManager: Unbind default SSL binding from IP");
    using (var serverManager = new Microsoft.Web.Administration.ServerManager())
    {
        try
        {
            var websiteName = string.Format("{0}_Web", Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.CurrentRoleInstance.Id);
            var site = serverManager.Sites[websiteName];
            var defaultSslBinding = site.Bindings.Single(b => b.IsIPPortHostBinding && b.Protocol == "https");
            defaultSslBinding.BindingInformation = string.Format("*:{0}:", defaultSslBinding.EndPoint.Port);
            serverManager.CommitChanges();
        }
        catch (Exception ex)
        {
            Trace.TraceError(ex.ToString());
        }
    }
}

La seguente schermata mostra una configurazione funzionante del nostro servizio cloud. Non essere confuso riguardo alle porte non standard. Lo screenshot proviene dal servizio cloud emulato.

configurazione IIS funzionante

Un'altra cosa da menzionare: non modificare tutti i binding in * perché l'associazione HTTP (porta 80) funziona solo con l'associazione IP: PORT nel servizio cloud distribuito. Qualcos'altro è associato a IP: 80, quindi *: 80 non funziona perché * sta per "tutti non assegnati" e l'IP è già assegnato altrove in http.sys.


Grazie per la tua risposta dettagliata. Ho aggiornato la mia domanda: come ricordo ora probabilmente non sono andato con questa configurazione perché ho avuto lo stesso errore di adesso.
Piedone,

4

Assicurati che il bind non sia del tipo IP: Porta. Quando esiste un IP: l'associazione della porta per un'associazione HTTPS mentre SNI non è richiesta, tale associazione avrà sempre la precedenza. Per il tuo caso generale, usa un *: Port binding (* essendo il tutto non assegnato).


Grazie, ma come puoi vedere nella mia descrizione inizialmente ho provato a configurare l'associazione SNI senza porta, ma dato che non ha funzionato ho finito con un'associazione porta personalizzata.
Piedone,

Per porta, presumo che tu intenda l'IP. Non è possibile avere un'associazione senza una porta. Inetmgr non lo consentirà. Per i binding SNI è possibile utilizzare l'IP specifico o "Tutti non assegnati" e il risultato sarà lo stesso. È l'associazione Catch All, per la quale si dispone di un certificato con caratteri jolly, che deve essere su "Tutti non assegnati" e non su un IP specifico.
bariscaglar,

Intendevo porta ma volevo dire "porta non standard". L'IP non è stato specificato, proprio come dici tu e non funziona ancora, vedi anche il link di Tobias. Esistono due modi per aggirare questa limitazione di IIS: usare una porta personalizzata o un IP diverso dagli altri binding: nei servizi cloud di Azure quest'ultimo non è disponibile, quindi abbiamo scelto una porta personalizzata.
Piedone,

bariscaglar è lo sviluppatore Microsoft (che lavora su IIS) con cui ho avuto una conversazione molto piacevole e utile! Grazie Baris! Insieme abbiamo analizzato il comportamento e siamo giunti alla conclusione che il comportamento descritto è il comportamento desiderato di http.sys. Ma c'è una bella soluzione. Vedi la mia risposta per i dettagli.
Tobias J.

Solo una nota per chiunque stia leggendo, ho scoperto di recente che se si usa il portale di Azure per configurare un servizio per Desktop remoto (o in caso contrario si modifica la configurazione cert) può causare la creazione automatica di un IP: Port binding e interrompere tutti i propri SNI . Non ho una soluzione a quel particolare problema. Succede dopo RoleEnvironment.Changed, quindi non riesco a catturarlo in WebRole.cs.
Mike,

1

IIS supporta SNI, anche nei ruoli Web del servizio cloud azzurro anche se non è possibile accedere alla configurazione attraverso il portale e se lo si fa sulla scatola dopo la distribuzione, verrà cancellato con la distribuzione successiva. La soluzione è automatizzare la configurazione. Dai un'occhiata qui per i dettagli:

http://www.vic.ms/microsoft/windows-azure/multiples-ssl-certificates-on-windows-azure-cloud-services/


Grazie, ma come ho spiegato non c'è alcun problema con SNI stesso (lo sto usando) ma piuttosto come funziona la corrispondenza dei nomi host con caratteri jolly in IIS.
Piedone,

Questo articolo non esiste più, ma eccolo nell'Archivio Web: web.archive.org/web/20151020041907/http://www.vic.ms/microsoft/…
Mike,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.