Teruhiro Komaki's Blog (Temporary)

Windows ServerでLet's EncryptのDNS認証を試みて失敗した話

以前、FileMaker ServerにLet’s EncryptのSSL証明書を設定するというブログを書きました。

ブログを書いている時は、HTTPでの認証が一般的だろう程度でやっていました。

しかし、もっと簡単にできるはずだ!と思いググってみた。

更新

2019-02-02

以下の記事を書きましたので、よろしければご覧ください。

legoを使ってLet’s EncryptのSSL証明書をDNS認証で発行しFileMaker Serverに設定する方法


DNSのTXTレコードを設定すれば、DNS認証ができると分かったので、せっかくなのでチャレンジしてみた。

結果的には途中で諦めて、DebianでDNS認証をしちゃいましたが、Windows環境で色々と模索したので、メモを残しておきます。

win-acmeでDNS認証を試みる

GitHubのWikiを確認する

こういうときは、Wiki Homeを見ましょう。

win-acmeは、DNS認証は対応しているとのこと。

CLIツールレベルで対応しているのは、Azure DNS validationだけのようです。

その他のDNSを使っている場合は、**自分でスクリプトを書いて指定してね。**ということみたい。

DNS認証時に利用するスクリプト

スクリプトについて、具体的にどのように記述して指定するのかをググってみた。

このリンクの方が、具体的なコードを書いてくれていました。

https://github.com/PKISharp/win-acme/issues/817#issuecomment-381164264

 1I created scripts to do this that work on server 2012.
 2As my server is behind a firewall this turned out to be the wrong method to use, but you may find them useful.
 3Replace DNSServer with the name of your DNSserver and repeat that line if you have more than one server.
 4Replace YourZoneName with your domain name.
 5
 6create-dns.bat:
 7powershell -file ./create-dns.ps1 %1 %2 %3
 8
 9create-dns.ps1:
10Import-module dnsserver
11Add-DnsServerResourceRecord -Name $args[1] -Computername DNSServer-TXT -ZoneName "YourZoneName" -DescriptiveText $args[2]
12
13delete-dns.bat:
14powershell -file ./delete-dns.ps1 %1 %2
15
16delete-dns.ps1:
17Import-module dnsserver
18Remove-DnsServerResourceRecord -Force -Computername DNSServer-ZoneName "YourZoneName" -RRType "Txt" -Name $args[1]

DNSサーバーを追加

Windows ServerにDNSサーバーを追加しました。

