Let’s Encrypt na Windows Server 2016 – PowerShell a ACMESharp #2 – skript PoC

Rychlá a nedokonalá implementace automatizace vystavování nových Let’s Encrypt certifikátů pro Web Application Proxy na Windows Serveru 2016. Samozřejmě předpokládáme již nakonfigurované prostředí (vault, ověřené domény a definované aliasy pro domény)  – např. podle http://www.jan-zak.cz/lets-encrypt-ws2016-powershell-acmesharp/  🙂

Doporučná perioda vystavování je 60 dnů, takže stačí nastavit Task Scheduler na každé dva měsíce a máme vystaráno (samozřejmě dokud se něco nezmění na straně LE).

####################################################################################################
######## This script generates new Let’s Encrypt certificate (vault has to be already configured)
######## Version 1.0 (2016-12-31), PoC only, no errors handling implmented
######## Jan Zak (www.jan-zak.cz)
####################################################################################################

### Get variables ####
$Path2Module="C:\ACME\ACMESharp\0.8.1\ACMESharp.psd1" #Load module file directly instad of "Import-Module ACMESharp"
$DomainAlias="fscloudtestcz" #Already configured alias in ACME vault
$DomainSANAlias="fscloudtestcz","appcloudtestcz","claimappcloudtestcz" #Already configured aliases in ACME vault
$CertificatePwd="Password123"
$CertificatePwdSecure=ConvertTo-SecureString -String $CertificatePwd -Force -AsPlainText
$WorkDir="C:\ACME\Certificates\"
$Date2Name=Get-Date -Format yyyyMMdd_HHmm
$CertificateAlias="fscloudtestcz_cert_" + $Date2Name
$CertificatePath=$WorkDir + $DomainAlias + "_" + $Date2Name + ".pfx"
$CAName="Let's Encrypt Authority X3" #To identify LE certificates during cean-up phase

### Create and submit request ###
Import-Module $Path2Module
New-ACMECertificate $DomainAlias -Generate -AlternativeIdentifierRefs $DomainSANAlias -Alias $CertificateAlias
Submit-ACMECertificate $CertificateAlias
Update-ACMECertificate $CertificateAlias
Get-ACMECertificate $CertificateAlias -ExportPkcs12 $CertificatePath -CertificatePassword $CertificatePwd

### Import certificate into Win Cert Store, delete expired certificates and source .pfx file
Import-PfxCertificate $CertificatePath -Password $CertificatePwdSecure -CertStoreLocation Cert:\LocalMachine\My\ -Exportable
Remove-Item $CertificatePath -Force
Get-ChildItem Cert:\LocalMachine\My |? Issuer -Like "CN=$CAName*" |? NotAfter -LT (Get-Date) |Remove-Item

### Set new certificate as active (example only!)
$NewCertThumbprint=Get-ChildItem Cert:\LocalMachine\My |? Issuer -like "CN=$CAName*" |? NotBefore -GT ((Get-Date).AddMinutes(-120)) |Select-Object Thumbprint
Set-WebApplicationProxySslCertificate -Thumbprint $NewCertThumbprint.Thumbprint #Optional, configures WebApplicationProxy with a new certificate

 

Let’s Encrypt na Windows Server 2016 – PowerShell a ACMESharp

Po prodeji StartSSL WoSignu jsou jejich certifikáty prozatím nepoužitelné, proto jsem se musel po roce vrátit k prozkoumání aktuálního stavu nasazení Let’s Encrypt na Windows Serveru. Naštěstí už je k dispozici sada commandletů pro PowerShell ACMESharp (aktuálně ve verzi 0.8.1), která překvapivě funguje :).

Níže uvedený postup funguje s PowerShellem v5, ale starší verze by měly fungovat víceméně stejně (s výjimkou komplikovanější instalace z PowerShell Gallery).

1/ Instalace ACMESharpu

Vytvoříme pracovní adresář a stáhneme modul z PowerShell Gallery vč. podpory NuGet:

Naimportujeme modul a koukneme, co umí:

2/ Vytvoření „trezoru“

Nyní je třeba se dobře rozmyslet, jak/zda hodláme automatizovat následné vystavování certifikátů (jsou platné 90 dnů). Pokud je PS spuštěn pod admin účtem, adresář s vaultem se vytvoří v „C:\ProgramData“ a bude použitelná pro všechny. V opačném případě se vault vytovří v uživatelském profilu.

Použitý email se potvrzovat nemusí, ale rozhodně je dobrý nápad použít skutečný a funkční email 🙂

Tady můžete poprvé narazit na chybu serveru:

Poučení – chyby jsou docela časté, nejlepší je zkusit později znovu. Na to je potřeba pamatovat při následné automatizaci. Takže znovu:

Kontrola co máme ve vaultu (zatím nic moc):

3/ Registrace a potvrzení vlastnictví domény

Teď zaregistrovat doménová jména, která hodláte v certifikátech používat, a nastavit jim aliasy. Ty se následně často používají, rozhodně volte rozumná a jednoznačné hodnoty:

Status je „pending“, nyní je potřeba ověřit vlastnictví domény. K dispozici je více možností, mně nejvíce vyhovuje vytvoření TXT záznamů v DNS:

