
SQL Server Integration Services heeft een mogelijkheid om packages te signen. Ik wist dat die mogelijkheid er was en heel globaal waar hij voor dient, maar ik had nog nooit geprobeerd of het ook echt werkt, en hoe. Ik was kennelijk niet de enige, want er is op het web ook nauwelijks informatie over te vinden. Ook grappig: in de MCTS Exam 70-445 Training Kit staan wel geteld 4 regels over deze mogelijkheid waaronder een voorbeeld van het gebruik van de dtutil command line utility om een package te signen. Iedereen die dat voorbeeld probeert uit te voeren, merkt al snel dat het niet werkt… Tijd voor wat meer diepgang dus!
Het belangrijkste wat je nodig hebt om een SSIS package te signen, staat netjes in BOL: een certificaat "… issued by a trusted certificate authority and you can only use certificates that were created for the purpose of code signing". De vetgedrukte en onderstreepte woorden zijn de sleutels tot succes. Hoe kom je nu een aan certificaat van een trusted certificate authority, zonder meteen bij VeriSign aan te kloppen? De forums wijzen je naar tools als makecert, waar je op zich wel code signed certificaten mee kunt maken, maar wat ik ook probeerde, ik kreeg het certificaat niet te zien in de SSIS Digital Signing dialoog. Volgens mij omdat de certificaten die je met dit soort tools maakt, niet van een trusted certificate authority afkomstig zijn.
Je hebt dus een trusted certificate authority nodig en gelukkig is het in Windows Server 2003 niet zo moeilijk die zelf op te richten. Kijk maar op http://www.isaserver.org/img/upl/vpnkitbeta2/installstandaloneca.htm waar beschreven wordt hoe je een stand-alone Certificate Authority (CA) kunt installeren op een Windows Server 2003 computer.
Hierna kun je eenvoudig een code signing certificaat aanvragen tbv. SSIS signing via de CA web interface: ga naar https://localhost/certsrv, klik op Request a certificate, kies Advanced certificate request, en kies Create and submit a request to this CA. Vul wat Identifying Information in, Type of Certificate Needed: Code Signing Certificate, Submit, Yes.
Je hebt nu een request gedaan die door de CA nog ingewilligd moet worden. Gelukkig ben je dat nu zelf, dus je gaat naar Start | All Programs | Administrative Tools | Certification Authority. Open de CA en klik op Pending Requests. Klik met rechts op het uitstaande verzoek om een certificaat, kies voor All Tasks en dan Issue.
Ga nu om het certificaat te installeren terug naar https://localhost/certsrv en kies View the status of a pending certificate request. Klik vervolgens op de link van het aangevraagde certificaat.
Klik vervolgens op Install this certificate en in de Potential Scripting Violation dialoog op Yes. Check vervolgens of het certificaat correct is geïnstalleerd door naar Start te gaan en vervolgens op Run… te klikken en dan certmgr.msc in te tikken. Het nieuwe certificaat moet nu onder Personal | Certificates staan met als Intended Purpose Code Signing.
Als je nu in een SSIS package in het SSIS menu voor Digital Signing kiest en vervolgens op Sign… klikt, wordt het geïnstalleerde certificaat in de Select Certificate dialoog getoond.
Als je hierna naar de code kijkt van het package (in Solution Explorer rechter muisklik op het package, dan View Code) zie je dat de code nog steeds leesbaar is maar dat er bovenin wat tags zijn toegevoegd aangaande het signen.
Als je nu buiten de SSIS designer om, bijv. met Notepad, een wijziging aanbrengt in het package en je opent het package nierna opnieuw in BIDS, dan krijg je een foutmelding:
En dat is precies waarom je dit zou doen. Packages onbruikbaar maken wanneer onbevoegden er mee hebben geknoeid. Overigens krijg je deze melding niet standaard wanneer je een package uitvoert met de Execute Package Utility.
Als je hem daar ook wilt krijgen, moet je eerst op de Verification page de optie Execute only signed packages aanvinken.
Via een registry setting (zie http://www.databasejournal.com/features/mssql/article.php/3620766) kun je afdwingen dat dit default gedrag wordt. Als je binnen BIDS wijzigingen aanbrengt in het package, wordt het package kennelijk automatisch opnieuw gesigned bij het opslaan.
Wat gebeurt er nu wanneer je een signed package probeert uit te voeren op een andere machine?
SSIS ziet dan dat de signature goed is, maar dat de signer niet bekend is. Als je netjes het certificaat exporteert op de machine waarop je het package hebt gesigned en importeert op de andere machine, is dit ‘probleem' opgelost. Vergeet niet dat je ook het certificaat van de Certificate Authority moet importeren als deze op de andere machine niet bekend is als trusted certificate authority.