Vérifiez le protocole ssl, cipher & d'autres propriétés dans un asp.net mvc 4
En raison de la conformité des raisons que nous avons pour éteindre le soutien de certains algorithmes de chiffrement et SSL2 sur notre site. Ce n'est pas vraiment un problème, mais nous tenons également à informer, après le succès de leur connexion au site web, que nous vous suggérons de passer sur le protocole TLS 1.2 dans son navigateur, dans le cas où ils ne sont pas déjà à se connecter au serveur avec le protocole TLS 1.2. Donc la question que je me pose est:
Comment puis-je détecter le protocole et de chiffrement utilisé dans une requête https pour une ASP.net (MVC 4) application en cours d'exécution dans IIS?
Je sais qu'il existe des moyens pour se connecter à la SCHANNEL demande dans le journal des événements puis de les lire de nouveau, mais cela semble très laid pour moi.
Et j'ai vu que la Système.Net.De sécurité.SslStream a les propriétés que j'aurais besoin, par exemple: CipherAlgorithm, HashAlgorithm, KeyExchangeAlgorithm & directive sslprotocol, mais je ne suis pas sûr de l'endroit où je peux obtenir ces propriétés dans mon Contrôleur de l'Action dans un mvc4 application.
Vous devez vous connecter pour publier un commentaire.
Les mauvaises nouvelles, tel que déterminé par ILSpy, c'est qu'il n'existe aucun moyen pour arriver à une
System.Net.SslStream
instance de n'importe où à l'intérieur de ASP.NET. Cette classe est utilisé pour la programmation directe contre le réseau, par exemple par la WCF cadre. Le meilleur que vous pouvez faire à partir de ASP.NET (que ce soit en utilisant le Système.Web ou OWIN sur le dessus de IIS ou HttpListener) est d'obtenir une variable de serveur (voir la liste des serveur IIS variables) pour savoir si la connexion est sécurisée par quoi que ce soit de la sécurité du transport a été négocié avec le client.Aussi loin que la conception déterministe de la lecture des données du journal des événements lors d'une requête web... qui semble effrayant. Mais si vous pouvez le faire fonctionner, s'il vous plaît partager le code. 🙂
Sinon, vous pouvez essayer de mettre en œuvre votre propre Owin hôte (aka serveur web!) qui utilise
SslStream
dessous. Peut-être. 😛 Voir cet article pour une introduction détaillée àSslStream
de programmation.Mais puisque vous êtes déjà en mesure de désactiver certains protocoles sur votre serveur (comme dans cet article, je suppose)... Vous pouvez configurer votre site sur deux différents sous-domaines, par exemple
www.example.com
etsecure.example.com
, où l'ancien est à la vanille, serveur web et le dernier est configuré pour accepter les connexions TLS 1.2. Ensuite, vous devez écrire certaines initialisations logique qui obtient servi dewww.example.com
et essaie de faire une requête AJAXsecure.example.com/securityUpgradeCheck
(éventuellement avec un joliment stylisé spinner animation et "s'il vous Plaît attendre, en essayant de sécuriser cette connexion" texte pour impressionner vos utilisateurs :)). Si cette demande aboutit, l'utilisateur peut être redirigé verssecure.example.com
(probablement définitivement, depuis que l'agent utilisateur est alors appelé à la prise en charge de TLS 1.2, sauf si pour une raison quelconque, l'utilisateur modifie les paramètres de son navigateur).Pour plus d'impact, de l'ordre d'un certificat SSL EV pour le domaine sécurisé, de sorte que vos utilisateurs remarquerez la mise à jour de sécurité. 🙂
Mise à JOUR: j'ai fait un peu plus de creuser, sur la base théorique de l'écriture personnalisée (native) filtre ISAPI (ou l'extension) pour obtenir cette information via le SChannel API. Au début, j'étais plein d'espoir parce que j'ai découvert une fonction
HSE_REQ_GET_SSPI_INFO
qui permettrait le retour d'une SSPICtxtHandle
structure, et ce que vous pourriez appeler à partir d'une simple extension ISAPI via leEXTENSION_CONTROL_BLOCK
ServerSupportFunction
fonction. QueCtxtHandle
structure, il s'avère, représente un SChannel contexte et peut vous obtenir une référence à unSECPKG_ATTR_CONNECTION_INFO
attribut avec lequel vous pouvez récupérer la connexion SSL au niveau de l'information (les mêmes informations qui sont apparues dans lesSslStream
classe .NET, pour autant que je puisse dire). Toutefois, malheureusement, Microsoft prévoit que la possibilité et a décidé que cette information est uniquement disponible si vous utilisez des certificats client. Le comportement est "by design".Il y avait un (native) SSPI fonction,
QueryContextAttributes (Schannel)
, que j'ai découvert au cours d'une longue chasse via MSDN qui peut travail. Je n'ai pas essayé, et il n'arrive tout simplement pas de la même "by design" à la raison comme ISAPI API limitation lié ci-dessus. Toutefois, il peut être vaut la peine d'essayer. Si vous voulez explorer cette voie, voici un exemple d'une extension ISAPI. En fait, avec cette approche, vous pourriez être en mesure d'écrire un module IIS au lieu de cela, à l'aide de la plus récente IIS 7.0+ SDK.Mais, en supposant que vous n'avez pas le luxe de la demande de certificats clients et que le plan ne fonctionne pas, qu'il ne laisse que deux options.
Par le moyen - est votre équilibreur de charge est configuré pour toute interception SSL? Car alors toute cette chose est discutable de toute façon... Juste une pensée à considérer.
Mise à JOUR: Activation de la journalisation Schannel déduits de ce bijou:
Ce peuvent être lus directement à partir du code managé. Je pense que le nom d'utilisateur correspond uniquement au processus de travail IIS SID, malheureusement, mais en supposant que vous pouvez venir avec une sorte de corrélation heuristique, vous pourriez mettre en place un thread d'arrière-plan continuellement interroger le journal des événements et de vous donner une liste de récemment établi client poignées de main (l'utilisation d'un
ConcurrentDictionary
peut-être).Là. C'est tout. Pas plus curieux d'enquêter pour moi. Je suis fait. 😛
La lecture de ce avec intérêt que nous avons exactement le même problème.
Il m'est apparu qu'il doit y avoir un service web public disponible à la requête de ce type d'informations, et j'ai fait un peu de recherche et trouvé ceci:
https://www.howsmyssl.com/s/api.html
L'API est ici
Cette API peut être appelée à partir du code Javascript coté client et il retourne standard JSON qui peut être facilement analysée et une alerte montré pour vos utilisateurs.
Vous pouvez également envoyer les informations à votre propre service web à des fins de journalisation et d'essayer de combiner les informations existantes avec vos journaux IIS.
La seule question qui vous font face, puis est en s'appuyant sur un tiers. Cet effet peut être atténué par debout sur votre propre serveur d'hébergement et le le code qui est librement disponible sur GitHub.
Nous allons travailler sur cette solution pour une fois que j'ai un code en place, je mettrai à jour cette réponse.
Encore merci à Lars pour la réponse ci-dessus. J'aurais ajouté ce qu'un commentaire à ce message mais j'ai pensé qu'il vaut la peine de créer une réponse distincte afin que les gens peuvent trouver plus facile.
Comment voulez-vous vérifier la négociation de la poignée de main TLS à partir du Serveur? a la manière d'obtenir cette sous IIS 8.5 et plus élevé dans les ASP.Net MVC /WebAPI. Au moins, il a travaillé pour moi et quelques autres, lorsque j'ai répondu hier.