Podle instrukcí vytvořte novou položku v DNS a počkejte na replikaci:

Nyní můžeme odeslat požadavek na kontrolu a schválení:

Počkáme a zkontrolujeme stav:

Pokud máme „valid“, můžeme pokračovat. Jen pro zajímavost, co máme ve vaultu:

4/ Vytvoření a odeslání žádosti o certifikát

Pro vytvoření jednoduchého certifikát s jediným předmětem (CN) stačí např.:

Opět nezapomeňte na rozumné pojmenování certifikátu (alias).

Pro certifikát se SAN/DNS atributy je potřeba zaregistovat (a ověřit) další jména:

Certifikáty (resp. žádosti) si můžete připravit ještě před ověřením vlastnictví domény, s odesláním ale počkejte na úspěšné ověření.

Žádosti ve vaultu jsou prozatím ve sériových čísel a dalších informací:

Odeslání žádosti k podpisu:

Pokus o odeslání žádosti obsahující neověřená DNS jména skončí chybovou hláškou:

Rychlá oprava:

Následné odeslání k podpisu skončí s chybou (již bylo odesláno), ale můžeme podepsání vynutit:

Při výpisu certifikátů je dobré zkontrolovat, zda certifikáty obsahují „IssuerSerialNumber“ a další náležitosti. Pokud ne, je potřeba provést aktualizaci – jinak  nebude možné certifikáty vyexportovat:

Provedeme update a následný export certifikátu do souboru .PFX s heslem:

Export intermediate certifikátu (lze předpokládat občasné změny):

5 /Instalace certifikátu

Konverze hesla a následný import certifikátů a privátních klíců do úložiště Windows:

Kontrola:

..a kontrola obsahu vaultu:

Nyní konečně můžeme nakonfigurovt aplikace a naimportovat certifikáty autorit do úložišť 🙂 Samozřejmě existují i jednodušší postupy (např. pro IIS), nicméně to na serveru nemusí být vždy k dispozici a tento univerzální postup mi přijde nejvhodnější, a vystavování nových certifikátů již naštěstí není tak komplikované.

7/ Automatizace – nástřel skriptu

Velice jednoduchá a chyby neošetřující skript pro vystavení nových certifikátů je k dispozici na Let’s Encrypt na Windows Server 2016 – PowerShell a ACMESharp #2 – skript PoC

Doporučná perioda vystavování je 60 dnů, takže stačí nastavit Task Scheduler na každé dva měsíce a máme vystaráno (samozřejmě dokud se něco nezmění na straně LE).

6/ Textové poznámky

PS C:\Users\jan>md C:\ACME
PS C:\Users\jan> Save-Module -Name ACMESharp -Path C:\ACME\


PS C:\Users\jan> Import-Module "C:\ACME\ACMESharp\0.8.1\ACMESharp.psd1"
PS C:\Users\jan> Get-Command -Module ACMESharp

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Complete-ACMEChallenge                             0.8.1      ACMESharp
Cmdlet          Get-ACMECertificate                                0.8.1      ACMESharp
Cmdlet          Get-ACMEChallengeHandlerProfile                    0.8.1      ACMESharp
Cmdlet          Get-ACMEIdentifier                                 0.8.1      ACMESharp
Cmdlet          Get-ACMEIssuerCertificate                          0.8.1      ACMESharp
Cmdlet          Get-ACMERegistration                               0.8.1      ACMESharp
Cmdlet          Get-ACMEVault                                      0.8.1      ACMESharp
Cmdlet          Get-ACMEVaultProfile                               0.8.1      ACMESharp
Cmdlet          Initialize-ACMEVault                               0.8.1      ACMESharp
Cmdlet          New-ACMECertificate                                0.8.1      ACMESharp
Cmdlet          New-ACMEIdentifier                                 0.8.1      ACMESharp
Cmdlet          New-ACMERegistration                               0.8.1      ACMESharp
Cmdlet          Set-ACMEChallengeHandlerProfile                    0.8.1      ACMESharp
Cmdlet          Set-ACMEProxy                                      0.8.1      ACMESharp
Cmdlet          Set-ACMEServerDirectory                            0.8.1      ACMESharp
Cmdlet          Set-ACMEVault                                      0.8.1      ACMESharp
Cmdlet          Set-ACMEVaultProfile                               0.8.1      ACMESharp
Cmdlet          Submit-ACMECertificate                             0.8.1      ACMESharp
Cmdlet          Submit-ACMEChallenge                               0.8.1      ACMESharp
Cmdlet          Update-ACMECertificate                             0.8.1      ACMESharp
Cmdlet          Update-ACMEIdentifier                              0.8.1      ACMESharp
Cmdlet          Update-ACMERegistration                            0.8.1      ACMESharp


PS C:\Users\jan> Initialize-ACMEVault
PS C:\Users\jan> New-ACMERegistration -Contacts mailto:[email protected] -AcceptTos
New-ACMERegistration : The underlying connection was closed: An unexpected error occurred on a receive.
At line:1 char:1
+ New-ACMERegistration -Contacts mailto:[email protected] -AcceptTos
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [New-ACMERegistration], WebException
    + FullyQualifiedErrorId : System.Net.WebException,ACMESharp.POSH.NewRegistration


