我正在尝试使用 Smallstep step-ca 和 traefik 在私有网络中设置 Let's Encrypt 类型的服务。但我陷入困境,因为 step-ca 无法验证来自 traefik 的证书请求。
以下是我目前所做的事情。
我在 docker 容器中启动了一个 step-ca 服务,如中所述本文档 在 IP 为“172.16.4.5”的服务器上。我还关注了此文档用于添加 acme 入口点。
在另一台服务器“172.16.4.4”上,我启动了一个带有 Traefik 2.4 和“whoami”服务的 docker-compose 配置(像这里官方示例)。
所有内部域名均由私有 DNS 服务器提供服务。并且每台服务器都可以顺利解析域名。
服务器和 step-ca 容器可以通过端口 80 和 443 访问服务器 172.16.4.4。服务器 172.16.4.4 和 traefik 容器可以访问 172.16.4.5。我在 traefik 容器初始化期间安装了使用 step-ca 制作的根证书。
我已经设置 traefik 使用 TSL 挑战。Traefik 初始化挑战,但我不知道为什么 step-ca 会引发错误 {"type":"urn:ietf:params:acme:error:connection","detail":"服务器无法连接到验证目标"}}
以下是 step-ca 引发的完整错误:
INFO[0126] duration=63.427116ms duration-ns=63427116 fields.time="2021-07-13T09:55:33Z" method=POST name=ca nonce=XX path=/acme/company.int/authz/XX protocol=HTTP/1.1 referer= remote-address=172.16.4.4 request-id=xx response="{\"identifier\":{\"type\":\"dns\",\"value\":\"whoami.company.int\"},\"status\":\"pending\",\"challenges\":[{\"type\":\"dns-01\",\"status\":\"pending\",\"token\":\"XX\",\"url\":\"https://acme.company.int:9000/acme/company.int/challenge/XX/XX\"},{\"type\":\"http-01\",\"status\":\"pending\",\"token\":\"XX\",\"url\":\"https://acme.company.int:9000/acme/company.int/challenge/XX/XX\"},{\"type\":\"tls-alpn-01\",\"status\":\"pending\",\"token\":\"XX\",\"url\":\"https://acme.company.int:9000/acme/company.int/challenge/XX/XX\",\"error\":{\"type\":\"urn:ietf:params:acme:error:connection\",\"detail\":\"The server could not validation target\"}}],\"wildcard\":false,\"expires\":\"2021-07-14T09:54:24Z\"}" size=872 status=200 user-agent="containous-traefik/2.4.8 xenolf-acme/4.3.1 (release; linux; amd64)" user-id=
这是 Traefik config.toml
[api]
insecure = true
dashboard = true
debug = true
[certificatesResolvers]
[certificatesResolvers.myresolver]
[certificatesResolvers.myresolver.acme]
caServer = "https://acme.compagny.int:9000/acme/company.int/directory"
email = "[email protected]"
storage = "/etc/traefik/acme/acme.json"
[certificatesResolvers.myresolver.acme.tlsChallenge]
[providers]
[providers.docker]
watch = true
network = "traefik_webgateway"
swarmmode = false
exposedbydefault = false
[providers.file]
filename = "traefik.toml"
directory = "/etc/traefik"
以下是 step-ca 服务的 /home/step/config/ca.json:
{
"root": "/home/step/certs/root_ca.crt",
"federatedRoots": [],
"crt": "/home/step/certs/intermediate_ca.crt",
"key": "/home/step/secrets/intermediate_ca_key",
"address": ":9000",
"insecureAddress": "",
"dnsNames": [
"acme.company.int"
],
"authority": {
"provisioners": [
{
"type": "JWK",
// [...]
},
"encryptedKey": "xxx"
},
{
"type": "ACME",
"name": "company.int",
"forceCN": true,
"claims": {
"maxTLSCertDuration": "2160h0m0s",
"defaultTLSCertDuration": "2160h0m0s"
}
},
{
"type": "ACME",
"name": "acme"
}
],
"template": {},
"backdate": "1m0s"
},
"tls": {
"cipherSuites": [
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"
],
"minVersion": 1.2,
"maxVersion": 1.3,
"renegotiation": false
}
}
答案1
只是一个参数问题。
我以前启动 step-ca 服务时,参数--resolver
是 DNS 服务器的 IP,但需要添加 DNS 服务器的端口,否则 setp-ca 会无法查找域名。
:53
所以我的问题的答案就是在 IP 末尾添加,就像这样
step-ca --resolver="10.14.2.2:53"