# Installe la Holleville Root CA sur Windows (magasin "Autorites de certification racines de confiance"). # Chrome, Edge et Firefox (via security.enterprise_roots) utilisent ce magasin. # # PowerShell en administrateur (installation pour tout le PC) : # irm https://pki.holleville.eu/install-ca.ps1 | iex # Desinstallation : # & ([scriptblock]::Create((irm https://pki.holleville.eu/install-ca.ps1))) -Uninstall # Sans administrateur : installation pour l'utilisateur courant (Windows demande confirmation). # Windows 10 (pas de TLS 1.3 dans PowerShell) : telecharger le fichier avec le navigateur, puis # powershell -ExecutionPolicy Bypass -File .\install-ca.ps1 param([switch]$Uninstall) $ErrorActionPreference = 'Stop' # Le certificat est verifie par son empreinte : le telechargement en HTTP est donc sans risque $CaUrl = 'http://pki.holleville.eu/root.crt' $CaName = 'Holleville Root CA' $CaSha256 = '4629381102E28BBAF5C13EAE4FD689B4474D5C5A5BDC9A6F82A417765E272AC4' function Ok($m) { Write-Host " [OK] $m" -ForegroundColor Green } function Info($m) { Write-Host " [i] $m" } function Fail($m) { Write-Host " [X] $m" -ForegroundColor Red; throw $m } $isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent() ).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) $store = if ($isAdmin) { 'LocalMachine' } else { 'CurrentUser' } # Lance par double-clic (install-ca.cmd) : se relancer en administrateur if (-not $isAdmin -and $env:HOLLEVILLE_CMD) { Info "une fenetre administrateur va s'ouvrir (accepte la demande de Windows)" Start-Process -FilePath $env:HOLLEVILLE_CMD -Verb RunAs return } Write-Host "== $CaName : $(if ($Uninstall) { 'desinstallation' } else { 'installation' }) ($store)" if (-not $isAdmin) { Info "pas administrateur : installation pour l'utilisateur courant uniquement" } $existing = Get-ChildItem "Cert:\$store\Root" | Where-Object { $_.Subject -like "*CN=$CaName*" } if ($Uninstall) { if (-not $existing) { Info 'non installee'; return } $existing | ForEach-Object { Remove-Item -Path "Cert:\$store\Root\$($_.Thumbprint)" } Ok 'retiree du magasin Windows' return } # 1. Telechargement et verification de l'empreinte SHA-256 $tmp = Join-Path $env:TEMP 'holleville-root-ca.crt' try { Invoke-WebRequest -Uri $CaUrl -OutFile $tmp -UseBasicParsing $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 (, [IO.File]::ReadAllBytes($tmp)) $sha = [Security.Cryptography.SHA256]::Create() $fp = -join ($sha.ComputeHash($cert.RawData) | ForEach-Object { $_.ToString('X2') }) if ($fp -ne $CaSha256) { Fail "empreinte inattendue ($fp) : certificat refuse" } Ok 'certificat telecharge, empreinte verifiee' # 2. Magasin Windows (Chrome, Edge, et la plupart des applications) if ($existing | Where-Object { $_.Thumbprint -eq $cert.Thumbprint }) { Ok 'deja presente dans le magasin Windows' } else { Import-Certificate -FilePath $tmp -CertStoreLocation "Cert:\$store\Root" | Out-Null Ok "ajoutee au magasin Windows ($store\Root)" } } finally { Remove-Item $tmp -ErrorAction SilentlyContinue } # 3. Firefox : lui faire utiliser le magasin Windows (security.enterprise_roots.enabled) $profiles = Join-Path $env:APPDATA 'Mozilla\Firefox\Profiles' if (Test-Path $profiles) { $pref = 'user_pref("security.enterprise_roots.enabled", true);' Get-ChildItem $profiles -Directory | ForEach-Object { $userJs = Join-Path $_.FullName 'user.js' if (-not ((Test-Path $userJs) -and (Select-String -Path $userJs -SimpleMatch $pref -Quiet))) { Add-Content -Path $userJs -Value $pref -Encoding ASCII } Ok "Firefox configure ($($_.Name))" } } Write-Host '== Termine. Redemarre tes navigateurs pour prendre en compte la nouvelle CA.'