mercredi 22 juillet 2020

IIS Certificate Management - Comment installer un certificat SSL sur mon Site Web derrière IIS ?

C'est un vrai scandale cette histoire de certificats, cela permet à quelques uns, mal intentionnés de faire de l'argent. Mais pensez-vous réellement que les vrais hackeurs seront empêchés par ce genre de pratiques ? Je crois que non, il y a des sites cachés derrières des certificats SSL qui sont malveillants avec ou sans SSL.

SSL - l'Internet pour les Nulls
SSL - l'Internet pour les Nulls

C'est toujours la même chose sur les Internets, des organismes essayent de vous faire croire que vous êtes protégé et en profite pour vous prendre de l'argent. Sur les Internets la meilleure protection c'est vous !

Voici le site pour les dummies :

G1Site - Comment installer un certificat SSL sur votre site Internet ?

C'est bien pour les dummies cela reprends tout depuis le début très complet mais il n'y a pas de véritable solution, allez voir votre hébergeur ! Et à la fin il prônent les avantages et à mon avis ...  

Et j'apprends qu'il y a une solution Open Source ... Let’s encrypt, le certificat SSL gratuit open source.

Curieux non ...

Et sinon Ici vous pouvez vérifier ci votre certificat est "valide"

SSL Market - Vérificateur SSL/TLS - sodevlog

Ils vous propose de vous vendre un certificat pour 99 $ rien de moins ...

Et sinon, je cherche Azure Certificat SSL  

Microsoft - Ajouter un certificat TLS/SSL dans Azure App Service

Super sujet ... Intéressant ... 

Jusqu'au moment où j'installe Cerbot

certbot-beta-installer-win32.exe

alors c'est quoi le : .well-known/acme-challenge/

SysNove - Utilisation pratique de let's encrypt (avec acme-tiny)

Et sinon la mmc avec composant logiciel enfichable pour voir tous les certificats :

Afficher tous les certificats installés sur votre machine Windows

Comment certifier SSL mon site web ?

Je trouve également

https://certbot.eff.org/lets-encrypt/windows-other.html

installer cerbot pour windows

certbot Problem binding to port 80: Could not bind to IPv4 or IPv6.

Je vais voir namebay, ils me disent de "coller ma 'Certificate Signing Request' ou 'Requête de Signature de Certificat'. En faites dans IIS c'est une CR Certificate Request ...

Créer un CSR pour votre hébergeur
Créer un CSR pour votre hébergeur

Au cours de mes différentes lectures, j'ai appris que le Cn ou Common name devrait certainement être le nom de domaine que l'on souhaite certifier donc ma CSR :

Rédaction de ma CSR pour la certification au prêt de mon hébergeur
Rédaction de ma CSR pour la certification au prêt de mon hébergeur

Oups, oups, oups ... petit sueur froide ... je ne savais pas que j'avais la possibilité de déterminer la longueur de la clef !!!

Allons y ... on recommencer tout

Création d'une CSR détermination de la longeur de la claf ...

Me voilà à payer 42 Euros / an  pour faire certifier mon site ...

et mais sous-domaines ... ?

Certification SSL pour sous-domaine ?
Certification SSL pour sous-domaine ?

Tout cela ressemble bien à une escroquerie ...

Mon Certificat n'est pas valable pour les sous-domaines ?!
Mon Certificat n'est pas valable pour les sous-domaines ?!

Oui c'est une escroquerie car j'ai acheté une machine dans le Cloud de Microsoft, j'ai commandé et payé les noms de domaines et sous domaines chez Namebay, j'ai une gestion des DNS de Namebay qui fait pointer mes sous-domaine vers mon serveur Azure Microsoft.

Tout ceci est parfaitement légale et parfaitement professionnel, il n'y a aucune raison de faire appel à un tiers de confiance pour certifier mon activité.

LINUXFR.org - SSL, et l'escroquerie continue

Et voici une autre discussion sur les certifications les moins chères.

JeuxOnLine - Arnaque SSL ?

C'est donc un vrai sujet et une vraie arnaque, sans aucun doute. Me voilà en train de payer pour certifier mon site web que j'ai acheté à un FAI !?

Et me voilà avec une nouvelle question : Comment certifier SSL mes sous domaines ?

WP channel - Le point sur les certificats SSL obligatoires en 2017

https://letsencrypt.org/fr/getting-started/

https://certbot.eff.org/lets-encrypt/windows-other
Je suis à deux doigt de réussir, je passe toutes la certife, j'ajoute du code dans mon application pour rediriger les requêtes /.well-known/acme_challenge

