Exchange Zertifikate per Shell anfordern und importieren

Seit dem CU12 für Exchange 2019 und dem CU23 für Exchange 2016 können Zertifikate nicht mehr einfach via Exchange Admin Center angefordert oder importiert werden. Hintergrund ist eine Änderung an den CMDLets „New-ExchangeCertificate“, „Import-ExchangeCertificate“ und „Export-ExchangeCertificate“, hier können nun keine UNC Pfade mehr verwendet werden. Im Exchange Admin Center gab es vor CU12 und CU23 die Möglichkeit direkt eine Zertifikatsanforderung zu erstellen und vorhandenes Zertifikat zu importieren oder zu exportieren. Dies ist nun nicht mehr direkt in Exchange Admin Center möglich:

Exchange Zertifikate per Shell anfordern und importieren

Eine Zertifikatsanforderung lässt sich aber einfach per Exchange Management Shell erstellen, der folgende Befehl muss dazu nur an die eigene Umgebung angepasst werden (Das Hochkomma dient nur dem Zeilenumbruch zur besseren Lesbarkeit):

$CSR = New-ExchangeCertificate -Server "SERVERNAME" `
-GenerateRequest `
-FriendlyName "Exchange Zertifikat" `
-PrivateKeyExportable $true `
-SubjectName `
"c=LÄNDERCODE, `
s=BUNDESLAND, `
l=STADT, `
o=FIRMENNAME, `
ou=ORGANISATIONSEINHEIT, `
cn=ALLGEMEINER_NAME" `
-DomainName `
outlook.frankysweblab.de, `
autodiscover.frankysweblab.de `
$CSR

Der Befehl gibt euch die Zertifikatsanforderung (CSR) direkt auf der Shell aus:

CSR via Exchange Management Shell

Der CSR kann nun bei einer Zertifizierungsstelle eingereicht werden. Sobald das Zertifikat vorliegt, kann es mit dem folgenden Befehl importiert werden:

$ImportCert = Import-ExchangeCertificate -FileData ([Byte[]]$(Get-Content -Path c:\Install\certificate.cer -Encoding byte -ReadCount 0))
Import eines Zertifikats

Nach dem Import des Zertifikats können noch die Exchange Dienste per Shell an das Zertifikat gebunden werden:

Enable-ExchangeCertificate -Thumbprint $ImportCert.Thumbprint -Services POP,IMAP,SMTP,IIS
Aktivieren des Zertifikats

Das Zuweisen der Exchange Dienste ist allerdings nach wie vor auch noch über das Exchange Admin Center möglich:

Ansicht im Exchange Admin Center

Alternativ lässt sich das Zertifikat oder auch ein Zertifikat inklusive des Privaten Schlüssels (PFX Datei) via MMC importieren:

Import und Export via MMC

Nach dem Import müssen die Exchange Dienste an das neue Zertifikate gebunden werden. Wie bereits erwähnt, ist dies per Exchange Admin Center möglich:

Ansicht im Exchange Admin Center

Der Export des Zertifikats inkl. des privaten Schlüssels ist nun auch nur noch via Exchange Management Shell möglich, hier der neue Befehl für den Export:

Get-ExchangeCertificate
$ExportCert = Export-ExchangeCertificate -Thumbprint 85AB0C0D042CA2A406A3C35DCB85FD2D99EC5B92 -BinaryEncoded -Password (convertto-securestring -string "PASSWORD" -asplaintext -force)
Set-Content -Path c:\Install\Cert.pfx -Value $ExportCert.FileData -Encoding byte

Der Befehl für den Import einer PFX Datei lautet wie folgt:

Import-ExchangeCertificate -FileData ([Byte[]]$(Get-Content -Path c:\Install\cert.pfx -Encoding byte -ReadCount 0)) -Password (convertto-securestring -string "PASSWORD" -asplaintext -force)
Export und Import via Shell

35 Gedanken zu „Exchange Zertifikate per Shell anfordern und importieren“

  1. Hallo Zusammen,
    ich bin wirklich am Verzweifeln mit der Anforderung. Die Anleitung ist toll, aber irgendwie bekomme ich es einfach nicht hin eine Datei zu generieren. Habe einen Exchange Server 2016.
    Die Anforderung habe ich wie beschrieben in der Exchange Management Shell eingegeben. Nach dem Aufruf will er immer ein SMTP Standardzertifikat überschreiben bzw. fragt danach. Ich habe da mal danach geschaut im EAC und es ist ein selbstsigniertes Zertifikat, welches aber überhaupt nicht den CN trägt den ich in der Anforderung eingegeben habe. Auch wenn ich es überschreiben möchte, erscheint eine große Liste mit Fehlermeldungen, was er alles nicht finden kann. Gleich nach der Anforderung erscheint die Meldung: „Dieses Zertifikat wird nicht für externe TLS-Verbindungen mit einem FQDN von „Mein Server Name“ verwendet, weil das von der CA signierte Zertifikat mit dem Fingerabdruck „….“ den Vorrang übernimmt. Die folgenden Connectors stimmen mit dem betreffenden FQDN überein: …..

    Vielleicht weiß hier jemand Rat oder hatte was ähnliches. Ich bin echt am Ende und sehr traurig das die Funktionen über das EAC nicht mehr geht. Warum muss es so kompliziert sein, oder ich bin einfach zu blöd dazu. Mache das ja nicht jeden Tag. Grüße Markus

    Antworten
  2. Hallo,

    ich habe deine anleitung befolgt und es gibt mir folgende Fehlerrmldung. Hast dui hierzu eine Lösung?

    Es wurde kein Positionsparameter gefunden, der das Argument „$null“ akzeptiert.
    + CategoryInfo : InvalidArgument: (:) [New-ExchangeCertificate], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,New-ExchangeCertificate
    + PSComputerName : ex2019.domaene.local

    Antworten
    • $CSR = New-ExchangeCertificate -Server „EX2019“ -GenerateRequest -FriendlyName „Exchange Zertifikat Freitan“ -PrivateKeyExportable $true -SubjectName „c=DE, s=Rheinland Pfalz, l=Kelsterbach, o=Firma GmbH, ou=IT, cn=Hans“ -DomainName remote.domaene.de, autodiscover.domaene.de $CSR

      Antworten
  3. Hallo,

    ich bin völlig am verzweifeln! Ich habe alles nach Anleitung erledigt. Nun will ich das neue Zertifikat hinzufügen, was auch ohne Fehlermeldung klappt.

    ABER

    im Admin Center steht das „neue“ Zertifikat noch auf „Ausstehende Anferderung“. Will ich per PS die Dienste zuweisen kommt immer folgende Fehlermeldung:

    Das Argument kann nicht an den Parameter „Thundprint“ gebunden werden, da es sich um eine leere Zeichenfolge handelt.

    Ich wäre für einen Tipp SEHR dankbar!

    Mfg

    Christian

    Antworten
  4. Moin,

    habt ihr schon mal eine automatische Verlängerung bei Zertifikaten gehabt? Bei PSW z.B. kann man ein Cert für 3 Jahre kaufen und bekommt jedes Jahr automatisch ein neues crt. Hier kann man wählen ob man ein neues CSR einreicht (mit einem neuen key) oder wenn man nichts einreicht, er einfach den alten CSR (vom alten Key) nimmt. Kann man das einfach ohne erneutes CSR durchlaufen lassen und nur das neue CRT importieren (und er nimmt automatisch den alten privat Key) mit:

    $ImportCert = Import-ExchangeCertificate -FileData ([Byte[]]$(Get-Content -Path c:\Install\certificate.cer -Encoding byte -ReadCount 0))

    Oder muss man immer ein neues „Zertifikat“ sprich einen privaten Key mit CSR erzeugen? Danke und VG

    Antworten
  5. Hallo Franky!

    Vielen lieben Dank für Deine Anleitung!
    Ich bin sehr gut durch Deine Anleitung durchgekommen und verstehe bis heute nicht warum das immer alles so kompliziert sein muß.
    Dir einen lieben Dank und alles Gute bis nächstes Jahr, wenn es wieder heißt Zertifikat läuft bald aus……..(leider behalte ich das nicht und mache es echt zu selten)

    Vielen DANK!!!!!

    Antworten
  6. bei Wildcardzertifikat musste bei uns der Domain-Eintrag entfallen:

    New-ExchangeCertificate -GenerateRequest -FriendlyName „Exchange Zertifikat“ -PrivateKeyExportable $true -SubjectName „C=LÄNDERCODE, S=BUNDESLAND, L=STADT, O=FIRMENNAME, OU=ORGANISATIONSEINHEIT, CN=*.ALLGEMEINER_NAME.com“ -Server „SERVERNAME“

    Und: ein „+“ im Firmennamen funzt übrigens net ;)

    Antworten
  7. Hallo zusammen

    Danke für den wertvollen Beitrag, leider erhalte auch ich die Meldung:
    + CategoryInfo : InvalidArgument: (:) [New-ExchangeCertificate], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,New-ExchangeCertificate
    + PSComputerName : Exchangeserver

    Was machen wir falsch?
    Danke für Eure Tipps!

    Antworten
    • Hi, ich hatte gerade das selbe Problem, der Fehler sollte folgender sein:

      Am Ende der letztenZeile, im Beispiel: „autodiscover.frankysweblab.de `“ ist das „`“ drin. Das Zeichen muss entfernt werden, da er sonst den $CSR versucht als Variable einzufügen, die laut Ausgabe $NULL hat, da nichts vorhanden ist. Wird „`“ entfernt dann gilt es als neuer Seperater Befehl.

      Liebe Grüße Haggi

      P.s. Hab selber 20 Minuten gesucht ;)

      Antworten
  8. servus
    erstmal DANKE für deine TIPPS nur leider klappt das bei meinem ersten ex 2016 NICHT, ich bekomme diese meldung:
    Es wurde kein Positionsparameter gefunden, der das Argument „$null“ akzeptiert.
    + CategoryInfo : InvalidArgument: (:) [New-ExchangeCertificate], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,New-ExchangeCertificate
    + PSComputerName : ex16..local

    jmd nen tipp ?
    danke
    ps: WAS denkt sich MS eigentlich nur dabei :(

    Antworten
    • Hallo Stefan

      Ich habe es herausgefunden. Ich musste den ersten Befehl an den Schluss nehmen, dann hat es funktioniert. Ich habe mir den Befehl in eine Zeile gepackt. Das sieht dann so aus:
      New-ExchangeCertificate -GenerateRequest -FriendlyName „Exchange Zertifikat“ -PrivateKeyExportable $true -SubjectName „C=LÄNDERCODE, S=BUNDESLAND, L=STADT, O=FIRMENNAME, OU=ORGANISATIONSEINHEIT, CN=ALLGEMEINER_NAME“ -DomainName outlook.frankysweblab.de, autodiscover.frankysweblab.de -Server „SERVERNAME“

      Gruss aus Der Schweiz
      Thomas

      Antworten
  9. Hallo,
    vielleicht hat ja jemand eine Idee. Wir haben zwei Exchangeserver mit 2016 CU23 am laufen.
    Nun sollte das Zertifikat ausgetauscht werden. Auf dem einen Server hat es wunderbar geklappt. Auf dem zweiten ebenfalls, bis auf die Tatsache, das wir dort auf Teufel komm raus den SMTP Dienst nicht aktivieren können. Im EAC wird nur der IIS Diens als zugewiesen angezeigt.
    Wir haben den SMTP Dienst per Shell zugewiesen (keine Fehlermeldung) das gleiche über den EAC. Aber er wird nicht als zugewiesen angezeigt.
    Ich wäre Dankbar für eine Idee.

    Grüße Andreas

    Antworten
      • Sebastian
        6. Mai 2022 um 08:08 Uhr
        Hallo,

        das machen wir z.B. schon immer so. Daher ein kleiner Hinweis, welchen ich und Kollegen bei einigen Kunden beobachtet hatten. Wenn ihr das Zert. am Ende per PowerShell zuweist, überprüft bitte im Anschluss, ob die Zuweisung für alle Dienste wirklich fkt. hat. Es gibt einen Bug (auch in einigen Foren bekannt), dass er das Zert. nicht dem SMTP Dienst zuordnet, erst letzte Woche wieder gehabt. Lösung war bisher, das Zert. zu löschen, dieses per ECP hochladen und dann fkt. auch die Zuweisung zum SMTP Dienst. Es war auch nicht möglich, dass Zert. was vorher da war, per ECP für SMTP zu aktivieren. Das witzige am Ende, es ist am Ende immer das gleiche Zert. Also wie gesagt, nun mehrfach schon beobachtet, sollte jemand den Fall mal haben.

        Antworten
  10. Hallo,
    weiß jemand, ob das LetsEncrypt Scripts (das alte CertificateAssistant_v3_EX2016.ps1) nach der Installation von Exchange 2016 CU23 noch funktioniert? Falls nicht, funktioniert das win-acme.v2 mit CU23?
    Vielen Dank.

    Antworten
  11. Hallo,

    das machen wir z.B. schon immer so. Daher ein kleiner Hinweis, welchen ich und Kollegen bei einigen Kunden beobachtet hatten. Wenn ihr das Zert. am Ende per PowerShell zuweist, überprüft bitte im Anschluss, ob die Zuweisung für alle Dienste wirklich fkt. hat. Es gibt einen Bug (auch in einigen Foren bekannt), dass er das Zert. nicht dem SMTP Dienst zuordnet, erst letzte Woche wieder gehabt. Lösung war bisher, das Zert. zu löschen, dieses per ECP hochladen und dann fkt. auch die Zuweisung zum SMTP Dienst. Es war auch nicht möglich, dass Zert. was vorher da war, per ECP für SMTP zu aktivieren. Das witzige am Ende, es ist am Ende immer das gleiche Zert. Also wie gesagt, nun mehrfach schon beobachtet, sollte jemand den Fall mal haben.

    Antworten
    • Das wollte ich gerade beim Überfliegen des Artikels anmerken. Habe das auch schon mehrfach so erlebt, nur über die ECP importiert lies es sich dann binden.

      Antworten
        • Die Lösung/Workaround würde mich auch mal interessieren, weil erst heute wieder gehabt so einen Fall..Es ging nicht per powershell.Erst das manuelle importieren per ECP und dann dort die Zuweisung des SMTP Dienst. Daher wurde auch noch nicht auf das neue CU Update geupdated..

    • Hi,

      ich habe es validiert, die Lösung ist:

      Import-ExchangeCertificate -FileData ([Byte[]]$(Get-Content -Path c:\Install\cert.pfx -Encoding byte -ReadCount 0)) -Password (convertto-securestring -string „PASSWORD“ -asplaintext -force)

      Und dann per ECP den SMTP einfach zuweisen. Fazit, eigentlich die gleiche Lösung wie früher über die ECP, nur das man nun per PS das Zert. hochlädt. Somit konnte ich auch ohne Probleme den SMTP Dienst an das Wildcard Zert. binden.

      Antworten
  12. Das habe ich auch in den letzten Tagen festgestellt, es gab eine Fehlermeldung bei –RequestFile
    Bei mir ging es um eine Verlängerung eines Zertifikats, analog sollte es ähnlich sein bei einer Neuerstellung.

    1. Get-ExchangeCertificate | where {$_.Status -eq „Valid“ -and $_.IsSelfSigned -eq $false} | Format-List FriendlyName,Subject,CertificateDomains,Thumbprint,NotBefore,NotAfter
    Thumbprint merken

    $txtrequest = Get-ExchangeCertificate -Thumbprint | New-ExchangeCertificate -GenerateRequest
    zum Überprüfen: $txtrequest eingeben

    Nachfolgendes in einer Zeilen eingeben und abschicken:

    [System.IO.File]::WriteAllBytes(‚\\exchangeserver2\C$\temp\Zertifikat\zertifikat.csr.req‘ [System.Text.Encoding]::Unicode.GetBytes($txtrequest))

    jetzt hat man die Zertifikatsdatei im entsprechenden Pfad erstellt.

    Antworten

Schreibe einen Kommentar