Enabling SSL certificates with automated renewals for Traefik in my Homelab setup turned out to be quite straightforward. All I had to do was configure Let’s Encrypt as the Certificate Authority (CA) with Cloudflare as the DNS provider in Traefik’s config files, and then activate it for services in the Docker Compose file. Once all the configurations were in place, Let’s Encrypt promptly issued certificates for the specified subdomains as outlined in the Traefik config. It left me in a bit of a ‘what just happened’ state.
While the Traefik container logs include info on some key events, it was not sufficient to understand the ACME protocol flow. I wanted to see API interactions between Traefik, the Let’s Encrypt server, and Cloudflare in order to understand the complete ACME flow. To gain a better understanding, I redirected the Traefik container’s traffic via BurpSuite proxy. This captured a comprehensive list of the APIs involved, aligning perfectly with the ACME flow specified in RFC 8555.
In this post, I’m sharing the configurations used and a rundown of the captured APIs in the ACME flow, giving you a peek into the process of generating a new Let’s Encrypt SSL certificate.
Traefik setup without SSL
Let’s assume the Traefik VM has the IP 192.168.0.123
. There are four URLs representing different services (arbitrarily chosen for this post) that need to be routed through Traefik:
Traefik Dashboard
: An internal service of Traefik running on port 8080.
whoami
: A Docker container residing in the same VM.
Dozzle
: Service in another VM within the same network.
example.com
: Represents an external URL.
Service
Before
After
Traefik dashboard
http://192.168.0.123:8080
http://192.168.0.123:8080
whoami
http://192.168.0.123/whoami
http://192.168.0.123/whoami
Dozzle
https://192.168.0.124:2443/dozzle
http://192.168.0.123/dozzle
example.com
https://example.com
http://192.168.0.123/example
As you can see, we are unifying all services to be accessible via the Trafik VM IP with HTTP. Services except Traefik dashboard are now available on the specified paths.
fig 1: Traefik HTTP Setup
Here are the docker compose file and Traefik static & dynamic configuration files for the HTTP setup:
Docker Compose file:
traefik/docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
services :
traefik :
image : "traefik:v2.11"
container_name : "traefik"
ports :
- "80:80"
- "8080:8080"
volumes :
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "/home/ubuntu/traefik/etc/traefik:/etc/traefik"
whoami :
image : "traefik/whoami"
container_name : "whoami"
labels :
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=PathPrefix(`/whoami`)"
- "traefik.http.routers.whoami.entrypoints=web"
Traefik Static Configuration file:
traefik/etc/traefik/traefik.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
log :
level : DEBUG
api :
insecure : true
accessLog : false
providers :
docker :
exposedByDefault : false
file :
directory : "/etc/traefik/sites"
entryPoints :
web :
address : ":80"
Traefik Dynamic Configuration files:
traefik/etc/traefik/sites/dozzle.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
http :
routers :
dozzle :
rule : PathPrefix(`/dozzle`)
entryPoints : web
service : dozzle@file
services :
dozzle :
loadBalancer :
serversTransport : dozzle
servers :
- url : "https://192.168.0.124:2443/dozzle"
serversTransports :
dozzle :
insecureSkipVerify : true
traefik/etc/traefik/sites/example.yml
1
2
3
4
5
6
7
8
9
10
11
12
http :
routers :
example :
rule : PathPrefix(`/example`)
entryPoints : web
service : example@file
services :
example :
loadBalancer :
passHostHeader : false
servers :
- url : "https://example.com"
Traefik setup with SSL
Our next goal is to establish SSL - all URLs will be directed to port 443
.
We also need to setup automated certificate renewals using Let’s Encrypt certificates for mitigating the overhead of managing the SSL certificate manually.
Here is the plan:
Service
Before
After
Traefik dashboard
http://192.168.0.123:8080
https://nas.mycustomservice.local/dashboard
whoami
http://192.168.0.123/whoami
https://nas.mycustomservice.local/whoami
Dozzle
https://192.168.0.123/dozzle
https://nas.mycustomservice.local/dozzle
example.com
http://192.168.0.123/example
https://nas.mycustomservice.local/example
Note that the Traefik dashboard is no longer bound to a port, but under a URL path.
fig 2: Traefik HTTPS Setup
We will attach the domain name nas.mycustomservice.local
instead of the IP 192.168.0.123
. Additionally, for demo purposes, I’m planning to add test1.test2.mycustomservice.local
as an alias for this domain and also *.nas.mycustomservice.local
to make the services available with subdomain access in case if required.
Here are the DNS records, local network IPs will make the services to be available within the Homelab network:
A nas 192.168.0.123
A test.local 192.168.0.123
CNAME *.nas nas.mycustomservice.local
Here are the docker compose file and Traefik static & dynamic configuration files for the HTTPS setup. Additional lines are highlighted:
Docker Compose file:
traefik/docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
services :
traefik :
image : "traefik:v2.11"
container_name : "traefik"
ports :
- "80:80"
- "8080:8080"
- "443:443"
volumes :
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "/home/ubuntu/traefik/etc/traefik:/etc/traefik"
environment :
CLOUDFLARE_DNS_API_TOKEN : "<token>"
CLOUDFLARE_ZONE_API_TOKEN : "<token>"
whoami :
image : "traefik/whoami"
container_name : "whoami"
labels :
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=PathPrefix(`/whoami`)"
- "traefik.http.routers.whoami.entrypoints=web"
- "traefik.http.routers.whoami.middlewares=http2https@file"
- "traefik.http.routers.whoami-secure.rule=PathPrefix(`/whoami`)"
- "traefik.http.routers.whoami-secure.entrypoints=websecure"
- "traefik.http.routers.whoami-secure.tls=true"
To generate Cloudflare API tokens, refer to https://go-acme.github.io/lego/dns/cloudflare/#api-tokens
Traefik Static Configuration file:
traefik/etc/traefik/traefik.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
log :
level : DEBUG
api :
insecure : true
accessLog : false
providers :
docker :
exposedByDefault : false
file :
directory : "/etc/traefik/sites"
entryPoints :
web :
address : ":80"
websecure :
address : ":443"
certificatesResolvers :
letEncryptStagingResolver :
acme :
caServer : https://acme-staging-v02.api.letsencrypt.org/directory
email : [email protected]
storage : /etc/traefik/acme.json
dnsChallenge :
provider : cloudflare
letEncryptProductionResolver :
acme :
email : [email protected]
storage : /etc/traefik/acme.json
dnsChallenge :
provider : cloudflare
Traefik Dynamic Configuration files:
Note: Use letEncryptStagingResolver
during testing, and switch to letEncryptProductionResolver
once finalized.
traefik/etc/traefik/sites/letsencrypt.yml
1
2
3
4
5
6
7
8
9
10
tls :
stores :
default :
defaultGeneratedCert :
resolver : letEncryptProductionResolver
domain :
main : "nas.mycustomservice.local"
sans :
- "*.nas.mycustomservice.local"
- "test1.test2.mycustomservice.local"
traefik/etc/traefik/sites/dozzle.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
http :
routers :
dozzle :
rule : PathPrefix(`/dozzle`)
entryPoints : web
service : dozzle@file
middlewares :
- http2https
dozzle-secure :
rule : PathPrefix(`/dozzle`)
entryPoints : websecure
service : dozzle@file
tls : {}
services :
dozzle :
loadBalancer :
serversTransport : dozzle
servers :
- url : "https://192.168.0.124:2443/dozzle"
serversTransports :
dozzle :
insecureSkipVerify : true
middlewares :
http2https :
redirectScheme :
scheme : https
traefik/etc/traefik/sites/example.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
http :
routers :
example :
rule : PathPrefix(`/example`)
entryPoints : web
service : example@file
middlewares :
- http2https
example-secure :
rule : PathPrefix(`/example`)
entryPoints : websecure
service : example@file
tls : {}
services :
example :
loadBalancer :
passHostHeader : false
servers :
- url : "https://example.com"
Once saved, Traefik would contact Let’s Encrypt server to issue SSL certificates. If you monitor DNS records, you could see temporary DNS records getting created in Cloudflare.
This completes the SSL certificate setup, https://nas.mycustomservice.local/<service_path>
would give the service access.
The generated SSL certificate can be viewed at /etc/traefik/acme.json
:
/etc/traefik/acme.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"letEncryptStagingResolver": {
"Account": {
"Email": "[email protected] " ,
"Registration": {
"body": {
"status": "valid" ,
"contact": [
"mailto:[email protected] "
]
},
"uri": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789"
},
"PrivateKey": "MIIJKQIB...F9t44KnJ" ,
"KeyType": "4096"
},
"Certificates": [ {
"domain": {
"main": "*.nas.mycustomservice.local" ,
"sans": [
"nas.mycustomservice.local" ,
"test1.test2.mycustomservice.local"
]
},
"certificate": "LS0tLS1...LS0tLS0K" ,
"key": "LS0tLS1...S0tLS0tCg==" ,
"Store": "default"
}]
},
"letEncryptProductionResolver": {
"Account": null ,
"Certificates": null
}
}
What’s happening internally?
The diagram below depicts the typical sequence of requests for SSL certificate issuance by Traefik using the ACME protocol (Let’s Encrypt as Certificate Authority) and with DNS challenge type (Cloudflare as DNS provider).
fig 3: SSL certificate issuance process with ACME
[Debugging] How to view API requests?
Burp Suite proxy was utilized to capture these API requests. Initially, the proxy was enabled, and the CA certificate was exported in DER format. Subsequently, it was converted to PEM format using the following command:
openssl x509 -in /path/to/burp_ca.der -out /path/to/burp_ca.pem -outform pem
This file was then transferred to the VM hosting the Traefik container, and the docker-compose file was updated as shown below. This enabled to view all the APIs in BurpSuite’s Proxy > HTTP History
.
traefik/docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
services :
traefik :
image : "traefik:v2.11"
container_name : "traefik"
ports :
- "80:80"
- "8080:8080"
- "443:443"
volumes :
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "/home/ubuntu/traefik/etc/traefik:/etc/traefik"
- "/home/ubuntu/traefik/burp_ca.pem:/etc/ssl/certs/burp_ca.pem"
environment :
CLOUDFLARE_DNS_API_TOKEN : "<token>"
CLOUDFLARE_ZONE_API_TOKEN : "<token>"
HTTP_PROXY : "<IP_of_the_machine_with_burpsuite_proxy>"
HTTPS_PROXY : "<IP_of_the_machine_with_burpsuite_proxy>"
whoami :
image : "traefik/whoami"
container_name : "whoami"
labels :
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=PathPrefix(`/whoami`)"
- "traefik.http.routers.whoami.entrypoints=web"
- "traefik.http.routers.whoami.middlewares=http2https@file"
- "traefik.http.routers.whoami-secure.rule=PathPrefix(`/whoami`)"
- "traefik.http.routers.whoami-secure.entrypoints=websecure"
- "traefik.http.routers.whoami-secure.tls=true"
Cloudflare ↔ Traefik ↔ Let’s Encrypt API Interaction
Here’s the expanded version with request and response details for each API call recorded in BurpSuite: (click on each request to expand details)
GET /directory
Request
1
2
3
4
5
GET /directory HTTP/1.1
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Accept-Encoding : gzip, deflate, br
Connection : close
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:44:23 GMT
Content-Type : application/json
Content-Length : 821
Cache-Control : public, max-age=0, no-cache
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"aXXX5so4OUM": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417" ,
"keyChange": "https://acme-staging-v02.api.letsencrypt.org/acme/key-change" ,
"meta": {
"caaIdentities": [
"letsencrypt.org"
],
"termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.pdf" ,
"website": "https://letsencrypt.org/docs/staging-environment/"
},
"newAccount": "https://acme-staging-v02.api.letsencrypt.org/acme/new-acct" ,
"newNonce": "https://acme-staging-v02.api.letsencrypt.org/acme/new-nonce" ,
"newOrder": "https://acme-staging-v02.api.letsencrypt.org/acme/new-order" ,
"renewalInfo": "https://acme-staging-v02.api.letsencrypt.org/draft-ietf-acme-ari-02/renewalInfo/" ,
"revokeCert": "https://acme-staging-v02.api.letsencrypt.org/acme/revoke-cert"
}
HEAD /acme/new-nonce
Request
1
2
3
HEAD /acme/new-nonce HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Response
1
2
3
4
5
6
7
8
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:44:23 GMT
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_1>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
POST /acme/new-acct
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
POST /acme/new-acct HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1979
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload": {
"contact": [
"mailto:[email protected] "
],
"termsOfServiceAgreed": true
},
"protected": {
"alg": "RS256" ,
"jwk": {
"kty": "RSA" ,
"n": "txHVs5DnkevYfwsxT...qJRoxmQYVNdo-Gp0G5MeIFaAk" ,
"e": "AQAB"
},
"nonce": "<nonce_1>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/new-acct"
},
"signature": "PkiNgKlURafo...8V2yQRzibY"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
HTTP/2 201 Created
Server : nginx
Date : Mon, 15 Apr 2024 22:44:24 GMT
Content-Type : application/json
Content-Length : 907
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Link : <https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.pdf>;rel="terms-of-service"
Location : https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789
Replay-Nonce : <nonce_2>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"key": {
"kty": "RSA" ,
"n": "txHVs5DnkevYfwsxTSndw...Gp0G5MeIFaAk" ,
"e": "AQAB"
},
"contact": [
"mailto:[email protected] "
],
"initialIp": "<server_ip>" ,
"createdAt": "2024-04-15T22:44:24.238667243Z" ,
"status": "valid"
}
POST /acme/new-order
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
POST /acme/new-order HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1210
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload": {
"identifiers": [
{
"type": "dns" ,
"value": "*.nas.mycustomservice.local"
},
{
"type": "dns" ,
"value": "nas.mycustomservice.local"
},
{
"type": "dns" ,
"value": "test1.test2.mycustomservice.local"
}
]
},
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_2>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/new-order"
},
"signature" : "iHW7BjmDfBxv6hO...m3B2BPtUxk_7Jzw"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
HTTP/2 201 Created
Server : nginx
Date : Mon, 15 Apr 2024 22:44:24 GMT
Content-Type : application/json
Content-Length : 648
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Location : https://acme-staging-v02.api.letsencrypt.org/acme/order/123456789/11122233344
Replay-Nonce : <nonce_3>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"status": "pending" ,
"expires": "2024-04-22T22:44:24Z" ,
"identifiers": [
{
"type": "dns" ,
"value": "*.nas.mycustomservice.local"
},
{
"type": "dns" ,
"value": "nas.mycustomservice.local"
},
{
"type": "dns" ,
"value": "test1.test2.mycustomservice.local"
}
],
"authorizations": [
"https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/11111111111" ,
"https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/22222222222" ,
"https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/33333333333"
],
"finalize": "https://acme-staging-v02.api.letsencrypt.org/acme/finalize/123456789/11122233344"
}
POST /acme/authz-v3/11111111111
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/authz-v3/11111111111 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1033
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_3>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/11111111111"
},
"signature" : "pYj8p8yW2FCFJrr...fLpx4jtFAHjFFM2-SA"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:44:25 GMT
Content-Type : application/json
Content-Length : 392
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_4>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"identifier": {
"type": "dns" ,
"value": "nas.mycustomservice.local"
},
"status": "pending" ,
"expires": "2024-04-22T22:44:24Z" ,
"challenges": [
{
"type": "dns-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/11111111111/aaaAAA" ,
"token": "<token_1>"
}
],
"wildcard": true
}
HEAD /acme/new-nonce
Request
1
2
3
HEAD /acme/new-nonce HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Response
1
2
3
4
5
6
7
8
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:44:25 GMT
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_5>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
HEAD /acme/new-nonce
Request
1
2
3
HEAD /acme/new-nonce HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Response
1
2
3
4
5
6
7
8
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:44:25 GMT
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_6>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
POST /acme/authz-v3/22222222222
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/authz-v3/22222222222 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1033
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_5>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/22222222222"
},
"signature" : "Hh2nnXUaDQe...Kqvz5Tliq19FRNpg5Q"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:44:25 GMT
Content-Type : application/json
Content-Length : 816
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_7>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"identifier": {
"type": "dns" ,
"value": "nas.mycustomservice.local"
},
"status": "pending" ,
"expires": "2024-04-22T22:44:24Z" ,
"challenges": [
{
"type": "http-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/22222222222/eeeEEE" ,
"token": "<token_2>"
},
{
"type": "dns-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/22222222222/bbbBBB" ,
"token": "<token_2>"
},
{
"type": "tls-alpn-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/22222222222/dddDDD" ,
"token": "<token_2>"
}
]
}
POST /acme/authz-v3/33333333333
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/authz-v3/33333333333 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1033
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_6>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/33333333333"
},
"signature" : "O3i3GhFrvTjBsWp...iWgkXuJJ1u7TR8g4"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:44:25 GMT
Content-Type : application/json
Content-Length : 830
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_8>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"identifier": {
"type": "dns" ,
"value": "test1.test2.mycustomservice.local"
},
"status": "pending" ,
"expires": "2024-04-22T22:44:24Z" ,
"challenges": [
{
"type": "http-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/fffFFF" ,
"token": "<token_3>"
},
{
"type": "dns-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/cccCCC" ,
"token": "<token_3>"
},
{
"type": "tls-alpn-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/gggGGG" ,
"token": "<token_3>"
}
]
}
GET /client/v4/zones?name=example.com&per_page=50
Request
1
2
3
4
5
6
7
GET /client/v4/zones?name=example.com&per_page=50 HTTP/1.1
Host : api.cloudflare.com
Authorization : Bearer <bearer_token_1>
User-Agent : cloudflare-go/v4
Content-Type : application/json
Accept-Encoding : gzip, deflate, br
Connection : close
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
HTTP/2 200 OK
Date : Mon, 15 Apr 2024 22:44:26 GMT
Content-Type : application/json
Cf-Ray : 4ba0722d24fb3b1b-SFO
Cf-Cache-Status : DYNAMIC
Cache-Control : no -store, no-cache, must-revalidate, post-check=0, pre-check=0
Expires : Sun, 25 Jan 1981 05:00:00 GMT
Set-Cookie : __cflb=0...D; SameSite=Lax; path=/; expires=Tue, 16-Apr-24 01:14:27 GMT; HttpOnly
Strict-Transport-Security : max-age=31536000
Pragma : no -cache
X-Content-Type-Options : nosniff
X-Frame-Options : SAMEORIGIN
Vary : Accept-Encoding
Set-Cookie : __cfruid=f...6; path=/; domain=.api.cloudflare.com; HttpOnly; Secure; SameSite=None
Server : cloudflare
{
"result": [
{
"id": "zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ" ,
"name": "example.com" ,
"status": "active" ,
"paused": false ,
"type": "full" ,
"development_mode": 0 ,
"name_servers": [
"dina.ns.cloudflare.com" ,
"phil.ns.cloudflare.com"
],
"original_name_servers": null ,
"original_registrar": null ,
"original_dnshost": null ,
"modified_on": "2024-04-02T19:46:42.072328Z" ,
"created_on": "2022-12-19T05:26:53.707734Z" ,
"activated_on": "2022-12-19T05:38:03.856067Z" ,
"meta": {
"step": 2 ,
"custom_certificate_quota": 0 ,
"page_rule_quota": 3 ,
"phishing_detected": false ,
"multiple_railguns_allowed": false
},
"owner": {
"id": null ,
"type": "user" ,
"email": null
},
"account": {
"id": "<acc_id>" ,
"name": "<acc_name>"
},
"tenant": {
"id": null ,
"name": null
},
"tenant_unit": {
"id": null
},
"permissions": [
"#zone:read" ,
"#zone_settings:read"
],
"plan": {
"id": "0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee" ,
"name": "Free Website" ,
"price": 0 ,
"currency": "USD" ,
"frequency": "" ,
"is_subscribed": false ,
"can_subscribe": false ,
"legacy_id": "free" ,
"legacy_discount": false ,
"externally_managed": false
}
}
],
"result_info": {
"page": 1 ,
"per_page": 50 ,
"total_pages": 1 ,
"count": 1 ,
"total_count": 1
},
"success": true ,
"errors": [],
"messages": []
}
POST /client/v4/zones/zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ/dns_records
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST /client/v4/zones/zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ/dns_records HTTP/2
Host : api.cloudflare.com
Authorization : Bearer <bearer_token_2>
User-Agent : cloudflare-go/v4
Content-Type : application/json
Content-Length : 174
Accept-Encoding : gzip, deflate, br
{
"created_on": "0001-01-01T00:00:00Z" ,
"modified_on": "0001-01-01T00:00:00Z" ,
"type": "TXT" ,
"name": "nas.mycustomservice.local" ,
"content": "BbR...E1I" ,
"ttl": 120
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
HTTP/2 200 OK
Date : Mon, 15 Apr 2024 22:44:27 GMT
Content-Type : application/json
Cf-Ray : 874f75d4c9b73c12-SFO
Cf-Cache-Status : DYNAMIC
Set-Cookie : __cflb=0...F; SameSite=Lax; path=/; expires=Tue, 16-Apr-24 01:14:28 GMT; HttpOnly
Vary : Accept-Encoding
Set-Cookie : __cfruid=7...7; path=/; domain=.api.cloudflare.com; HttpOnly; Secure; SameSite=None
Server : cloudflare
{
"result": {
"id": "aAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaA" ,
"zone_id": "zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ" ,
"zone_name": "example.com" ,
"name": "nas.mycustomservice.local" ,
"type": "TXT" ,
"content": "BbR...E1I" ,
"proxiable": false ,
"proxied": false ,
"ttl": 120 ,
"locked": false ,
"meta": {
"auto_added": false ,
"managed_by_apps": false ,
"managed_by_argo_tunnel": false
},
"comment": null ,
"tags": [],
"created_on": "2024-04-15T22:44:27.736818Z" ,
"modified_on": "2024-04-15T22:44:27.736818Z"
},
"success": true ,
"errors": [],
"messages": []
}
POST /client/v4/zones/zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ/dns_records
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST /client/v4/zones/zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ/dns_records HTTP/2
Host : api.cloudflare.com
Authorization : Bearer <bearer_token_2>
User-Agent : cloudflare-go/v4
Content-Type : application/json
Content-Length : 174
Accept-Encoding : gzip, deflate, br
{
"created_on": "0001-01-01T00:00:00Z" ,
"modified_on": "0001-01-01T00:00:00Z" ,
"type": "TXT" ,
"name": "nas.mycustomservice.local" ,
"content": "_SN...xi0" ,
"ttl": 120
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
HTTP/2 200 OK
Date : Mon, 15 Apr 2024 22:44:28 GMT
Content-Type : application/json
Cf-Ray : 874f75dabaee3c12-SFO
Cf-Cache-Status : DYNAMIC
Set-Cookie : __cflb=0...F; SameSite=Lax; path=/; expires=Tue, 16-Apr-24 01:14:29 GMT; HttpOnly
Vary : Accept-Encoding
Set-Cookie : __cfruid=1...; path=/; domain=.api.cloudflare.com; HttpOnly; Secure; SameSite=None
Server : cloudflare
{
"result": {
"id": "bBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbB" ,
"zone_id": "zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ" ,
"zone_name": "example.com" ,
"name": "nas.mycustomservice.local" ,
"type": "TXT" ,
"content": "_SN...xi0" ,
"proxiable": false ,
"proxied": false ,
"ttl": 120 ,
"locked": false ,
"meta": {
"auto_added": false ,
"managed_by_apps": false ,
"managed_by_argo_tunnel": false ,
},
"comment": null ,
"tags": [],
"created_on": "2024-04-15T22:44:28.444277Z" ,
"modified_on": "2024-04-15T22:44:28.444277Z" ,
},
"success": true ,
"errors": [],
"messages": [],
}
POST /client/v4/zones/zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ/dns_records
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST /client/v4/zones/zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ/dns_records HTTP/2
Host : api.cloudflare.com
Authorization : Bearer <bearer_token_2>
User-Agent : cloudflare-go/v4
Content-Type : application/json
Content-Length : 204
Accept-Encoding : gzip, deflate, br
{
"created_on": "0001-01-01T00:00:00Z" ,
"modified_on": "0001-01-01T00:00:00Z" ,
"type": "TXT" ,
"name": "_acme-challenge.test1.test2.mycustomservice.local" ,
"content": "g4K...Prg" ,
"ttl": 120
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
HTTP/2 200 OK
Date : Mon, 15 Apr 2024 22:44:29 GMT
Content-Type : application/json
Cf-Ray : 874f75dfcc0a3c12-SFO
Cf-Cache-Status : DYNAMIC
Set-Cookie : __cflb=0...m; SameSite=Lax; path=/; expires=Tue, 16-Apr-24 01:14:30 GMT; HttpOnly
Vary : Accept-Encoding
Set-Cookie : __cfruid=1...9; path=/; domain=.api.cloudflare.com; HttpOnly; Secure; SameSite=None
Server : cloudflare
{
"result": {
"id": "cCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcC" ,
"zone_id": "zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ" ,
"zone_name": "example.com" ,
"name": "_acme-challenge.test1.test2.mycustomservice.local" ,
"type": "TXT" ,
"content": "g4K...Prg" ,
"proxiable": false ,
"proxied": false ,
"ttl": 120 ,
"locked": false ,
"meta": {
"auto_added": false ,
"managed_by_apps": false ,
"managed_by_argo_tunnel": false
},
"comment": null ,
"tags": [],
"created_on": "2024-04-15T22:44:29.294042Z" ,
"modified_on": "2024-04-15T22:44:29.294042Z"
},
"success": true ,
"errors": [],
"messages": []
}
POST /acme/chall-v3/11111111111/aaaAAA
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/chall-v3/11111111111/aaaAAA HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1045
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "e30" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_8>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/11111111111/aaaAAA"
},
"signature": "YpujTx3RiJszf3D...wfdef6KmEFfFrrQ"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:44:31 GMT
Content-Type : application/json
Content-Length : 193
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Link : <https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/11111111111>;rel="up"
Location : https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/11111111111/aaaAAA
Replay-Nonce : <nonce_9>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"type": "dns-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/11111111111/aaaAAA" ,
"token": "<token_1>"
}
POST /acme/authz-v3/11111111111
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/authz-v3/11111111111 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1033
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_9>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/11111111111"
},
"signature": "nJBPLq2Lds321...oGvkZANUXIm284"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:44:32 GMT
Content-Type : application/json
Content-Length : 392
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_10>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"identifier": {
"type": "dns" ,
"value": "nas.mycustomservice.local"
},
"status": "pending" ,
"expires": "2024-04-22T22:44:24Z" ,
"challenges": [
{
"type": "dns-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/11111111111/aaaAAA" ,
"token": "<token_1>"
}
],
"wildcard": true
}
POST /acme/authz-v3/11111111111
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/authz-v3/11111111111 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1033
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_10>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/11111111111"
},
"signature": "r-N9y58zlB9i2r...CIW-Y8w8qwo1_ws"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:44:35 GMT
Content-Type : application/json
Content-Length : 392
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_11>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"identifier": {
"type": "dns" ,
"value": "nas.mycustomservice.local"
},
"status": "pending" ,
"expires": "2024-04-22T22:44:24Z" ,
"challenges": [
{
"type": "dns-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/11111111111/aaaAAA" ,
"token": "<token_1>"
}
],
"wildcard": true
}
POST /acme/authz-v3/11111111111
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/authz-v3/11111111111 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1033
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_11>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/11111111111"
},
"signature": "sKKxfXxd8eVYmvLf...KSO9jzvdLA0VRk"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:44:45 GMT
Content-Type : application/json
Content-Length : 392
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_12>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"identifier": {
"type": "dns" ,
"value": "nas.mycustomservice.local"
},
"status": "pending" ,
"expires": "2024-04-22T22:44:24Z" ,
"challenges": [
{
"type": "dns-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/11111111111/aaaAAA" ,
"token": "<token_1>"
}
],
"wildcard": true
}
POST /acme/authz-v3/11111111111
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/authz-v3/11111111111 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1033
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_12>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/11111111111"
},
"signature": "m8VMj7Mdv8jI3...GbLqTZJEuqKYYE"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:44:56 GMT
Content-Type : application/json
Content-Length : 597
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_13>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"identifier": {
"type": "dns" ,
"value": "nas.mycustomservice.local"
},
"status": "valid" ,
"expires": "2024-05-15T22:44:51Z" ,
"challenges": [
{
"type": "dns-01" ,
"status": "valid" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/11111111111/aaaAAA" ,
"token": "<token_1>" ,
"validationRecord": [
{
"hostname": "nas.mycustomservice.local" ,
"resolverAddrs": [
"10.0.32.85:28460"
]
}
],
"validated": "2024-04-15T22:44:31Z"
}
],
"wildcard": true
}
POST /acme/chall-v3/22222222222/bbbBBB
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/chall-v3/22222222222/bbbBBB HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1045
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "e30" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_13>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/22222222222/bbbBBB"
},
"signature": "KoR8Npq7IbAosgLUX...Ua9S_ai78uno4"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:44:59 GMT
Content-Type : application/json
Content-Length : 193
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Link : <https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/22222222222>;rel="up"
Location : https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/22222222222/bbbBBB
Replay-Nonce : <nonce_14>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"type": "dns-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/22222222222/bbbBBB" ,
"token": "<token_2>"
}
POST /acme/authz-v3/22222222222
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/authz-v3/22222222222 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1033
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_14>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/22222222222"
},
"signature" : "W8SCrjEIrr6o...fAr4Bs0kiU1uIaw"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:44:59 GMT
Content-Type : application/json
Content-Length : 816
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_15>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"identifier": {
"type": "dns" ,
"value": "nas.mycustomservice.local"
},
"status": "pending" ,
"expires": "2024-04-22T22:44:24Z" ,
"challenges": [
{
"type": "http-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/22222222222/eeeEEE" ,
"token": "<token_2>"
},
{
"type": "dns-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/22222222222/bbbBBB" ,
"token": "<token_2>"
},
{
"type": "tls-alpn-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/22222222222/dddDDD" ,
"token": "<token_2>"
}
]
}
POST /acme/authz-v3/22222222222
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/authz-v3/22222222222 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1033
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_15>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/22222222222"
},
"signature" : "NH-TaMdUBCoG9N...IMeHGs8LxRnSj-4s"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:45:07 GMT
Content-Type : application/json
Content-Length : 816
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_16>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"identifier": {
"type": "dns" ,
"value": "nas.mycustomservice.local"
},
"status": "pending" ,
"expires": "2024-04-22T22:44:24Z" ,
"challenges": [
{
"type": "http-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/22222222222/eeeEEE" ,
"token": "<token_2>"
},
{
"type": "dns-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/22222222222/bbbBBB" ,
"token": "<token_2>"
},
{
"type": "tls-alpn-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/22222222222/dddDDD" ,
"token": "<token_2>"
}
]
}
POST /acme/authz-v3/22222222222
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/authz-v3/22222222222 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1033
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload": "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_16>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/22222222222"
},
"signature": "Rrl0vQb083f3qY6mr...56fDga--8YhSpk"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:45:12 GMT
Content-Type : application/json
Content-Length : 577
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_17>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"identifier": {
"type": "dns" ,
"value": "nas.mycustomservice.local"
},
"status": "valid" ,
"expires": "2024-05-15T22:45:09Z" ,
"challenges": [
{
"type": "dns-01" ,
"status": "valid" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/22222222222/bbbBBB" ,
"token": "<token_2>" ,
"validationRecord": [
{
"hostname": "nas.mycustomservice.local" ,
"resolverAddrs": [
"10.0.32.82:23095"
]
}
],
"validated": "2024-04-15T22:44:59Z"
}
]
}
POST /acme/chall-v3/33333333333/cccCCC
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/chall-v3/33333333333/cccCCC HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1045
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "e30" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_17>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/cccCCC"
},
"signature" : "pPaeqBiq4HqW5...QBSi3l87xrdUM"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:45:14 GMT
Content-Type : application/json
Content-Length : 193
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Link : <https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/33333333333>;rel="up"
Location : https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/cccCCC
Replay-Nonce : <nonce_18>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"type": "dns-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/cccCCC" ,
"token": "<token_3>"
}
POST /acme/authz-v3/33333333333
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/authz-v3/33333333333 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1033
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_18>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/33333333333"
},
"signature" : "HiH3Yh5hdLdQhm...qgYF1AM_1AC3Qo"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:45:15 GMT
Content-Type : application/json
Content-Length : 830
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_18>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"identifier": {
"type": "dns" ,
"value": "test1.test2.mycustomservice.local"
},
"status": "pending" ,
"expires": "2024-04-22T22:44:24Z" ,
"challenges": [
{
"type": "http-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/fffFFF" ,
"token": "<token_3>"
},
{
"type": "dns-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/cccCCC" ,
"token": "<token_3>"
},
{
"type": "tls-alpn-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/gggGGG" ,
"token": "<token_3>"
}
]
}
POST /acme/authz-v3/33333333333
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/authz-v3/33333333333 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1033
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_18>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/33333333333"
},
"signature" : "SMKKc-Da_EE...nxmjwTgJiNYqQc"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:45:22 GMT
Content-Type : application/json
Content-Length : 830
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_19>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"identifier": {
"type": "dns" ,
"value": "test1.test2.mycustomservice.local"
},
"status": "pending" ,
"expires": "2024-04-22T22:44:24Z" ,
"challenges": [
{
"type": "http-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/fffFFF" ,
"token": "<token_3>"
},
{
"type": "dns-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/cccCCC" ,
"token": "<token_3>"
},
{
"type": "tls-alpn-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/gggGGG" ,
"token": "<token_3>"
}
]
}
POST /acme/authz-v3/33333333333
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/authz-v3/33333333333 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1033
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_19>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/33333333333"
},
"signature" : "fSjTHehqqfWz...bVvaG2uH4DXf7h74o"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:45:30 GMT
Content-Type : application/json
Content-Length : 830
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_20>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"identifier": {
"type": "dns" ,
"value": "test1.test2.mycustomservice.local"
},
"status": "pending" ,
"expires": "2024-04-22T22:44:24Z" ,
"challenges": [
{
"type": "http-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/fffFFF" ,
"token": "<token_3>"
},
{
"type": "dns-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/cccCCC" ,
"token": "<token_3>"
},
{
"type": "tls-alpn-01" ,
"status": "pending" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/gggGGG" ,
"token": "<token_3>"
}
]
}
POST /acme/authz-v3/33333333333
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/authz-v3/33333333333 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1033
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_20>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/33333333333"
},
"signature" : "axHJF6HwVPlLDNDj...blbKDbI6BpV_Gz0"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:45:41 GMT
Content-Type : application/json
Content-Length : 605
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_21>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"identifier": {
"type": "dns" ,
"value": "test1.test2.mycustomservice.local"
},
"status": "valid" ,
"expires": "2024-05-15T22:45:34Z" ,
"challenges": [
{
"type": "dns-01" ,
"status": "valid" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/33333333333/cccCCC" ,
"token": "<token_3>" ,
"validationRecord": [
{
"hostname": "test1.test2.mycustomservice.local" ,
"resolverAddrs": [
"10.0.32.82:23095"
]
}
],
"validated": "2024-04-15T22:45:14Z"
}
]
}
DELETE /client/v4/zones/zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ/dns_records/aAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaA
Request
1
2
3
4
5
6
DELETE /client/v4/zones/zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ/dns_records/aAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaA HTTP/2
Host : api.cloudflare.com
Authorization : Bearer <bearer_token_2>
User-Agent : cloudflare-go/v4
Content-Type : application/json
Accept-Encoding : gzip, deflate, br
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HTTP/2 200 OK
Date : Mon, 15 Apr 2024 22:45:42 GMT
Content-Type : application/json
Cf-Ray : 874f77a6998e3c07-SFO
Cf-Cache-Status : DYNAMIC
Set-Cookie : __cflb=0...D; SameSite=Lax; path=/; expires=Tue, 16-Apr-24 01:15:43 GMT; HttpOnly
Vary : Accept-Encoding
Set-Cookie : __cfruid=c...2; path=/; domain=.api.cloudflare.com; HttpOnly; Secure; SameSite=None
Server : cloudflare
{
"result": {
"id": "aAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaA"
},
"success": true ,
"errors": [],
"messages": []
}
DELETE /client/v4/zones/zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ/dns_records/bBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbB
Request
1
2
3
4
5
6
DELETE /client/v4/zones/zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ/dns_records/bBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbB HTTP/2
Host : api.cloudflare.com
Authorization : Bearer <bearer_token_2>
User-Agent : cloudflare-go/v4
Content-Type : application/json
Accept-Encoding : gzip, deflate, br
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HTTP/2 200 OK
Date : Mon, 15 Apr 2024 22:45:43 GMT
Content-Type : application/json
Cf-Ray : 21d51a9896374f07-SFO
Cf-Cache-Status : DYNAMIC
Set-Cookie : __cflb=0...j; SameSite=Lax; path=/; expires=Tue, 16-Apr-24 01:15:44 GMT; HttpOnly
Vary : Accept-Encoding
Set-Cookie : __cfruid=7...3; path=/; domain=.api.cloudflare.com; HttpOnly; Secure; SameSite=None
Server : cloudflare
{
"result": {
"id": "bBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbB"
},
"success": true ,
"errors": [],
"messages": []
}
DELETE /client/v4/zones/zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ/dns_records/cCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcC
Request
1
2
3
4
5
6
DELETE /client/v4/zones/zzzzzzzzzzzzzzzzZZZZZZZZZZZZZZZZ/dns_records/cCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcC HTTP/2
Host : api.cloudflare.com
Authorization : Bearer <bearer_token_2>
User-Agent : cloudflare-go/v4
Content-Type : application/json
Accept-Encoding : gzip, deflate, br
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HTTP/2 200 OK
Date : Mon, 15 Apr 2024 22:45:43 GMT
Content-Type : application/json
Cf-Ray : 35084b19144de3bf-SFO
Cf-Cache-Status : DYNAMIC
Set-Cookie : __cflb=0...F; SameSite=Lax; path=/; expires=Tue, 16-Apr-24 01:15:44 GMT; HttpOnly
Vary : Accept-Encoding
Set-Cookie : __cfruid=7...3; path=/; domain=.api.cloudflare.com; HttpOnly; Secure; SameSite=None
Server : cloudflare
{
"result": {
"id": "cCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcC"
},
"success": true ,
"errors": [],
"messages": []
}
POST /acme/finalize/123456789/11122233344
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
POST /acme/finalize/123456789/11122233344 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 3201
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload": {
"csr": "MIIEsDCCApgCAQAwGDE...fmxnNbbWYA"
},
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_21>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/finalize/123456789/11122233344"
},
"signature" : "nqtwaW8gJo...KhY5w6SljCto"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:45:47 GMT
Content-Type : application/json
Content-Length : 651
Boulder-Requester : 123456789
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Location : https://acme-staging-v02.api.letsencrypt.org/acme/order/123456789/11122233344
Replay-Nonce : <nonce_22>
Retry-After : 3
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"status": "processing" ,
"expires": "2024-04-22T22:44:24Z" ,
"identifiers": [
{
"type": "dns" ,
"value": "*.nas.mycustomservice.local"
},
{
"type": "dns" ,
"value": "nas.mycustomservice.local"
},
{
"type": "dns" ,
"value": "test1.test2.mycustomservice.local"
}
],
"authorizations": [
"https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/11111111111" ,
"https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/22222222222" ,
"https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/33333333333"
],
"finalize": "https://acme-staging-v02.api.letsencrypt.org/acme/finalize/123456789/11122233344"
}
POST /acme/order/123456789/11122233344
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/order/123456789/11122233344 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1042
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_22>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/order/123456789/11122233344"
},
"signature" : "K_ngn_c-LJUxr...bBE4wQHO0"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:45:47 GMT
Content-Type : application/json
Content-Length : 651
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_23>
Retry-After : 3
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"status": "processing" ,
"expires": "2024-04-22T22:44:24Z" ,
"identifiers": [
{
"type": "dns" ,
"value": "*.nas.mycustomservice.local"
},
{
"type": "dns" ,
"value": "nas.mycustomservice.local"
},
{
"type": "dns" ,
"value": "test1.test2.mycustomservice.local"
}
],
"authorizations": [
"https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/11111111111" ,
"https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/22222222222" ,
"https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/33333333333"
],
"finalize": "https://acme-staging-v02.api.letsencrypt.org/acme/finalize/123456789/11122233344"
}
POST /acme/order/123456789/11122233344
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/order/123456789/11122233344 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1042
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_23>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/order/123456789/11122233344"
},
"signature" : "RhBRVl87HQ4...osLPyPjw"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:45:48 GMT
Content-Type : application/json
Content-Length : 758
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Replay-Nonce : <nonce_24>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
{
"status": "valid" ,
"expires": "2024-04-22T22:44:24Z" ,
"identifiers": [
{
"type": "dns" ,
"value": "*.nas.mycustomservice.local"
},
{
"type": "dns" ,
"value": "nas.mycustomservice.local"
},
{
"type": "dns" ,
"value": "test1.test2.mycustomservice.local"
}
],
"authorizations": [
"https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/11111111111" ,
"https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/22222222222" ,
"https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/33333333333"
],
"finalize": "https://acme-staging-v02.api.letsencrypt.org/acme/finalize/123456789/11122233344" ,
"certificate": "https://acme-staging-v02.api.letsencrypt.org/acme/cert/xxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXX"
}
POST /acme/cert/xxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXX
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/cert/xxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXX HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1061
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_24>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/cert/xxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXX"
},
"signature" : "bE2kWcDPuwJ...ZNGgjUDY"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:45:48 GMT
Content-Type : application/pem-certificate-chain
Content-Length : 4144
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Link : <https://acme-staging-v02.api.letsencrypt.org/acme/cert/xxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXX/1>;rel="alternate"
Replay-Nonce : <nonce_25>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
--- --BEGIN CERTIFICATE-----
MIIGPjCC...gYPhj1xAP5jqa
--- --END CERTIFICATE-----
--- --BEGIN CERTIFICATE-----
MIIFWzCCA0...O1aw0PpQBPDQ==
--- --END CERTIFICATE-----
POST /acme/cert/xxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXX/1
Request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /acme/cert/xxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXX/1 HTTP/2
Host : acme-staging-v02.api.letsencrypt.org
User-Agent : containous-traefik/2.11.0 xenolf-acme/4.15.0 (release; linux; amd64)
Content-Length : 1063
Content-Type : application/jose+json
Accept-Encoding : gzip, deflate, br
{
"payload" : "" ,
"protected": {
"alg": "RS256" ,
"kid": "https://acme-staging-v02.api.letsencrypt.org/acme/acct/123456789" ,
"nonce": "<nonce_25>" ,
"url": "https://acme-staging-v02.api.letsencrypt.org/acme/cert/xxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXX/1"
},
"signature" : "SWchkpGL7GUk...1zprNvJoVsAAIng"
}
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
HTTP/2 200 OK
Server : nginx
Date : Mon, 15 Apr 2024 22:45:49 GMT
Content-Type : application/pem-certificate-chain
Content-Length : 6052
Cache-Control : public, max-age=0, no-cache
Link : <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index"
Link : <https://acme-staging-v02.api.letsencrypt.org/acme/cert/xxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXX/0>;rel="alternate"
Replay-Nonce : <nonce_26>
X-Frame-Options : DENY
Strict-Transport-Security : max-age=604800
--- --BEGIN CERTIFICATE-----
MIIGPj...BgYPhj1xAP5jqa
--- --END CERTIFICATE-----
--- --BEGIN CERTIFICATE-----
MIIFWz...O1aw0PpQBPDQ==
--- --END CERTIFICATE-----
--- --BEGIN CERTIFICATE-----
MIIFVD...0BPHtenfhKj5
--- --END CERTIFICATE-----
To view the certificate content, store the above response in a PEM file and run command:
while openssl x509 -noout -text; do :; done < cert.pem
Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Certificate :
Data :
Subject : CN=*.nas.mycustomservice.local.Info
X509v3 extensions :
X509v3 Subject Alternative Name :
DNS:*.nas.mycustomservice.local, DNS:nas.mycustomservice.local, DNS:test1.test2.mycustomservice.local
...
...
Certificate :
Data :
Subject : C=US, O=(STAGING) Let's Encrypt, CN=(STAGING) Artificial Apricot R3
...
Certificate :
Data :
Subject : C=US, O=(STAGING) Internet Security Research Group, CN=(STAGING) Pretend Pear X1
...
Now check out RFC 8555 , you would be able to map these APIs and understand it very easily!
References
RFC 8555: Automatic Certificate Management Environment (ACME)
LEGO DNS Providers > Cloudflare
(or, Github link )
Cloudflare API