PS C:\Users\jan> New-ACMERegistration -Contacts mailto:[email protected] -AcceptTos


Contacts          : {mailto:[email protected]}
PublicKey         : { e = AQAB, kty = RSA, n = pCjY-R0Nx3Vrqz0BQ1a8TdkjqF2WiQolr4xGnKGKlb98mr00u6gA2FRKD5PZZCiLtZuLx5Ao
                    aconZtzYgqesVJ-6KYs_gxJeHSKaVStiGBtggc1bWRybWuO0GtleOGR_3colbPbTjvsISTdn7AihBUrXYwU60WbH5jBSnru_q4C
                    wBZaM7uQgx_EHMQtrJo9SurU0T5FOAnRsACdKA89WaTYEVu1bWBe_sm_vms8vVnuJ6NeIsvfNGFyEfkbOvDcdZwIrBAkLyvmsVp
                    9cAO6LPpPiwb57OcpnML64B3A-fkylXtsCQOKm-pl-zwT8AdgzCHWmEQH30zbVrcFAwDowVw }
RecoveryKey       :
RegistrationUri   : https://acme-v01.api.letsencrypt.org/acme/reg/7838281
Links             : {<https://acme-v01.api.letsencrypt.org/acme/new-authz>;rel="next",
                    <https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf>;rel="terms-of-service"}
TosLinkUri        : https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf
TosAgreementUri   : https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf
AuthorizationsUri :
CertificatesUri   :



PS C:\Users\jan> Get-ACMEVault


Id                          : 669359e0-e314-45d8-bc41-983fdd45b069
Alias                       :
Label                       :
Memo                        :
BaseService                 : LetsEncrypt
BaseUri                     : https://acme-v01.api.letsencrypt.org/
GetInitialDirectory         : True
UseRelativeInitialDirectory : True
ServerDirectory             : {[init, /directory], [directory, /directory], [new-reg, /acme/new-reg], [recover-reg,
                              /recover-reg]...}
Proxy                       :
ProviderProfiles            :
Registrations               : {28ac9424-8783-4aac-b371-83dba26df71a}
Identifiers                 :
Certificates                :
IssuerCertificates          :


PS C:\Users\jan> New-ACMEIdentifier -Dns fs.cloudtest.cz -Alias fscloudtestcz


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : fs.cloudtest.cz
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/TZIDq4qpBqrRJtwUJTotepXecDxW1UriM6nkns4wAb0
Status         : pending
Expires        : 1/5/2017 2:09:04 PM
Challenges     : {, , }
Combinations   : {1, 0, 2}



PS C:\Users\jan> Complete-ACMEChallenge fscloudtestcz -ChallengeType dns-01 -Handler manual
== Manual Challenge Handler - DNS ==
  * Handle Time:      [12/29/2016 3:11:09 PM]
  * Challenge Token:  [s4tfCOOuvyGTYBvs-8hoEkEw5TwMsmIivwqW9mCO44c]
To complete this Challenge please create a new Resource
Record (RR) with the following characteristics:
  * RR Type:  [TXT]
  * RR Name:  [_acme-challenge.fs.cloudtest.cz]
  * RR Value: [M2Ny4esC4wmRslPn3knxW7uW9TdDtUJLW92Pp6Yupsg]
------------------------------------


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : fs.cloudtest.cz
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/TZIDq4qpBqrRJtwUJTotepXecDxW1UriM6nkns4wAb0
Status         : pending
Expires        : 1/5/2017 2:09:04 PM
Challenges     : {, manual, }
Combinations   : {1, 0, 2}



PS C:\Users\jan> nslookup
Default Server:  UnKnown
Address:  10.0.0.4

> server 8.8.8.8
Default Server:  google-public-dns-a.google.com
Address:  8.8.8.8

> set type=txt
> _acme-challenge.fs.cloudtest.cz
Server:  google-public-dns-a.google.com
Address:  8.8.8.8

Non-authoritative answer:
_acme-challenge.fs.cloudtest.cz text =

        "M2Ny4esC4wmRslPn3knxW7uW9TdDtUJLW92Pp6Yupsg"
> exit


PS C:\Users\jan> Submit-ACMEChallenge fscloudtestcz -ChallengeType dns-01


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : fs.cloudtest.cz
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/TZIDq4qpBqrRJtwUJTotepXecDxW1UriM6nkns4wAb0
Status         : pending
Expires        : 1/5/2017 2:09:04 PM
Challenges     : {, manual, }
Combinations   : {1, 0, 2}


PS C:\Users\jan> Get-ACMEVault


Id                          : 669359e0-e314-45d8-bc41-983fdd45b069
Alias                       :
Label                       :
Memo                        :
BaseService                 : LetsEncrypt
BaseUri                     : https://acme-v01.api.letsencrypt.org/
GetInitialDirectory         : True
UseRelativeInitialDirectory : True
ServerDirectory             : {[init, /directory], [directory, /directory], [new-reg, /acme/new-reg], [recover-reg,
                              /recover-reg]...}
Proxy                       :
ProviderProfiles            :
Registrations               : {28ac9424-8783-4aac-b371-83dba26df71a}
Identifiers                 : {9e4d9de0-12d0-4570-9d7e-8cb7ba1faf8d}
Certificates                :
IssuerCertificates          :