certbot me génère les fichiers .pme j'utilise openSSL pour créer un .pfx mais au moment de faire l'Import depuis IIS -> ServerCertificates :

Boum !

A fatal error occurred when attempting to access the TLS server credential private key. The error code returned from the cryptographic module is 0x8009030D. The internal error state is 10001.


Error Cryptographiqe

Alors sinon ce matin, je repars à l'attaque et je vais là :

NetoMeter Blog - Letsencrypt Windows Client: How to Install Let’s Encrypt Free SSL Certificates on Windows Server

Je me dis chouette super un client letsencrypt pour Windows Server c'est exactement ce qu'il me faut ...  et puis ils donnent une build de letsencrypt ... je download, j'exécute .... et boum ... End Of Life. Moi aussi je suis au bout de ma vie et un peu scandalisé aussi ...


End of Life Plan for ACMEv1

Je suis de retour sur le site :

https://github.com/win-acme/win-acme

Oh bas mince alors, s'il faut que j'installe une chaîne de développement Visual Studio pour installer un Certificat SSL sur mon serveur, ça n'a pas beaucoup de sens ...

GGGGGGRRRRRRRrrrrrrrr !!!!

Créer un certificat SSL pour votre site web avec IIS Server

Bon ... il y a t-il UNE VRAIE SOLUTION dans tout cela ? 

Oui, elle est Ici : 

https://www.win-acme.com/

Download 2.1.9 et exécution en mode "Run as administrateur" de "wacs.exe" dans le répertoire dézippé. 

Une fenêtre DOS s'affiche dans laquelle vous pouvez gérer tous vos certificats SSL pour tous vos sites installé derrière le server IIS.

Le prérequis avant l'exécution de la Demande de Certificat, c'est d'avoir tout bien installé sur IIS ... notamment les bindings (http port 80, https port 443) et ça passe tout seul ... c'est wacs.exe qui découvre ce que vous avez installé derrière IIS Server et qui vous propose de gérer les Certificats SSL associés.

Mais avec tout ce que l'on a appris ici, toute cette Daube autour de la certification SSL pour Https, quel soulagement !

Et là, c'est LA solution pour certifier SSL un site Web sur un serveur IIS ... 

Merci d'avoir suivi mes pérégrinations à travers la certification SSL pour un site Web. N'hésitez pas à laisser votre commentaire.

jeudi 16 juillet 2020

Comment effectuer une réinstallation propre d'IIS ?

Voilà un sujet que je souhaite automatiser sur le bout de doigts, mon IIS ne fonctionne plus. L'expérience que j'ai me fait penser que IIS s'est cassé ! Bien sûr pas tout seul mais je suis incapable de le réparer. Quand je fais browse Default Web Site

Comment tester l'installation correcte de IIS 

J'obtiens le message suivant "Ce site est inaccessible" :

Ce site est inaccessible
Ce site est inaccessible
D'autre part; la partie ASP.NET, sur un IIS qui fonctionne correctement "a disparu" !

Server IIS qui fonctionne
Donc je me lance dans la réinstallation d'IIS Grrrr !!!! Je trouve la page :

Microsoft - How to perform a clean reinstallation of IIS

Mais quand vous avez à faire à un Serveur Windows avec le "Server Manager", c'est une autre affaire alors allons-y ...

Comment supprimer correctement IIS sur un Serveur Windows 10


J'ai comme un petit peu l'impression de faire une connerie mais je n'ai pas le choix l'IIS de ce Windows Server ne fonctionne plus du tout !

Le plus important dans le page de Microsoft - How to perform a clean reinstallation of IIS c'est qu'il te donne le droit de supprimer le dossier suivant :

C:\Windows\System32\inetsrv

Car franchement, il faut oser trifouiller à la main dans le répertoire Windows\System32, mais là c'est Microsoft qui le dit, pour ma part je me retrouve après désinstallation de Web Services (IIS) avec un répertoire vide. Mais je vais le renommer tout de même.

Réinstaller IIS 

Je me retrouve à faire l'opération inverse : réinstaller IIS.


Comment Installer IIS sur Serveur Windows 10 Data Center

Je parcours le wizard d'installation des features de mon Windows Data Server :

Wizard d'installation d'IIS sur Windows 10 Server Data Center - 1

Il me détaille les éléments à installer ...

Wizard d'installation d'IIS sur Windows 10 Server Data Center - 2
Wizard d'installation d'IIS sur Windows 10 Server Data Center - 2
Je continue le parcours du wizard d'installation des features de mon Data Server ...

