J’avais déjà écrit un billet sur cette solution sans être super satisfait de la chose. Pourquoi :
1° ça ne tournait pas sous nunux mais sous windows sans utiliser la solution native let’s ecrrypt
2° impossible de demander le renouvellement du certificat … un bug …euh ouais mais c’est le principe de la solution que d’avoir du renouvellement automatisé ?
Du coup, grand ménage et on repart sur des bases bien meilleures.
J’ai créé un Ubuntu sous VMware avec tout ce qu’il faut pour générer mes certificats en utilisant ACME :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
apt-get install git
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh –install
[/codesyntax]
un petit coup d’auto-upgrade:
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
./acme.sh –upgrade –auto-upgrade
[/codesyntax]
Puis après j’ai utilisé les API OVH pour valider mon nom de domaine via DNS sur let’s encrypt (et franchement c’est top ce qui me fait dire que pour les noms de domaine … OVH est plus qu’utile entre les API et le ghostdns).
Il faut aller sur cette adresse https://eu.api.ovh.com/createApp/ ce qui vous permet de récupérer une application key et une application secrète.
Après cette commande :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
acme.sh –issue -d mydomain.com –dns dns_ovh
[/codesyntax]
Comme c’est la première fois, il faut utiliser les 2 clés pour s’authentifier aupres d’ovh et c’est bon :
https://eu.api.ovh.com/auth/?credentialToken=n0Qbjm6wBdBr2KiSqIuYSEnixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Il faut sélectionner illimité et accès autorisé.
et on recommence :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
acme.sh –issue -d mydomain.com –dns dns_ovh
[/codesyntax]
Je génère mon certificat :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
./acme.sh –issue -d toto.com -d autodiscover.toto.com -d adfs.toto.com –d mail.toto.com –dns dns_ovh
[/codesyntax]
J’ai aussi besoin d’un pfx et merci openssl
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
./acme.sh –issue -d cd /root/.acme.sh/sdskh.com && openssl pkcs12 -export -out toto.com.pfx -inkey toto.com.key -in toto.com.cer -name « le1.toto.com » -passout pass: passquetuveux
[/codesyntax]
Boum certificat généré !!!!
Avec tous les fichiers qu’il faut pour Windows et Linux
Maintenant, un coup de fstab pour monter un répertoire commun (genre un répertoire du NAS) et copie de tous les fichiers vers ce répertoire (qui est donc celui d’un NAS).
Pour intégrer les certifs sous nginx ou apache (parce que j’ai pas mal de machine qui utilisent l’un ou l’autre), ce n’est pas très compliqué.
Un coup de fstab qui va taper sur le répertoire commun plus haut.
Vous donnez comme chemin SSL pour apache ou nginx les bon fichiers du commun et a minuit tous les jours on redémarre apache et/ou nginx.
Les fichiers mis à jour sont automatiquement et sans autre manipulation pris en compte.
Ce qui est pratique c’est que les fichiers certificats sont copiés tous les jours et prise en compte tous les jours. Dès qu’il y aura une vrai mise à jour des certificats (vers le 2eme mois dans mon cas en utilisant acme –force) Nginx et Apache en tiendront compte rapidement (pendant moins de 15min tous les 2 mois, il y aura un certificat valide mais obsolète sans être révoqué un nouveau certificat valide non pris en compte).
Par contre dans l’univers Windows, ça se corse.
J’opère une copie vers un répertoire spécifique d’Exchange pour faire une manip d’intégration.
D’abord je détruis l’ancien certificat :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
certutil -delstore My toto.com
[/codesyntax]
Ensuite j’importe le nouveau certificat :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
certutil -f -p « » -importpfx toto.com.pfx
[/codesyntax]
Enfin un coup de powershell pour stocker dans une variable le « thumbprint » (c’est-à-dire l’identifiant unique du certificat) et puis de l’activer sous exchange pour smpt,iis,pop et imap :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
$Thumbprint = (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -match « toto.com »}).Thumbprint;
Enable-ExchangeCertificate -Thumbprint $Thumbprint -Services POP,IMAP,SMTP,IIS –force
[/codesyntax]
Boum, j’ai donc une copie régulière du bon certificat en provenance de mon Ubuntu (via un support commun type NAS et en même temps cela pourrait être un montage direct fstab).
Je récupère le thumbprint (qui change à la mise à jour du certificat) et je le force sous Exchange.
Cette solution ne fonctionne pas tout à fait de la même manière pour web application proxy et ADFS. Tout simplement mon certificat ADFS contient toto.com et mon certificat let’s encrypt aussi du coup j’ai un peu galéré pour cette ligne powershell :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
$Thumbprint = (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {($_.Subject -match « toto.com ») -and ($_.Subject -notmatch « adfs.toto.com »)}).Thumbprint;
[/codesyntax]
En gros je veux le thumbprint de toto.com mais pas adfs.toto.com et avec cette ligne powershell je la récupère.
Une fois récupéré j’injecte sous Web Application Proxy là encore en powershell :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
Get-WebApplicationProxyApplication -Name autodiscover.toto.com | Set-WebApplicationProxyApplication -ExternalCertificateThumbprint $Thumbprint
Get-WebApplicationProxyApplication -Name mail.toto.com | Set-WebApplicationProxyApplication -ExternalCertificateThumbprint $Thumbprint
[/codesyntax]
et ainsi de suite (peut etre qu’il y a un moyen d’imposer le certificat toto.com à toutes les entrée WAP mais je n’ai pas trouvé).
La solution fonctionne aussi sur le mêle principe pour le certificat pour le vpn sstp
Grosse astuce … je stock encore en variable le thumbprint
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
$Thumbprint = (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {($_.Subject -match « sdskh.com ») -and ($_.Subject -notmatch « adfs.sdskh.com »)}).Thumbprint;
[/codesyntax]
J’affecte le certificate via son thumbprint au remote access
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
netsh ras set sstp-ssl-cert hash=$Thumbprint
[/codesyntax]
Et pour que ca fonctionne je le redémarre !
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
net stop RemoteAccess
net start RemoteAccess
[/codesyntax]
Le tout dans un script powershell.
Maintenant il faut que tous ces scripts soit programmé. Rien de plus simple un petit .bat à créer pour Exchange, pour le WAP et pour le VPN qui invoque le script powershell :
[codesyntax lang= »powershell » container= »div » tab_width= »400″ strict= »yes »]
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command « . « C:\chemindemonscript\monscript.ps1 »
[/codesyntax]
Une fois que tout cela est fini, j’ai :
Ubuntu génère/renouvelle les certificats let’s encryt
Copie vers un répertoire commun
le Serveur Exchange fait une copie du commun vers un répertoire ad hoc. Importation dans la librairie des certificats avec certutil. Powershell permet de récupérer le thumb du bon certificat. Il est force en affectation POP,IMAP,SMTP,IIS.
Le serveur WAP fait une copie du commun vers un répertoire ad hoc. Importation dans la librairie des certificats avec certutil. Powershell permet de récupérer le thumb du bon certificat. Il est force en affectation de toutes les adresses du reverse proxy.
Le serveur WAP fait une copie du commun vers un répertoire ad hoc. Importation dans la librairie des certificats avec certutil. Powershell permet de récupérer le thumb du bon certificat. Il est force en affectation du vpn sstp. Redémarrage du service VPN.
Tout étant programmé. Terminé je ne fais plus rien et j’ai toujours le bon certicat let’s encrypt sous linux ou Windows.
Elle est pas belle la vie ?