[Windows] Maak een Self-Signed Certificate

Een Self-Signed Certificate kan handig zijn: Interne servers hebben soms SSL nodig, maar om daar nou certificaten voor aan te schaffen: da's een beetje lastig.

Download eerst de iis6 resourcekit van Microsoft, en installeer deze. Standaard wordt er geinstalleerd in c:\program files (x86)\IIS resources\ maar door te kiezen voor een geadvanceerde installatie kun je de map zelf aanpassen. Uit deze installatie hebben we alleen SELFSLL.EXE nodig. Je kunt deze gewoon kopieren en ergens anders neerzetten (op een USB stickje, een netwerkshare,  of ergens anders.

Start de commandprompt (ik kies altijd voor elevation, maar weet niet zeker of dat hier nodig is), en tik het volgende in:

selfssl /N:CN=<subdomein,domein.tld> /V:<aantal dagen>

Zoals bijvoorbeeld

selfssl /N:CN=webserver.mijndomein.com /V:9999

Dit maakt een certificaat aan voor webserver.poelgeest.com die 9999 dagen geldig is. Je kunt ook wildcards gebruiken, dus *.mijndomein.com zou ook een mogelijkheid zijn.

De vraag wordt gesteld of je de SSL instellingen voor site 1 wilt vervangen. Doe dat, want anders wordt het certificaat niet aangemaakt. Op Windows 8 levert het trouwens een foutmelding op (error opening Metabase: 0x80040154), en dat zou er wel eens mee te maken kunnen hebben dat op Windows 8 geen IIS6 draait: De metabase is niet compatible. Maakt niet uit, want het certificaat wordt wel aangemaakt. Als je IIS7 gebruikt zou je de  IIS 6 Metabase Compatibility role kunnen installeren.

Het nieuwe certificaat wordt aangemaakt in de Personal store van de lokale computer. Hiervandaan kun je het ding exporteren en op andere machines gebruiken.

bron:
http://www.howtogeek.com/107415/it-how-to-create-a-self-signed-security-ssl-certificate-and-deploy-it-to-client-machines/

 

Met Powershell kan het ook. Daar gebruik ik het volgende script voor:

$DNSName="RandomName"
$Subject="This is the subject"
$Thumbprint=""
$Certificates=Get-ChildItem -Path Cert:\localMachine\My
$DNSName="RandomName"
$Subject="This is the subject"
ForEach ($Certificate in $Certificates) {
If (Test-Certificate -cert $Certificate -Policy SSL -DNSName "${DNSName}" -ErrorAction SilentlyContinue) {
  write-host "Certificate already exists"
  $thumbprint=$certificate.Thumbprint
  $cert=$Certificate
    }
  }
If ($thumbprint -EQ "") {
  write-host 'No certificate found. Will create a new one.'
  $thumbprint = (New-SelfSignedCertificate -DnsName $env:computername,"localhost","$env:computername.$env:userdnsdomain","${DNSName}" -NotAfter $([datetime]::now.AddYears(1000)) -certstorelocation "cert:\localMachine\my" -subject "${Subject}" -KeyExportPolicy Exportable).thumbprint
  $cert = (Get-ChildItem -Path cert:\localmachine\My\$thumbprint)
  $pwd = ConvertTo-SecureString -String "1234" -Force -AsPlainText
  Export-PFXCertificate -Cert $Cert -filepath $env:temp\$thumbprint.pfx -Password $pwd
  Import-PfxCertificate -filepath $env:temp\$thumbprint.pfx -Password $pwd -CertStoreLocation "cert:\LocalMachine\Root"
  remove-item -path $env:temp\$thumbprint.pfx
}
$rsaCert = [System.Security.Cryptography.X509Certificates.RSACertificateExtensions]::GetRSAPrivateKey($cert)
$fileName = $rsaCert.key.UniqueName
$path = "$env:ALLUSERSPROFILE\Microsoft\Crypto\Keys\$fileName"
$permissions = Get-Acl -Path $path
$access_rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Network Service", 'Read', 'None', 'None', 'Allow')
$permissions.AddAccessRule($access_rule);Set-Acl -Path $path -AclObject $permissions
write-host "Thumbprint:$Thumbprint";

 

Verander $DNSname en $Subject in de waardes die je wilt gebruiken. Dit script maakt een certificaat aan wat 1000 jaar geldig is, en installeert dan in de trusted Root Certification Authorities (oftewel: de vertrouwde basiscertificeringinstanties). Als het certificaat al bestaat maakt het geen nieuw certificaat aan.

 

Als je heel snel een certificaat wil aanmaken kun je uiteraard ook alleen dit gebruiken:

new-selfsignedcertificate -DnsName localhost -notafter $([datetime]::now.addyears(1000)) -CertStoreLocation "Cert:\LocalMachine\my"