PS C:\Users\jan> Update-ACMEIdentifier -IdentifierRef fscloudtestcz


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : fs.cloudtest.cz
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/TZIDq4qpBqrRJtwUJTotepXecDxW1UriM6nkns4wAb0
Status         : valid
Expires        : 2/27/2017 2:18:48 PM
Challenges     : {, , }
Combinations   : {1, 0, 2}



PS C:\Users\jan> Get-ACMEVault


Id                          : 669359e0-e314-45d8-bc41-983fdd45b069
Alias                       :
Label                       :
Memo                        :
BaseService                 : LetsEncrypt
BaseUri                     : https://acme-v01.api.letsencrypt.org/
GetInitialDirectory         : True
UseRelativeInitialDirectory : True
ServerDirectory             : {[init, /directory], [directory, /directory], [new-reg, /acme/new-reg], [recover-reg,
                              /recover-reg]...}
Proxy                       :
ProviderProfiles            :
Registrations               : {28ac9424-8783-4aac-b371-83dba26df71a}
Identifiers                 : {9e4d9de0-12d0-4570-9d7e-8cb7ba1faf8d}
Certificates                :
IssuerCertificates          :



PS C:\Users\jan> New-ACMECertificate fscloudtestcz -Generate -Alias fscloudtestcz_cert_001


Id                       : 8f6880b2-e063-4f9d-aebb-0659387634de
Alias                    : fscloudtestcz_cert_001
Label                    :
Memo                     :
IdentifierRef            : 9e4d9de0-12d0-4570-9d7e-8cb7ba1faf8d
IdentifierDns            : fs.cloudtest.cz
AlternativeIdentifierDns :
KeyPemFile               :
CsrPemFile               :
GenerateDetailsFile      : 8f6880b2-e063-4f9d-aebb-0659387634de-gen.json
CertificateRequest       :
CrtPemFile               :
CrtDerFile               :
IssuerSerialNumber       :
SerialNumber             :
Thumbprint               :
Signature                :
SignatureAlgorithm       :



PS C:\Users\jan> New-ACMEIdentifier -Dns app.cloudtest.cz -Alias appcloudtestcz


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : app.cloudtest.cz
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/bjam1q4eb3BGhvc8vnXvAXz55skiJxTJjel0zgPY3o4
Status         : pending
Expires        : 1/5/2017 2:29:08 PM
Challenges     : {, , }
Combinations   : {1, 2, 0}



PS C:\Users\jan> New-ACMEIdentifier -Dns claimapp.cloudtest.cz -Alias claimappcloudtestcz


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : claimapp.cloudtest.cz
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/2isGaUhjL1D2E2n4Znqa2NYnN-Pwe76GFO2ESNO7VW4
Status         : pending
Expires        : 1/5/2017 2:29:36 PM
Challenges     : {, , }
Combinations   : {0, 2, 1}



PS C:\Users\jan> New-ACMECertificate fscloudtestcz -Generate -AlternativeIdentifierRefs fscloudtestcz,appcloudtestcz,claimappcloudtestcz -Alias fscloudtestcz_cert_002
imappcloudtestcz -Alias

Id                       : 15bb61c0-5956-42eb-b08d-61d781222e6f
Alias                    : fscloudtestcz_cert_002
Label                    :
Memo                     :
IdentifierRef            : 9e4d9de0-12d0-4570-9d7e-8cb7ba1faf8d
IdentifierDns            : fs.cloudtest.cz
AlternativeIdentifierDns : {fs.cloudtest.cz, app.cloudtest.cz, claimapp.cloudtest.cz}
KeyPemFile               :
CsrPemFile               :
GenerateDetailsFile      : 15bb61c0-5956-42eb-b08d-61d781222e6f-gen.json
CertificateRequest       :
CrtPemFile               :
CrtDerFile               :
IssuerSerialNumber       :
SerialNumber             :
Thumbprint               :
Signature                :
SignatureAlgorithm       :



PS C:\Users\jan> Get-ACMECertificate


Seq                : 0
Id                 : 8f6880b2-e063-4f9d-aebb-0659387634de
Alias              : fscloudtestcz_cert_001
Label              :
IdentifierDns      : fs.cloudtest.cz
Thumbprint         :
SerialNumber       :
IssuerSerialNumber :
CertificateRequest :
StatusCode         :

Seq                : 1
Id                 : 15bb61c0-5956-42eb-b08d-61d781222e6f
Alias              : fscloudtestcz_cert_002
Label              :
IdentifierDns      : fs.cloudtest.cz
Thumbprint         :
SerialNumber       :
IssuerSerialNumber :
CertificateRequest :
StatusCode         :


PS C:\Users\jan> Submit-ACMECertificate fscloudtestcz_cert_001