実行してみた時のログ

  1 [INFO] A Simple ACME Client for Windows (WACS)
  2 [INFO] Software version 1911.2.6726.40690 (RELEASE)
  3 [INFO] IIS version 10.0
  4 [INFO] ACME server https://acme-v01.api.letsencrypt.org/
  5 [INFO] Please report issues at https://github.com/PKISharp/win-acme
  6
  7 N: Create new certificate
  8 M: Create new certificate with advanced options
  9 L: List scheduled renewals
 10 R: Renew scheduled
 11 S: Renew specific
 12 A: Renew *all*
 13 V: Revoke certificate
 14 C: Cancel scheduled renewal
 15 X: Cancel *all* scheduled renewals
 16 Q: Quit
 17
 18 Please choose from the menu: m
 19
 20 [INFO] Running in Advanced mode
 21
 22 1: Single binding of an IIS site
 23 2: SAN certificate for all bindings of an IIS site
 24 3: SAN certificate for all bindings of multiple IIS sites
 25 4: Manually input host names
 26 C: Cancel
 27
 28 Which kind of certificate would you like to create?: 4
 29
 30 Enter comma-separated list of host names, starting with the primary one: hoge2.frudens.app
 31
 32 [INFO] Plugin Manual generated target [Manual] [1 binding - hoge2.frudens.app]
 33
 34 1: [dns-01] Azure DNS
 35 2: [dns-01] Run external program/script to create and update records
 36 3: [http-01] Save file on local (network) path
 37 4: [http-01] Self-host verification files (recommended)
 38 5: [http-01] Upload verification file to FTP(S) server
 39 6: [http-01] Upload verification file to WebDav path
 40 C: Cancel
 41
 42 How would you like to validate this certificate?: 2
 43
 44 Path to script that creates DNS records. Parameters passed are the hostname, record name and token: scripts\create-dns.bat
 45
 46 Path to script that deletes DNS records. Parameters passed are the hostname and record name: scripts\delete-dns.bat
 47
 48 1: Create or update ftps bindings in IIS
 49 2: Create or update https bindings in IIS
 50 3: Do not run any installation steps
 51 4: Run a custom script
 52 C: Cancel
 53
 54 Which installer should run for the certificate?: 3
 55
 56 [INFO] Authorize identifier: hoge2.frudens.app
 57 [INFO] Authorizing hoge2.frudens.app using dns-01 validation (DnsScript)
 58 [INFO] Script scripts\create-dns.bat starting with parameters hoge2.frudens.app _acme-challenge.hoge2.frudens.app hw6PTBqElAV9MUhPjNVavDu948jnQ1PGLDeilb6kVnU [INFO]
 59C:\Users\teruhirokomaki\Desktop\win-acme.v1.9.11.2>powershell.exe -ExecutionPolicy RemoteSigned -File .\scripts\create-dns.ps1 hoge2.frudens.app _acme-challenge.hoge2.frudens.app hw6PTBqElAV9MUhPjNVavDu948jnQ1PGLDeilb6kVnU
 60
 61 [WARN] Script execution timed out after 5 minutes, will keep running in the background
 62 [INFO] Answer should now be available at _acme-challenge.hoge2.frudens.app
 63 [INFO] Script scripts\delete-dns.bat starting with parameters hoge2.frudens.app _acme-challenge.hoge2.frudens.app
 64 [EROR] Script error: Remove-DnsServerResourceRecord : Failed to get the zone information for hoge2.frudens.app on server DNSServer-ZoneName.
 65 [EROR] Script error: At C:\Users\teruhirokomaki\Desktop\win-acme.v1.9.11.2\scripts\delete-dns.ps1:2 char:1
 66 [EROR] Script error: + Remove-DnsServerResourceRecord -Force -Computername DNSServer-ZoneNam ...
 67 [EROR] Script error: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 68 [EROR] Script error:     + CategoryInfo          : NotSpecified: (_acme-challenge.hoge2.frudens.app:root/Microsoft/...rResourceRecord) [Rem
 69 [EROR] Script error:    ove-DnsServerResourceRecord], CimException
 70 [EROR] Script error:     + FullyQualifiedErrorId : WIN32 1722,Remove-DnsServerResourceRecord
 71 [INFO]
 72C:\Users\teruhirokomaki\Desktop\win-acme.v1.9.11.2>powershell.exe -ExecutionPolicy RemoteSigned -File .\scripts\delete-dns.ps1 hoge2.frudens.app _acme-challenge.hoge2.frudens.app
 73Error: Remove-DnsServerResourceRecord : Failed to get the zone information for hoge2.frudens.app on server DNSServer-ZoneName.
 74Error: At C:\Users\teruhirokomaki\Desktop\win-acme.v1.9.11.2\scripts\delete-dns.ps1:2 char:1
 75Error: + Remove-DnsServerResourceRecord -Force -Computername DNSServer-ZoneNam ...
 76Error: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 77Error:     + CategoryInfo          : NotSpecified: (_acme-challenge.hoge2.frudens.app:root/Microsoft/...rResourceRecord) [Rem
 78Error:    ove-DnsServerResourceRecord], CimException
 79Error:     + FullyQualifiedErrorId : WIN32 1722,Remove-DnsServerResourceRecord
 80
 81 [EROR] Error authorizing [Manual] [1 binding - hoge2.frudens.app]
 82 [EROR] AcmeWebException: Unexpected error
 83 +Response from server:
 84        + Code: BadRequest
 85        + Content: {
 86  "type": "urn:acme:error:badNonce",
 87  "detail": "JWS has invalid anti-replay nonce Y50_OdnTDpPBS4zJ10kh7_iojVNWr_hScGKEUl2w2rI",
 88  "status": 400
 89}
 90 [EROR] Create certificate failed
 91
 92 N: Create new certificate
 93 M: Create new certificate with advanced options
 94 L: List scheduled renewals
 95 R: Renew scheduled
 96 S: Renew specific
 97 A: Renew *all*
 98 V: Revoke certificate
 99 C: Cancel scheduled renewal
100 X: Cancel *all* scheduled renewals
101 Q: Quit

そもそも

(上の内容のDNSserverは置き換えてください。)

Cloud DNSやRoute53であれば、API使えば設定できるけど、なんの認証もなく、DNSにTXTレコードを作成したり、削除することはできるわけないよね。

この作業って、TXTレコードに設定する文字列を取得するための作業だと思っていたけど、指定しているスクリプトを改めて見てみると、TXTレコードを作成したり、削除するような内容なんですよね。

そりゃ、できるわけないよね…

Go製のACMEクライアントを使えば良いのではないか?

ということで、ACME clientsを見てみる。

このためにGoをインストールしたくないしな…

そもそもWindowsじゃなくて良いのではないか?

ここまで来たけど、Windowsで作業するのが嫌になってきたので、macOSかLinuxでDNS認証しよう!と思い、今回のチャレンジは失敗しました。

あとがき

Windows 10 であれえば、WSL(Windows Subsystem for Linux)でLinuxをインストールして、certbotを実行すれば良いんですけどね…

今回は、Windows Server ですので…

Windowsとか、PowerShellとか、本当に辛い…

Tags:
comments powered by Disqus