Since the CU12 for Exchange 2019 and the CU23 For Exchange 2016, certificates can no longer simply be requested or imported via the Exchange Admin Center. The reason for this is a change to the CMDLets "New-ExchangeCertificate", "Import-ExchangeCertificate" and "Export-ExchangeCertificate", where it is now possible to no UNC paths can no longer be used. Before CU12 and CU23, it was possible to create a certificate request and import or export an existing certificate directly in the Exchange Admin Center. This is now no longer possible directly in Exchange Admin Center:
![Request and import Exchange certificates via shell](https://www.frankysweb.de/wp-content/uploads/2022/05/image-1024x552.png)
However, a certificate request can easily be created using the Exchange Management Shell, the following command only needs to be adapted to your own environment (the apostrophe is only used as a line break for better readability):
$CSR = New-ExchangeCertificate -Server "SERVERNAME" `
-GenerateRequest `
-FriendlyName "Exchange certificate" `
-PrivateKeyExportable $true `
-SubjectName `
"c=COUNTRYCODE, `
s=FEDERAL COUNTRY, `
l=CITY, `
o=FIRMENNAME, `
ou=ORGANIZATIONAL UNIT, `
cn=ALLGEMEINER_NAME" `
-DomainName `
outlook.frankysweblab.de, `
autodiscover.frankysweblab.de `
$CSR
The command outputs the certificate request (CSR) directly to the shell:
![CSR via Exchange Management Shell](https://www.frankysweb.de/wp-content/uploads/2022/05/image-1.png)
The CSR can now be submitted to a certification authority. As soon as the certificate is available, it can be imported with the following command:
$ImportCert = Import-ExchangeCertificate -FileData ([Byte[]]$(Get-Content -Path c:\Install\certificate.cer -Encoding byte -ReadCount 0))
![Importing a certificate](https://www.frankysweb.de/wp-content/uploads/2022/05/image-2-1024x70.png)
Once the certificate has been imported, the Exchange services can be bound to the certificate using a shell:
Enable-ExchangeCertificate -Thumbprint $ImportCert.Thumbprint -Services POP,IMAP,SMTP,IIS
![Activating the certificate](https://www.frankysweb.de/wp-content/uploads/2022/05/image-3.png)
However, it is still possible to assign Exchange services via the Exchange Admin Center:
![View in the Exchange Admin Center](https://www.frankysweb.de/wp-content/uploads/2022/05/image-4-1024x499.png)
Alternatively, the certificate or a certificate including the private key (PFX file) can be imported via MMC:
![Import and export via MMC](https://www.frankysweb.de/wp-content/uploads/2022/05/image-5.png)
After the import, the Exchange services must be bound to the new certificates. As already mentioned, this is possible via the Exchange Admin Center:
![View in the Exchange Admin Center](https://www.frankysweb.de/wp-content/uploads/2022/05/image-6-1024x503.png)
The export of the certificate including the private key is now only possible via the Exchange Management Shell, here is the new command for the 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
The command for importing a PFX file is as follows:
Import-ExchangeCertificate -FileData ([Byte[]]$(Get-Content -Path c:\Install\cert.pfx -Encoding byte -ReadCount 0)) -Password (convertto-securestring -string "PASSWORD" -asplaintext -force)
![Export and import via shell](https://www.frankysweb.de/wp-content/uploads/2022/05/image-7.png)
Hallo,
ich habe mir mit dem Script einen CSR erzeugt. Das hat funktioniert. Der Zertifikat habe ich auch importieren können, aber Windows/ Exchange ordnet es nicht der offenen Anforderung zu. So habe ich ein Zertifikat im Store, aber ohne den Key.
Wie bekomme ich denn beim Import den Zusammenhang hergestellt?
Klaus
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
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
$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
Erst die Variable befüllen:
$CSR = New-ExchangeCertificate -Ser …
und dann die Variable ausführen mit:
$CSR
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
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
Hallo Sebastian,
wie bist du / Ihr bei dem Anliegen verblieben? Habt ihr ein neues Zertifikat erstellt?
Viele Grüße
HI Christian, ja wir erstellen mittlerweile immer ein neues Zertifikat. PSW will mittlerweile eh immer ein neues CSR.
VG
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!!!!!
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 ;)
Hallo,
wenn ich über WIN-ACME ein Zertifikat anfordere muss ich dann dieses Zertifikat vorher anfordern? Oder reicht das eine Zertifikat aus?
Moin Franky,
wieder ein super Artikel. Hat mir sehr geholfen.
Danke Dir.
LG Peter
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!
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 ;)
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 :(
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
Danke, hatte das gleiche Problem. :)
Danke, das Problerm hatte ich auch. Da soll man drauf kommen. :-)
Super, Danke
$CSR taucht in dem Script gar nicht mehr auf?
Wird das CSR trotzdem in der Schell ausgegeben?
Viele Grüße!
Johannes
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
Hallo Andreas, darf ich fragen wie du das Problem gelöst hast? Für eine Antwort wäre ich Dir sehr dankbar :) VG Aleksandar
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.
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.
Hallo Martin,
nach Anpassung funktioniert das Script auch unter Exchange 2016 CU23 noch.
Siehe:
https://www.frankysweb.de/community/exchange2019/fehler-bei-lets-encrypt-script-nach-installation-auf-cu12/#post-5120
Die Anpassung ist unter 2016 und 2019 identisch.
Grüße
Jens
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.
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.
Hallo, über ECP importieren geht ja nicht mehr, was ist der Workaround ?
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.
Moin Frank, endlich :-) Das wollte ich auch schon länger mal bauen, jetzt gibt es dann schon fertig
Vielen lieben Dank
Thank you Frank, another great article.
Dem schliesse ich mich uneingeschränkt an!
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.
Ach Franky,
Was soll nur einer ohne dich machen?
Super