Id                       : 8f6880b2-e063-4f9d-aebb-0659387634de
Alias                    : fscloudtestcz_cert_001
Label                    :
Memo                     :
IdentifierRef            : 9e4d9de0-12d0-4570-9d7e-8cb7ba1faf8d
IdentifierDns            : fs.cloudtest.cz
AlternativeIdentifierDns :
KeyPemFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-key.pem
CsrPemFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-csr.pem
GenerateDetailsFile      : 8f6880b2-e063-4f9d-aebb-0659387634de-gen.json
CertificateRequest       : ACMESharp.CertificateRequest
CrtPemFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-crt.pem
CrtDerFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-crt.der
IssuerSerialNumber       :
SerialNumber             : 031D33EFFA20786E29F1813341C756DD9FB7
Thumbprint               : 85811F8DF23481FAB6E77318339F6DCB1484C542
Signature                : 85811F8DF23481FAB6E77318339F6DCB1484C542
SignatureAlgorithm       : sha256RSA



PS C:\Users\jan> Submit-ACMECertificate fscloudtestcz_cert_002
Submit-ACMECertificate : Error creating new cert :: Authorizations for these names not found or expired: app.cloudtest.cz, claimapp.cloudtest.cz
At line:1 char:1
+ Submit-ACMECertificate fscloudtestcz_cert_002
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (ACMESharp.Vault.Model.CertificateInfo:CertificateInfo) [Submit-ACMECertificate], AcmeWebException
    + FullyQualifiedErrorId : urn:acme:error:unauthorized (403),ACMESharp.POSH.SubmitCertificate
PS C:\Users\jan>
PS C:\Users\jan>
PS C:\Users\jan>
PS C:\Users\jan>
PS C:\Users\jan> New-ACMEIdentifier -Dns app.cloudtest.cz -Alias appcloudtestcz
New-ACMEIdentifier : An item with the same key has already been added.
At line:1 char:1
+ New-ACMEIdentifier -Dns app.cloudtest.cz -Alias appcloudtestcz
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [New-ACMEIdentifier], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException,ACMESharp.POSH.NewIdentifier


PS C:\Users\jan> Complete-ACMEChallenge appcloudtestcz -ChallengeType dns-01 -Handler manual
== Manual Challenge Handler - DNS ==
  * Handle Time:      [12/29/2016 3:38:42 PM]
  * Challenge Token:  [Uhr3rnzeTjCWhUcVeGlubibxK08ORq9xo3WVTB5qo-g]
To complete this Challenge please create a new Resource
Record (RR) with the following characteristics:
  * RR Type:  [TXT]
  * RR Name:  [_acme-challenge.app.cloudtest.cz]
  * RR Value: [bvJ3_DEF7-aA1Bbw-VEiF0F7ok3-OftRTlKXd5TMuFI]
------------------------------------


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : app.cloudtest.cz
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/bjam1q4eb3BGhvc8vnXvAXz55skiJxTJjel0zgPY3o4
Status         : pending
Expires        : 1/5/2017 2:29:08 PM
Challenges     : {, , manual}
Combinations   : {1, 2, 0}



PS C:\Users\jan> Complete-ACMEChallenge claimappcloudtestcz -ChallengeType dns-01 -Handler manual
== Manual Challenge Handler - DNS ==
  * Handle Time:      [12/29/2016 3:39:53 PM]
  * Challenge Token:  [ArmYtFaYeIgNGKihe8wqPeBmJHD8EkglAarXNOhqgko]
To complete this Challenge please create a new Resource
Record (RR) with the following characteristics:
  * RR Type:  [TXT]
  * RR Name:  [_acme-challenge.claimapp.cloudtest.cz]
  * RR Value: [vtkZ1MmJtJ9UkWVizGL5ZcVajjJq8zJ_PfkIyHoK37k]
------------------------------------


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : claimapp.cloudtest.cz
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/2isGaUhjL1D2E2n4Znqa2NYnN-Pwe76GFO2ESNO7VW4
Status         : pending
Expires        : 1/5/2017 2:29:36 PM
Challenges     : {, manual, }
Combinations   : {0, 2, 1}



PS C:\Users\jan> Submit-ACMEChallenge appcloudtestcz -ChallengeType dns-01


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : app.cloudtest.cz
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/bjam1q4eb3BGhvc8vnXvAXz55skiJxTJjel0zgPY3o4
Status         : pending
Expires        : 1/5/2017 2:29:08 PM
Challenges     : {, , manual}
Combinations   : {1, 2, 0}



PS C:\Users\jan> Submit-ACMEChallenge claimappcloudtestcz -ChallengeType dns-01


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : claimapp.cloudtest.cz
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/2isGaUhjL1D2E2n4Znqa2NYnN-Pwe76GFO2ESNO7VW4
Status         : pending
Expires        : 1/5/2017 2:29:36 PM
Challenges     : {, manual, }
Combinations   : {0, 2, 1}



PS C:\Users\jan> Update-ACMEIdentifier

cmdlet Update-ACMEIdentifier at command pipeline position 1
Supply values for the following parameters:
IdentifierRef: appcloudtestcz


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : app.cloudtest.cz
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/bjam1q4eb3BGhvc8vnXvAXz55skiJxTJjel0zgPY3o4
Status         : valid
Expires        : 2/27/2017 2:41:07 PM
Challenges     : {, , }
Combinations   : {1, 2, 0}



PS C:\Users\jan> Update-ACMEIdentifier

cmdlet Update-ACMEIdentifier at command pipeline position 1
Supply values for the following parameters:
IdentifierRef: claimappcloudtestcz


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : claimapp.cloudtest.cz
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/2isGaUhjL1D2E2n4Znqa2NYnN-Pwe76GFO2ESNO7VW4
Status         : valid
Expires        : 2/27/2017 2:41:23 PM
Challenges     : {, , }
Combinations   : {0, 2, 1}