Wizard d'installation d'IIS sur Windows 10 Server Data Center - 3 Vide !
Wizard d'installation d'IIS sur Windows 10 Server Data Center - 3 Vide !
Mais là, heureusement que je suis concentré ... Je trouve qu'il manque des trucs, je suis une machine de Dev j'ai également la possibilité d'aller regarder un autre serveur qui lui fonctionne ...

Pas de doute, ici il manque des trucs ... Je coche donc les éléments suivants :


Wizard d'installation d'IIS sur Windows 10 Server Data Center - 3 Vide !
Voici les éléments à cocher à mon avis, pour avoir une chance qu'IIS fonctionne correctement.

Vérifier qu'IIS est correctement installé

Je vais dans le répertoire :

C:\Windows\System32\inetsrv

J'en profite pour mettre InetMgr.exe dans la barre des tâches. Je clique sur le Default Web Site  la partie ASP.NET est bien revenue. 

Je clique sur Browse *:80 (http)


Vérifier l'installation d'IIS

J'ai bien le site par défaut qui s'affiche dans mon navigateur :

Vérification d'IIS - Affichage du site par défaut sur Browse *:80 (http)

Maintenant que j'y pense, je crois que l'erreur est venue avec l'ouverture du fichier :

C:\Windows\System32\inetsrv\config\applicationHost.config

Et j'ai peut être effectuer une suppression "à la va vite" à moins qu'il ne soit resté ouvert dans un éditeur au moment d'une opération de management d'IIS. Auquel cas il y aurait pu avoir un problème de conflit.

Voilà, nous venons d'apprendre à réparer IIS sur une machine Windows 10 Server Data Center.

Reconnaissez que ce n'est pas aussi facile que dans la doc Microsoft !

Don't forget to go to the beach!

mercredi 15 juillet 2020

Internet Integration Services - IIS Management - Binding

Un jour j'ai travaillé sur une plateforme en ligne complexe, faite de plusieurs sites derrière le même serveur IIS, de serveurs de base de données, de moteurs d'indexation et depuis j'y reviens chaque fois que j'ai besoin de configurer ce fameux IIS (Internet Integration Services ) alors prenons quelques notes.

Avant tout la console de Management de IIS se trouve Ici :

%windir%\system32\inetsrv\InetMgr.exe

C'est à dire là :

C:\Windows\system32\inetsrv

Et donc là aussi, vous pouvez faire un raccourcis sur le bureau ainsi vous aurez votre IIS Management Console sous la mains.

Gestionnaire des Services Internet

J'accède à la console de management de IIS et je vais voir comment tout ceci est configuré.

Configuration d'une Plateforme complexe IIS
Configuration d'une Plateforme complexe IIS

Comment configuré tout ça ? C'est dans Modifier le site -> Liaisons ...


IIS Configuration du Sous-Domaine

On trouve cette commande également Ici :

IIS Site modifier les liaisons
Il est important de configurer le site dans le bon pool d'application.

IIS - Quelle application dans quel Pool d'application
IIS - Quelle application dans quel Pool d'application

Des informations importantes, Ici :

IIS - Management
IIS - Management

Voici l'ensemble des sites pour certes plateforme et les différents Bindings. Vous voyez c'est un peu complexe comme plateforme.

Ne pas oublier le fichier hosts pour diriger les sous-domaines vers la bonne adresse IP :

Le fichier host qui reprend les liaisons (binding) et redirige vers localhost

Voilà maintenant, j'ai compris comment je pouvais configurer les bindings sur ma machine de dev.

vendredi 10 juillet 2020

Serilog - Ne fonctionne pas avec IIS

Impossible de déployer un site qui utilise Serilog comme module de Logger derrière IIS car quand on déploie le site sur le serveur de production et bien il n'y a pas de Log ...

Je viens de me faire piéger et de lire environ 300 pages sur ce sujet et dans ces 300 pages il n'y a pas cette solution alors je vous la donne ! Il faut Restarter IIS

En effet, bien sûr il faut donner les droits d'écriture sur le répertoire de Log à l'utilisateur IIS_IUSR. Mais ce n'est pas tout. En développant avec ASP.NET Core et Kestrel en production, on créé un petit batch pour relancer Kestrel et les Logs de Serilog apparaissent tout naturellement mais avec IIS, on relance le site et il n'y a pas de Log ?!

Pour avoir des Logs il faut Redémarrer l'exécution du site et dans IIS cela s'appelle cliquer sur le bouton Restart.

En production Serilog n'affiche pas de Log

Oui c'est une étourderie mais compte tenu de ce que je lis sur Internet, nous ne sommes pas les seuls à commettre cette bêtise et les solutions données ailleurs ne sont pas aussi claires.

