• Startseite
  • Blog
  • Schreiben von Ereignis-Plugin-Handlern für das Certificate Management System (CMS)

Schreiben von Ereignis-Plugin-Handlern für das Certificate Management System (CMS)

Das Certificate Management System (CMS), das früher als Certificate Reporting Tool (CRT) bekannt war und auf das im Folgenden verwiesen wird, bietet einer bestehenden Public Key Infrastructure (PKI) Berichts- und Benachrichtigungsfunktionen. Die Berichte und Benachrichtigungen lassen sich in Bezug auf Inhalt, Zeitpunkt und Zielgruppe in hohem Maße anpassen. Darüber hinaus können benutzerdefinierte "Event-Plugin-Handler" erstellt und registriert werden, um beim Auftreten vordefinierter Ereignisse jede gewünschte Funktion auszuführen. Es gibt zwei Arten von CRT-Ereignissen:

  • Erstellter Hinweis: Wird ausgelöst, wenn ein Zertifikat die vordefinierten Kriterien gemäß der zugehörigen Zertifikatsvorlage und dem Lebenszyklus-Meilenstein erfüllt.
  • Pending Certificate Alert Generated: wird ausgelöst, wenn ein Zertifikatsantrag von der Zertifizierungsstelle als ausstehend markiert wurde.

Beispiele für Funktionen, die über CRT-Ereignishandler implementiert werden könnten, sind:

  • Programmatische Ermittlung eines E-Mail-Kontakts: Nehmen wir an, dass alle ausgestellten Webserver-Zertifikate, die irgendwo im Betreff "OU=finance" enthalten, Benachrichtigungen an [email protected] zustellen sollen. Der Handler könnte nach dieser Zeichenfolge suchen - vielleicht sogar nach einem bestimmten Empfänger - und sie ändern.
  • Suche nach einer Kontakt-E-Mail aus einer anderen Quelle: Angenommen, die E-Mail-Kontaktinformationen sind in einer anderen Datenbank gespeichert. Der Handler könnte (zum Beispiel) die Seriennummer des Zertifikats als Suchschlüssel verwenden, um den zugehörigen E-Mail-Kontakt zu finden.
  • Erneuerung des Zertifikats: Lassen Sie zu, dass die E-Mail-Benachrichtigung gesendet wird, aber rufen Sie eine Funktion auf, die das Zertifikat erneuert. Dies könnte besonders auf Nicht-Windows-Plattformen oder in Situationen nützlich sein, in denen die automatische Registrierung nicht automatisch erfolgt.
  • Automatisches Genehmigen eines ausstehenden Zertifikatsantrags: Ein benutzerdefinierter Workflow kann ausgelöst werden, um den Antrag zu analysieren und ihn gemäß den Geschäftsregeln zu genehmigen oder abzulehnen.

Wenn ein Plugin-Handler definiert und mit einer Meldung oder einer ausstehenden Zertifikatsanforderung verknüpft ist, wird er aufgerufen, wenn eine Meldung für ein Zertifikat oder eine Anforderung generiert wird. Handler können mit CRT über das CRT Configuration Utility registriert werden. Die Architektur erlaubt es, mehrere Handler zu registrieren und mit einer oder mehreren Benachrichtigungen oder Warnungen für ausstehende Zertifikate zu verknüpfen. Wenn eine E-Mail gesendet werden soll, wird das Plugin unmittelbar vor der Weiterleitung der eigentlichen E-Mail an den Server aufgerufen.

Ein konzeptioneller Aufbau des CRT ist in Abbildung 1 unten dargestellt. Beachten Sie die Komponente "Benutzerdefiniertes Plugin", die rot hervorgehoben ist. Obwohl sich das Diagramm auf eine Unternehmensdatenbank bezieht, dient dies nur zur Veranschaulichung. Active Directory (AD), eine Workflow-Engine oder eine andere Einheit könnte ersetzt werden.

Abbildung 1 - CRT-Konzeptlayout

Beispiel Code

Die CRT-Engine ist eine verwaltete dynamische Link-Bibliothek (dll), und dieses Beispiel ist in C#.NET geschrieben, aber jede verwaltete Sprache kann problemlos verwendet werden. Die grundlegenden Schritte zum Einrichten eines Visual Studio-Projekts sind:

  1. Wenn die Entwicklung auf einem entfernten Entwicklungsrechner mit einer ServerBetriebssystem
    1. Installieren Sie das CRT-Produkt auf dem Entwicklungsrechner
    2. Wenn die Entwicklung auf einem entfernten Entwicklungsrechner mit einer KundeBetriebssystem
      1. Kopieren Sie die "CSS.CRT.Core.dll" auf den Entwicklungscomputer
      2. Erstellen Sie ein neues Visual Studio-Projekt mit der Vorlage "Klassenbibliothek".
        1. Umbenennen von 'Klasse1' in 'SampleNoticeHandler'.
        2. Hinzufügen eines Verweises auf das Projekt
          1. Navigieren Sie zu dem Verzeichnis, das die CRT-DLLs enthält
          2. Wählen Sie die "CSS.CRT.Core.dll" aus.
          3. Implementierung der Schnittstelle 'ICRTNoticeHandler'.

public class SampleNoticeHandler : CSS.CRT.Core.ICRTNoticeHandler

  1. Implementierung der Methoden der Schnittstelle 'ICRTNoticeHandler'.
    1. NoticeCallback_Email - Diese Methode wird aufgerufen, wenn eine Benachrichtigung generiert wird und das System so eingestellt ist, dass eine E-Mail gesendet wird. Diese Methode wird für jeden Empfänger der Benachrichtigungs-E-Mail aufgerufen.