PS C:\Users\jan> Submit-ACMECertificate fscloudtestcz_cert_002
Submit-ACMECertificate : asset file already exists
At line:1 char:1
+ Submit-ACMECertificate fscloudtestcz_cert_002
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Submit-ACMECertificate], IOException
    + FullyQualifiedErrorId : System.IO.IOException,ACMESharp.POSH.SubmitCertificate

PS C:\Users\jan> Submit-ACMECertificate fscloudtestcz_cert_002 -Force


Id                       : 15bb61c0-5956-42eb-b08d-61d781222e6f
Alias                    : fscloudtestcz_cert_002
Label                    :
Memo                     :
IdentifierRef            : 9e4d9de0-12d0-4570-9d7e-8cb7ba1faf8d
IdentifierDns            : fs.cloudtest.cz
AlternativeIdentifierDns : {fs.cloudtest.cz, app.cloudtest.cz, claimapp.cloudtest.cz}
KeyPemFile               : 15bb61c0-5956-42eb-b08d-61d781222e6f-key.pem
CsrPemFile               : 15bb61c0-5956-42eb-b08d-61d781222e6f-csr.pem
GenerateDetailsFile      : 15bb61c0-5956-42eb-b08d-61d781222e6f-gen.json
CertificateRequest       : ACMESharp.CertificateRequest
CrtPemFile               : 15bb61c0-5956-42eb-b08d-61d781222e6f-crt.pem
CrtDerFile               : 15bb61c0-5956-42eb-b08d-61d781222e6f-crt.der
IssuerSerialNumber       :
SerialNumber             : 031BAC84FF368C8624E968188EE1460B5342
Thumbprint               : 75092862288073D8CBD439427E8EFEAD9E7CFEC4
Signature                : 75092862288073D8CBD439427E8EFEAD9E7CFEC4
SignatureAlgorithm       : sha256RSA



PS C:\Users\jan> Get-ACMECertificate


Seq                : 0
Id                 : 8f6880b2-e063-4f9d-aebb-0659387634de
Alias              : fscloudtestcz_cert_001
Label              :
IdentifierDns      : fs.cloudtest.cz
Thumbprint         : 85811F8DF23481FAB6E77318339F6DCB1484C542
SerialNumber       : 031D33EFFA20786E29F1813341C756DD9FB7
IssuerSerialNumber :
CertificateRequest : ACMESharp.CertificateRequest
StatusCode         : Created

Seq                : 1
Id                 : 15bb61c0-5956-42eb-b08d-61d781222e6f
Alias              : fscloudtestcz_cert_002
Label              :
IdentifierDns      : fs.cloudtest.cz
Thumbprint         : 75092862288073D8CBD439427E8EFEAD9E7CFEC4
SerialNumber       : 031BAC84FF368C8624E968188EE1460B5342
IssuerSerialNumber :
CertificateRequest : ACMESharp.CertificateRequest
StatusCode         : Created


PS C:\Users\jan> Get-ACMECertificate fscloudtestcz_cert_001 -ExportPkcs12 "C:\ACME\fscloudtestcz_cert_001.pfx" -CertificatePassword 'Password123'
Get-ACMECertificate : Cannot export PKCS12; Issuer certificate hasn't been resolved
At line:1 char:1
+ Get-ACMECertificate fscloudtestcz_cert_001 -ExportPkcs12 "C:\ACME\fsc ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Get-ACMECertificate], InvalidOperationException
    + FullyQualifiedErrorId : System.InvalidOperationException,ACMESharp.POSH.GetCertificate


PS C:\Users\jan> Update-ACMECertificate fscloudtestcz_cert_001


Id                       : 8f6880b2-e063-4f9d-aebb-0659387634de
Alias                    : fscloudtestcz_cert_001
Label                    :
Memo                     :
IdentifierRef            : 9e4d9de0-12d0-4570-9d7e-8cb7ba1faf8d
IdentifierDns            : fs.cloudtest.cz
AlternativeIdentifierDns :
KeyPemFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-key.pem
CsrPemFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-csr.pem
GenerateDetailsFile      : 8f6880b2-e063-4f9d-aebb-0659387634de-gen.json
CertificateRequest       : ACMESharp.CertificateRequest
CrtPemFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-crt.pem
CrtDerFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-crt.der
IssuerSerialNumber       : 0A0141420000015385736A0B85ECA708
SerialNumber             : 031D33EFFA20786E29F1813341C756DD9FB7
Thumbprint               : 85811F8DF23481FAB6E77318339F6DCB1484C542
Signature                : 85811F8DF23481FAB6E77318339F6DCB1484C542
SignatureAlgorithm       : sha256RSA



PS C:\Users\jan> Get-ACMECertificate fscloudtestcz_cert_001 -ExportPkcs12 "C:\ACME\fscloudtestcz_cert_001.pfx" -CertificatePassword 'Password123'