Have fun!

jeudi 9 juillet 2020

ASP.NET Core Manage Authorize Policy

Ce sujet c'est comment gérer les autorisations au sein des applications ASP.NET Core ? Pour l'instant je connais deux mécanismes :

Dans le Startup.cs l'Authorise policy, exemple :

// Usage : [Authorize(Policy = "AdminPolicy")]
services.AddAuthorization( options => {
options.AddPolicy( "AdminPolicy",
builder => builder.RequireRole( Roles.Admin ) );
} );

Et dans le code, aller chercher une Claim de l'utilisateur mais c'est pas mal de code. Par exemple, mon Utilisateur possède un bool IsAdmin que je suis le seul à gérer (oui, j'ai fait comme ça) si je veux aller tester dans mon code ce bool pour savoir si j’octroie les droits ou non à l'utilisateur d'effectuer l'action.

Dans le contrôleur de l'action, voici le code :

    public class RoleController : Controller
    {
    private UserManager<ApplicationUser> userManager;

        public RoleController( UserManager<ApplicationUser> userManager )
        {
            this.userManager = userManager;
        }


[HttpPost]
        public async Task<IActionResult> Delete( string id )
        {
            var user = await userManager.GetUserAsync( User );
            if ( user.IsAdmin == false ) 
            {
                return RedirectToAction( nameof( HomeController.ErrorUserIsNotSuperAdmin ), "Home" );
            }

Mais bon, je ne vais pas écrire ce code pour tout les composants de mon application qui ont besoin de savoir de quel utilisateur il s'agit pour octroyer ou non les actions, ce serait fastidieux et rébarbatif.

Note de l'auteur (moi) : Au passage je réponds à une question souvent posé dans la StackOverflow :

stackoverflow - How to get current user in asp.net core

Curieux de voir à quel point cette communauté se perd elle même. Ils manquent de modérateurs à mon goût pour supprimer les mauvaises réponses car ils ne trouve pas de réponse correcte à des questions pourtant toutes simples. Peut être que c'est l'indexation de googoole qui le mets dans le vent...

Du coût je regarde la définition de RequireRole et juste à côté je remarque le définition de RequireAssertion alors ma chaine de recherche devient :

ASP.NET Core Authorize Policy Requires Assertion example

Et je tombe sur la bonne page :

MSDN - Policy-based authorization in ASP.NET Core

Et je tombe là dessus :

[Authorize(Roles = "Administrator")]

Grrrr ! Je conserve quand même mon AdminPolicy qui est plus facile à faire évoluer et qui est un bon exemple si je souhaite évoluer. Et finalement ce que je veux faire, peut se faire simplement par :

services.AddAuthorization(options =>
{
options.AddPolicy("IsSuperAdmin", policy => policy.RequireClaim( "role", "SuperAdmin"));
});

Et dans : StsIdentityServer\IdentityWithAdditionalClaimsProfileService.cs
public async Task GetProfileDataAsync( ProfileDataRequestContext context )
{
if ( user.IsAdmin )
{
claims.Add( new Claim( JwtClaimTypes.Role, "SuperAdmin" ) );
}

Le tour est joué, il ne me reste plus qu'à tester.

Identity Server - Configure Microsoft.Hosting.Lifetime to hear on prod

J'ai déployé mon application ASP.NET Core StsIdentity Server sur ma machine de PROD et lorsque j'exécute la partie serveur pour adresser la BD d'une part et le front, j'ai le message suivant :

[INF] Now listening on: http://localhost:xxxx<Microsoft.Hosting.Lifetime>

J'en déduis donc que pour que mon application fonctionne, il me faut modifier cette écoute sur une adresse qui diffère en PROD.

Donc la bonne question c'est : How to configure Microsoft.Hosting.Lifetime to hear on the right address in PROD ?

En posant la question de cette façon, je tombe sur ce site :

Andrew Lock | .NET Escapades - 5 ways to set the URLs for an ASP.NET Core app

Alors pour ma part, j'avais trouvé que en cliquant sur le StsIdentityServer.exe la partie serveur de mon application s'exécutait et j'obtiens les messages suivants

10:08:00.718 [INF] Now listening on: http://localhost:5000 <Microsoft.Hosting.Lifetime>
10:08:00.719 [INF] Now listening on: https://localhost:5001 <Microsoft.Hosting.Lifetime>

Alors, je me dis qu'en appelant mon exécutable avec le paramètre

--urls "http://localhost:5100;https://localhost:5101" 

Ca va marcher ! Et devinez quoi ? Ça Marche !