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:jon[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