Id                       : 8f6880b2-e063-4f9d-aebb-0659387634de
Alias                    : fscloudtestcz_cert_001
Label                    :
Memo                     :
IdentifierRef            : 9e4d9de0-12d0-4570-9d7e-8cb7ba1faf8d
IdentifierDns            : fs.cloudtest.cz
AlternativeIdentifierDns :
KeyPemFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-key.pem
CsrPemFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-csr.pem
GenerateDetailsFile      : 8f6880b2-e063-4f9d-aebb-0659387634de-gen.json
CertificateRequest       : ACMESharp.CertificateRequest
CrtPemFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-crt.pem
CrtDerFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-crt.der
IssuerSerialNumber       : 0A0141420000015385736A0B85ECA708
SerialNumber             : 031D33EFFA20786E29F1813341C756DD9FB7
Thumbprint               : 85811F8DF23481FAB6E77318339F6DCB1484C542
Signature                : 85811F8DF23481FAB6E77318339F6DCB1484C542
SignatureAlgorithm       : sha256RSA



PS C:\Users\jan> Update-ACMECertificate fscloudtestcz_cert_002


Id                       : 15bb61c0-5956-42eb-b08d-61d781222e6f
Alias                    : fscloudtestcz_cert_002
Label                    :
Memo                     :
IdentifierRef            : 9e4d9de0-12d0-4570-9d7e-8cb7ba1faf8d
IdentifierDns            : fs.cloudtest.cz
AlternativeIdentifierDns : {fs.cloudtest.cz, app.cloudtest.cz, claimapp.cloudtest.cz}
KeyPemFile               : 15bb61c0-5956-42eb-b08d-61d781222e6f-key.pem
CsrPemFile               : 15bb61c0-5956-42eb-b08d-61d781222e6f-csr.pem
GenerateDetailsFile      : 15bb61c0-5956-42eb-b08d-61d781222e6f-gen.json
CertificateRequest       : ACMESharp.CertificateRequest
CrtPemFile               : 15bb61c0-5956-42eb-b08d-61d781222e6f-crt.pem
CrtDerFile               : 15bb61c0-5956-42eb-b08d-61d781222e6f-crt.der
IssuerSerialNumber       : 0A0141420000015385736A0B85ECA708
SerialNumber             : 031BAC84FF368C8624E968188EE1460B5342
Thumbprint               : 75092862288073D8CBD439427E8EFEAD9E7CFEC4
Signature                : 75092862288073D8CBD439427E8EFEAD9E7CFEC4
SignatureAlgorithm       : sha256RSA



PS C:\Users\jan> Get-ACMECertificate fscloudtestcz_cert_002 -ExportPkcs12 "C:\ACME\fscloudtestcz_cert_002.pfx" -CertificatePassword 'Password123'


Id                       : 15bb61c0-5956-42eb-b08d-61d781222e6f
Alias                    : fscloudtestcz_cert_002
Label                    :
Memo                     :
IdentifierRef            : 9e4d9de0-12d0-4570-9d7e-8cb7ba1faf8d
IdentifierDns            : fs.cloudtest.cz
AlternativeIdentifierDns : {fs.cloudtest.cz, app.cloudtest.cz, claimapp.cloudtest.cz}
KeyPemFile               : 15bb61c0-5956-42eb-b08d-61d781222e6f-key.pem
CsrPemFile               : 15bb61c0-5956-42eb-b08d-61d781222e6f-csr.pem
GenerateDetailsFile      : 15bb61c0-5956-42eb-b08d-61d781222e6f-gen.json
CertificateRequest       : ACMESharp.CertificateRequest
CrtPemFile               : 15bb61c0-5956-42eb-b08d-61d781222e6f-crt.pem
CrtDerFile               : 15bb61c0-5956-42eb-b08d-61d781222e6f-crt.der
IssuerSerialNumber       : 0A0141420000015385736A0B85ECA708
SerialNumber             : 031BAC84FF368C8624E968188EE1460B5342
Thumbprint               : 75092862288073D8CBD439427E8EFEAD9E7CFEC4
Signature                : 75092862288073D8CBD439427E8EFEAD9E7CFEC4
SignatureAlgorithm       : sha256RSA


PS C:\Users\jan> Get-ACMECertificate fscloudtestcz_cert_001 -ExportIssuerPEM "C:\ACME\LE.cer"


Id                       : 8f6880b2-e063-4f9d-aebb-0659387634de
Alias                    : fscloudtestcz_cert_001
Label                    :
Memo                     :
IdentifierRef            : 9e4d9de0-12d0-4570-9d7e-8cb7ba1faf8d
IdentifierDns            : fs.cloudtest.cz
AlternativeIdentifierDns :
KeyPemFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-key.pem
CsrPemFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-csr.pem
GenerateDetailsFile      : 8f6880b2-e063-4f9d-aebb-0659387634de-gen.json
CertificateRequest       : ACMESharp.CertificateRequest
CrtPemFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-crt.pem
CrtDerFile               : 8f6880b2-e063-4f9d-aebb-0659387634de-crt.der
IssuerSerialNumber       : 0A0141420000015385736A0B85ECA708
SerialNumber             : 031D33EFFA20786E29F1813341C756DD9FB7
Thumbprint               : 85811F8DF23481FAB6E77318339F6DCB1484C542
Signature                : 85811F8DF23481FAB6E77318339F6DCB1484C542
SignatureAlgorithm       : sha256RSA



