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認証時に利用するスクリプト
スクリプトについて、具体的にどのように記述して指定するのかをググってみた。
- Example Scripts
- Validation plugins
- How to “Run external program/script to create and update records” #817
- Can I use Win-ACME (v1.9.10.1) to validate using “dns-01”? #841
このリンクの方が、具体的なコードを書いてくれていました。
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とか、本当に辛い…
comments powered by Disqus