Eine gute API macht den Unterschied zwischen einer software Anwendung und einer software Plattform aus. Ohne eine API ist ein software Produkt ein Spezialwerkzeug für eine vordefinierte Reihe von spezifischen Operationen. Mit einer guten API kann es jedoch zu einer leistungsstarken, modularen Plattform werden, deren Fähigkeiten weit über das hinausgehen, was sich die Entwickler ursprünglich vorgestellt haben.
Aufgaben, die sonst Tausende von Klicks und Tastenanschlägen erfordern, können auf einen einzigen Tastendruck zum Starten eines Skripts reduziert werden. Und Geschäftsprozesse, die mehrere software Anwendungen erfordern, können nahtlos integriert werden, so dass die Endbenutzer nicht einmal wissen müssen, welche software verwendet wird. All dies trifft auf CMS zu, und mit der Einführung von CMS 5.0 und dem CMS PowerShell SDK sind die API-basierten Funktionen von CMS leistungsfähiger als je zuvor und einfacher zu nutzen!
Bereitstellung von digitalen Zertifikaten
Stellen Sie sich das folgende Szenario vor: Ein Dutzend Mitarbeiter kommt von einem anderen Standort zu Ihrem Entwicklungsteam. Sie verfügen bereits über Workstations, aber nicht über die Client-Zertifikate, die für den Zugriff auf Ihr Quellcode-Repository erforderlich sind.
Haben Sie:
- Lassen Sie Ihren Systemadministrator zu jeder Arbeitsstation gehen, ein Zertifikat beantragen und es installieren.
- Weisen Sie alle Mitarbeiter an, das CMS-Registrierungsportal zu besuchen und ein Zertifikat anzufordern, die Anträge zu genehmigen und die Mitarbeiter anzuweisen, sie an der richtigen Stelle zu installieren.
- Führen Sie ein 15-zeiliges PowerShell-Skript aus, das die Computer der Benutzer findet, für jeden ein Zertifikat abruft und das Zertifikat automatisch über den CMS-Windows-Agenten in den entsprechenden Computerspeicher überträgt.
In den ersten beiden Fällen ist eine Koordinierung zwischen mehr als einem Dutzend Personen erforderlich. Und nicht nur das: Diese Optionen helfen nicht, wenn das nächste Dutzend Mitarbeiter an Bord kommt. Mit einer API-basierten Lösung können Sie jedoch einen automatisierten, wiederholbaren Prozess mit einem kurzen, einfachen PowerShell-Skript entwickeln. Ein Skript, dem es egal ist, ob es ein Dutzend Zertifikate für neue Mitarbeiter oder zehntausend Zertifikate für die gesamte Organisation ausstellt. Ein solches Skript ist am Ende dieses Beitrags als "Skript 1" dargestellt. Wenn Sie das Skript außerdem von einem anderen Teil Ihres Onboarding- und Provisioning-Prozesses aus starten können, haben Sie jetzt eine Zero-Touch-Lösung für die Ausstellung von Zertifikaten, wann immer Sie sie benötigen.
Verwaltung digitaler Zertifikate
CMS kann auch beim umgekehrten Szenario helfen. Angenommen, eine Gruppe von Mitarbeitern verlässt eine Abteilung. Die Mitarbeiter hatten alle persönliche Zertifikate sowie Zertifikate auf ihren Arbeitsstationen und anderen Geräten, um auf eine Vielzahl von gruppenspezifischen Anwendungen zuzugreifen. Sie möchten alle Zertifikate, auf die diese Mitarbeiter Zugriff haben, sofort widerrufen.
Haben Sie:
- Lassen Sie Ihre Systemadministratoren ihre Rechner auf installierte Zertifikate überprüfen, die Zertifizierungsstellen auf ausgestellte Zertifikate überprüfen, diese widerrufen und hoffen, dass Sie alle gefunden haben.
- Verwenden Sie das CMS Management Portal, um die Mitarbeiter und Arbeitsplätze zu durchsuchen, nach Zertifikaten zu suchen, die für sie ausgestellt wurden oder auf ihren Geräten vorhanden sind, und sie manuell zu widerrufen.
- Führen Sie ein 15-zeiliges PowerShell-Skript aus, das Ihr Zertifikatsinventar nach allen Zertifikaten durchsucht, die für diese Benutzer ausgestellt wurden oder sich auf ihrer Workstation befinden, und alle Zertifikate automatisch widerruft.
Auch hier ermöglichen einige wenige Zeilen Skripting die schnelle, konsistente und gründliche Ausführung zeitkritischer Vorgänge, ohne Rücksicht darauf, wie viele Benutzer und Rechner betroffen sind oder wann und wie oft sie ausgeführt werden. Ein Beispielskript hierfür finden Sie ebenfalls am Ende unter dem Titel "Skript 2".
Diese API ist auch keineswegs auf Änderungen an der Belegschaft beschränkt. In Szenarien, in denen virtuelle Maschinen für software -Tests oder andere Fälle, in denen eine Sandbox-Umgebung benötigt wird, dynamisch hochgefahren werden, kann das PowerShell-SDK beim Start genutzt werden, um alle für die Anwendungen benötigten Zertifikate bereitzustellen. Webserver mit auslaufenden Zertifikaten können ohne Zutun des Personals automatisch ein öffentliches/privates Schlüsselpaar generieren und dieses verwenden, um ein neues Zertifikat mit demselben Inhalt anzufordern, um den weiteren Serverbetrieb zu gewährleisten. Eine Migration von Zertifikaten von veralteten kryptografischen Algorithmen (oder schlimmer noch, von einer kompromittierten Zertifizierungsstelle) zu neueren und sichereren Algorithmen (z. B. von SHA-1 zu SHA-2) lässt sich leicht und in großem Maßstab orchestrieren.
Sichere Anwendungsentwicklung mit APIs
Während das PowerShell SDK bei vielen Problemen in der Systemadministration und in DevOps-Szenarien helfen kann, gibt es natürlich auch Szenarien, in denen PowerShell Scripting nicht das beste Werkzeug ist. Für software Entwickler, die die Verwendung von Zertifikaten in ihrer Anwendung hinzufügen oder verbessern möchten, oder für Administratoren, die in einer Umgebung arbeiten, in der PowerShell nicht unterstützt wird, kann die CMS-Web-API von großem Nutzen sein. Beispielsweise kann eine Webanwendung auf alle Funktionen zugreifen, die das PowerShell-SDK bietet, indem sie AJAX-Anforderungen von JavaScript aus stellt. In ähnlicher Weise können software Entwickler, die Anwendungen in Java oder anderen gängigen Sprachen schreiben, dieselben APIs nutzen. Eine unter Linux ausgeführte Anwendung kann über ein Python-Skript oder ein anderes System, das HTTP-Anforderungen generieren kann, auf die APIs zugreifen, sodass Linux-Server mit auslaufenden Zertifikaten oder im Rahmen einer SHA-1-zu-SHA-2-Migration weiterhin neue Zertifikate mit geräteinterner Schlüsselgenerierung erhalten können. Ebenso können die PowerShell-Skripte, die das SDK aus den früheren Szenarien verwenden, in jeder anderen Sprache implementiert werden, indem die Web-API anstelle des SDKs verwendet wird.
Eine weitere Funktion von CMS, für die die Web-API und das PowerShell SDK andere Funktionen erheblich erweitern, sind die Zertifikats-Metadaten. In ein Zertifikat können zwar viele Informationen aufgenommen werden, aber es gibt keine Möglichkeit, diese Daten zu ändern, sobald das Zertifikat ausgestellt und kryptografisch signiert ist. Mit Metadaten versehene Zertifikate können Szenarien abdecken, in denen sich die zugehörigen Daten während der Lebensdauer eines Zertifikats ändern können. Dazu gehören Informationen, die die Person oder Gruppe beschreiben, die das Zertifikat besitzt, die Anwendungen, die davon abhängen, das Datum, an dem es erneuert werden sollte, zukünftige Migrationspläne oder andere Inhalte, die entweder Änderungen unterliegen oder zum Zeitpunkt der Ausstellung nicht bekannt sind. Dieses Metadaten-Tagging-System kann auch verwendet werden, um den Zugriff auf andere Anwendungen dynamisch nach Standort, Tageszeit oder anderen Kriterien zu aktivieren und zu deaktivieren. Ein Beispiel-Python-Skript wird am Ende als "Skript 3" zur Verfügung gestellt, das programmatisch überprüft, ob ein Zertifikat (in base64-PEM-Kodierung) aktiviert ist.
Mit unseren Tools wie dem CMS VerdeTTo Access Valve können Sie diese erweiterten Authentifizierungsmechanismen auf der Ebene der Serverplattform hinzufügen, ohne Ihren Backend-Code zu ändern. Im zweiten obigen Szenario könnten die Zertifikate für die ausscheidenden Mitarbeiter vorübergehend deaktiviert werden, anstatt sie durch Aktualisierung eines Metadatenwerts ganz zu widerrufen. Dies würde bedeuten, dass, wenn sich herausstellt, dass die Deaktivierung eines Zertifikats Auswirkungen auf andere Benutzer oder Systeme hat, dieses Zertifikat von Fall zu Fall vorübergehend wieder aktiviert werden könnte, bis ein Ersatzzertifikat ausgestellt werden kann. Und nicht nur das: Mit der Web-API-Methode "Renew" oder dem entsprechenden PowerShell-Cmdlet können diese Zertifikate schnell erneuert und automatisch an allen Standorten installiert werden, an denen sie noch benötigt werden. In all diesen und vielen anderen Fällen bietet die CMS-Web-API die einfachste Möglichkeit, wiederholbare, zuverlässige Prozesse zu implementieren und dabei Zeit zu sparen und Risiken zu minimieren.
Skript 1: PowerShell für die automatische Zertifikatsregistrierung und -installation auf den Computern der Zielbenutzer.
Param ([pscredential]$cred, [string]$UsersFile, [string]$APISecret) # CMS client general configuration $APIApp = New-CMSEnrollmentContext -Key "607616a3fc0b7c749d27" - Secret $APISecret # List the accounts of users who need certificates $Users = Get-Content -Path ]$UsersFile # Get the list of machines in the environment $Computers = Get-ADComputer -Filter {(enabled -eq "true")} $Computers = $Computers | Select-Object -ExpandProperty DnsHostName # Find the computers used by the employees who need certificates ForEach($Computer in $Computers){ $Profiles = Get-WmiObject -Class Win32_UserProfile -Computer $Computer ForEach($Profile in $Profiles){ $profileSID = New-Object System.Security.Principal.SecurityIdentifier($Profile.sid) $username = $profileSID.Translate([System.Security.Principal.NTAccount]).value if($Users.Contains($username)){ # This is a machine that needs a new cert # Define a certificate store $store = Add-CMSCertificateStore -ClientMachine $Computer -CertificateStoreType "IIS Personal" -StorePath "IIS Personal" -Password (ConvertTo-SecureString "password" -AsPlainText -force) -AgentName Dev1.dev.cms -CMSUri https://localhost/CMSAPI -Credential $cred # Request a certificate as a PFX $pfx = New-CMSPfxEnrollment -ApiEnrollmentContext $APIApp -TemplateName "UserServer" -PfxPassword $password -SubjectName "CN=$username" -CMSUri https://localhost/CMSAPI -Credential $cred # Schedule the new PFX to be added to the new store. Add-CMSCertificateStoreCert -CertificateStore $store -PFX $pfx.Pkcs12Blob -PfxPassword $password -HasEntryPassword $FALSE -Overwrite $TRUE -Alias "sourceControlCert" -CMSUri https://localhost/CMSAPI -Credential $cred } } }
|
Skript 2: PowerShell für den automatischen Zertifikatsentzug für Zielbenutzer und deren Computer.
Param ([pscredential]$cred, [string]$UsersFile, [string]$MachinesFile) # List the accounts of users with certificates to be revoked $Users = Get-Content -Path $UsersFile # Find certificates issued to any of these users and revoke them ForEach($User in $Users){ $certs = Search-CMSCertificate -Query ("CN -contains ""$User""") -CMSUri https://localhost/CMSAPI -Credential $cred ForEach($cert in $certs){ Revoke-CMSCertificate -Info $cert -Comment "Cessation of operation" -Reason 5 -CMSUri https://localhost/CMSAPI -Credential $cred } } # Get the list of machines (by hostname) used by these employees $Machines = Get-Content -Path $MachinesFile # Find certificates present on any of these machines and revoke them ForEach($Machine in $Machines){ $stores = Show-CMSCertificateStores -CMSUri https://localhost/CMSAPI -Credential $cred | Where-Object {$_.ClientMachine -eq $Machine} ForEach($store in $stores){ $inventory = Get-CMSCertificateStoreInventory -CertificateStore $store -CMSUri https://localhost/CMSAPI -Credential $cred $certIds = $inventory | Select-Object -ExpandProperty Certificates | Select-Object -ExpandProperty CertificateId Foreach ($certId in $certIds){ Revoke-CMSCertificate -CMSID $certId -Comment "Cessation of operation" -Reason 5 -CMSUri https://localhost/CMSAPI -Credential $cred }
|
Skript 3: Python, das die CMS-Web-API verwendet, um auf der Grundlage eines Metadatenwerts festzustellen, ob ein Zertifikat aktiviert ist.
<td”>
import base64 # For encoding credentials import json # For decoding http response import urllib2 # For http request from cryptography import x509 from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes # Sends an HTTP request and returns the response def getResponse(endpoint, data, credentials): request = urllib2.Request(endpoint) request.add_header("Authorization","Basic " + base64.b64encode(credentials)) request.add_header("Content-Type", "application/json") request.add_data(data) return urllib2.urlopen(request).read() # Returns whether or not the certificate is enabled via CMS Web API. # Uses the certificate thumbprint to identify the cert to the metadata API. def checkAccessEnabled(PEM_cert, credentials): certificate = x509.load_pem_x509_certificate(PEM_cert, default_backend()) thumbprint = certificate.fingerprint(hashes.SHA1()).encode("hex") endpoint = "https://localhost/CMSAPI/Metadata/2/Compare" data = '{"Key" : "Thumbprint", "Thumbprint" : "'+thumbprint+'","metadatalist" : {"isEnabled" : "True"}}' return json.loads(getResponse(endpoint, data, credentials))