PS C:\Users\jan> dir C:\ACME\


    Directory: C:\ACME


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       12/29/2016   2:51 PM                ACMESharp
-a----       12/29/2016   3:55 PM           4105 fscloudtestcz_cert_001.pfx
-a----       12/29/2016   3:57 PM           4145 fscloudtestcz_cert_002.pfx
-a----       12/29/2016   4:01 PM           1647 LE.cer


PS C:\Users\jan> $pwd=ConvertTo-SecureString -String 'Password123' -Force -AsPlainText
PS C:\Users\jan> Import-PfxCertificate "C:\ACME\fscloudtestcz_cert_001.pfx" -Password $pwd -CertStoreLocation Cert:\LocalMachine\My\ -Exportable


   PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\My

Thumbprint                                Subject
----------                                -------
85811F8DF23481FAB6E77318339F6DCB1484C542  CN=fs.cloudtest.cz


PS C:\Users\jan> Import-PfxCertificate "C:\ACME\fscloudtestcz_cert_002.pfx" -Password $pwd -CertStoreLocation Cert:\LocalMachine\My\ -Exportable


   PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\My

Thumbprint                                Subject
----------                                -------
75092862288073D8CBD439427E8EFEAD9E7CFEC4  CN=fs.cloudtest.cz


PS C:\Users\jan> ls Cert:\LocalMachine\My\ |? subject -eq "CN=fs.cloudtest.cz" |ft subject,issuer,thumbprint

Subject            Issuer                                               Thumbprint
-------            ------                                               ----------
CN=fs.cloudtest.cz CN=Let's Encrypt Authority X3, O=Let's Encrypt, C=US 85811F8DF23481FAB6E77318339F6DCB1484C542
CN=fs.cloudtest.cz CN=Let's Encrypt Authority X3, O=Let's Encrypt, C=US 75092862288073D8CBD439427E8EFEAD9E7CFEC4
CN=fs.cloudtest.cz CN=Cloudtest ……                                      338B33BAA7897E65A53FA4DB11ED837EFB64CAC3


PS C:\Users\jan> Get-ACMECertificate


Seq                : 0
Id                 : 8f6880b2-e063-4f9d-aebb-0659387634de
Alias              : fscloudtestcz_cert_001
Label              :
IdentifierDns      : fs.cloudtest.cz
Thumbprint         : 85811F8DF23481FAB6E77318339F6DCB1484C542
SerialNumber       : 031D33EFFA20786E29F1813341C756DD9FB7
IssuerSerialNumber : 0A0141420000015385736A0B85ECA708
CertificateRequest : ACMESharp.CertificateRequest
StatusCode         : OK

Seq                : 1
Id                 : 15bb61c0-5956-42eb-b08d-61d781222e6f
Alias              : fscloudtestcz_cert_002
Label              :
IdentifierDns      : fs.cloudtest.cz
Thumbprint         : 75092862288073D8CBD439427E8EFEAD9E7CFEC4
SerialNumber       : 031BAC84FF368C8624E968188EE1460B5342
IssuerSerialNumber : 0A0141420000015385736A0B85ECA708
CertificateRequest : ACMESharp.CertificateRequest
StatusCode         : OK



PS C:\Users\jan> Get-ACMEVault


Id                          : 669359e0-e314-45d8-bc41-983fdd45b069
Alias                       :
Label                       :
Memo                        :
BaseService                 : LetsEncrypt
BaseUri                     : https://acme-v01.api.letsencrypt.org/
GetInitialDirectory         : True
UseRelativeInitialDirectory : True
ServerDirectory             : {[init, /directory], [directory, /directory], [new-reg, /acme/new-reg], [recover-reg, /recover-reg]...}
Proxy                       :
ProviderProfiles            :
Registrations               : {28ac9424-8783-4aac-b371-83dba26df71a}
Identifiers                 : {9e4d9de0-12d0-4570-9d7e-8cb7ba1faf8d, fa963db9-bb76-4c87-9d48-1835a91ad0ad, cf637189-fd1a-4a39-9a9c-7910048179b2}
Certificates                : {8f6880b2-e063-4f9d-aebb-0659387634de, 15bb61c0-5956-42eb-b08d-61d781222e6f}
IssuerCertificates          : {[0A0141420000015385736A0B85ECA708, ACMESharp.Vault.Model.IssuerCertificateInfo]}

7/ Odkazy

https://github.com/ebekker/ACMESharp/wiki/Quick-Start

https://www.powershellgallery.com/packages/ACMESharp/0.8.1

ADFS 4 (2016) není schopen přidat nebo aktualizovat RPT z metadat

Taková škaredá chyba v GUI ADFS serveru 2016 – v posledních buildech nelze aktualizovat RPT z metadat, a dokonce není možné vytvořit nový RPT.
Veškeré pokusy končí chybyou „An error occured during an attempt to read the federation metadata. Verify that specified URL or host name is valid federation metadata endpoint.“
2016-11-27_10-44-46

Naštěstí je možné použít např. Add-AdfsRelyingPartyTrust nebo Update-AdfsRelyingPartyTrust:

2016-11-27_10-44-46_01

Tak snad nám to soudruzi z Redmondu brzy opraví.