i. string Betreff - Ursprünglicher Betreff der E-Mail-Nachricht

ii. string Message - Originaltext der E-Mail-Nachricht

iii. string Recipient - Empfänger der Benachrichtigungs-E-Mail

iv. out string newSubject - Betreff der E-Mail-Nachricht nach der Verarbeitung. Dieser Wert muss innerhalb der Methode gesetzt werden, auch wenn er nicht geändert wird. Wenn er nicht aktualisiert wird, kann er auf den ursprünglichen Wert des Betreffs gesetzt werden.

v. out string newMessage - Text der E-Mail-Nachricht nach der Verarbeitung. Dieser Wert muss innerhalb der Methode gesetzt werden, auch wenn er nicht geändert wird. Wenn er nicht aktualisiert wird, kann er auf den ursprünglichen Textwert gesetzt werden.

vi. out string newRecipient - E-Mail-Empfänger nach der Verarbeitung. Dieser Wert muss innerhalb der Methode gesetzt werden, auch wenn er nicht geändert wird. Wenn er nicht aktualisiert wird, kann er auf den ursprünglichen Empfängerwert gesetzt werden.

vii. bool [Rückgabewert] - Setzen Sie diesen Wert auf "true", wenn die Meldung noch von CRT gesendet werden soll, oder auf "false", wenn sie nicht gesendet werden soll.

[sourcecode language=”csharp”]
public bool NoticeCallback_Email(string Subject, string Message, string Recipient,
out string newSubject, out string newMessage, out string newRecipient)
{
// for this example, copy over the message and recipient, but change the subject line.
newSubject = Subject + ” – Modifed by example code”;

// the message is not modified, so set it to the original value
newMessage = Message;

// the recipient is not modified, so set it to the original value
newRecipient = Recipient;

// return ‘true’ so the email will still be sent; if custom actions are to be taken INSTEAD of
// sending an email, we would return ‘false’.
return true;
}
[/sourcecode]

  1. NoticeCallback_NoEmail - Diese Methode wird nur vom CRT-Befehlszeilenprogramm aufgerufen, und auch nur dann, wenn die Option "/noemail" in der Zeile command angegeben wurde. Diese Methode wird einmal mit der vollständigen Liste der Empfänger aufgerufen.

i. string Betreff - Ursprünglicher Betreff der E-Mail-Nachricht

ii. string Message - Originaltext der E-Mail-Nachricht

iii. string RecipientList - Liste der E-Mail-Empfänger der Benachrichtigung

iv. out string newSubject - Betreff der E-Mail-Nachricht nach der Verarbeitung. Dieser Wert muss innerhalb der Methode gesetzt werden, auch wenn er nicht geändert wird. Wenn er nicht aktualisiert wird, kann er auf den ursprünglichen Wert des Betreffs gesetzt werden.

v. out string newMessage - Text der E-Mail-Nachricht nach der Verarbeitung. Dieser Wert muss innerhalb der Methode gesetzt werden, auch wenn er nicht geändert wird. Wenn er nicht aktualisiert wird, kann er auf den ursprünglichen Textwert gesetzt werden.

vi. out string newRecipientList - Liste der E-Mail-Empfänger nach der Verarbeitung. Dieser Wert muss innerhalb der Methode gesetzt werden, auch wenn er nicht geändert wird. Wenn er nicht aktualisiert wird, kann er auf den ursprünglichen Empfängerwert gesetzt werden.

[sourcecode language=”csharp”]
public void NoticeCallback_NoEmail(string Subject, string Message, string RecipientList,
out string newSubject, out string newMessage, out string newRecipientList)
{
// for this example, copy over the message and recipient list, but change the subject // line.
newSubject = Subject + ” – Modifed by example code”;

// the message is not modified, so set it to the original value
newMessage = Message;

// the recipient list is not modified, so set it to the original value
newRecipientList = RecipientList;
}
[/sourcecode]

  1. Kompilieren Sie das Projekt
  2. Kopieren Sie die resultierende .dll auf einen Server, auf dem CRT läuft
  3. Aktualisieren Sie die Datei crtcommandline.exe.config, um den neuen Handler zu verwenden
    1. Setzen Sie den Wert 'EmailNoticePlugin' auf den Pfad des Handlers
    2. Führen Sie das CRT-Kommandozeilenprogramm mit Einstellungen aus, die eine E-Mail erzeugen
      1. Überprüfen Sie, ob die Betreffzeile der E-Mail den Text "Geändert durch Beispielcode" enthält.
      2. Führen Sie das CRT-Kommandozeilenprogramm mit Einstellungen aus, die keine E-Mail generieren, sondern eine Textdatei ausgeben
        1. Überprüfen Sie, ob die Betreffzeile des Ergebnisses den Text "Geändert durch Beispielcode" enthält.

Das obige Beispiel bezieht sich auf CRT-Benachrichtigungen. Das Verfahren für die Implementierung von Pending Certificate Alerts-Ereignissen ist das gleiche. Implementieren Sie einfach die Methoden PendingCertAlertCallback_Email und PendingCertAlertCallback_NoEmail.

Schlussfolgerung

Die Plugin-Schnittstelle des CRT Notice Handlers bietet die Flexibilität, nahezu jede Aufgabe während der Erstellung einer Zertifikatsmitteilung oder eines Alerts für ausstehende Anträge auszuführen, und ermöglicht eine robuste Interaktion mit anderen Back-End-Systemen.