NixOS — сертификат Let's Encrypt не распознается Traefik (работает в Nginx)
Я пытаюсь запустить демонстрационное приложение Node.js на поддомене, используя обратный прокси-сервер Traefik. Я создаю подстановочный сертификат Let's Encrypt с опцией security.acme. Когда я импортирую сертификат в конфигурацию Nginx, он работает правильно. Однако когда я пытаюсь добавить его в Traefik, я получаю следующую ошибку:
Безопасное соединение не удалось
Произошла ошибка во время подключения к SSL-узлу hello.domain.com нет сертификата для запрошенного DNS-имени.
Код ошибки: SSL_ERROR_UNRECOGNIZED_NAME_ALERT.
The page you are trying to view cannot be shown because the authenticity of the received data could not be verified. Please contact the website owners to inform them of this problem.
Вот моя конфигурация.nix:
{ pkgs, ... }: {
# imports = [ ... ];
config = {
environment.systemPackages = with pkgs; [
openssl
git
nodejs
yarn
nodePackages.npm
];
security.acme = {
acceptTerms = true;
defaults.email = "name@domain.com";
certs."domain.com" = {
domain = "domain.com";
extraDomainNames = [ "*.domain.com" ];
dnsProvider = "ovh";
dnsPropagationCheck = true;
credentialsFile = "/etc/nixos/credentials.txt";
};
};
services.traefik = {
enable = true;
staticConfigOptions = {
global = {
checkNewVersion = false;
sendAnonymousUsage = false;
};
entryPoints = {
web = {
address = ":80";
http.redirections.entrypoint = {
to = "websecure";
scheme = "https";
};
};
websecure.address = ":443";
};
providers.docker.exposedByDefault = false;
};
dynamicConfigOptions = {
tls = {
stores.default = {
defaultCertificate = {
certFile = "/var/lib/acme/domain.com/cert.pem";
keyFile = "/var/lib/acme/domain.com/key.pem";
};
};
certificates = [
{
certFile = "/var/lib/acme/domain.com/cert.pem";
keyFile = "/var/lib/acme/domain/key.pem";
stores = "default";
}
];
};
http.routers.hello = {
rule = "Host(`hello.domain.com`)";
entryPoints = [ "websecure" ];
service = "hello";
tls = true;
};
http.services.hello = {
loadBalancer.servers = [{
url = "http://localhost:8000";
}];
};
};
};
systemd.services."hello-world" = {
description = "Hello World";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "simple";
ExecStart = "${pkgs.nodejs}/bin/node /etc/nixos/app.js";
Restart = "always";
RestartSec = "3";
};
};
networking.firewall.allowedTCPPorts = [ 80 443 8000 ];
users.users.traefik.extraGroups = [ "docker" ];
};
}
Когда я комментирую эту часть:
# stores.default = {
# defaultCertificate = {
# certFile = "/var/lib/acme/domain.com/cert.pem";
# keyFile = "/var/lib/acme/domain.com/key.pem";
# };
# };
Я получаю сообщение «Предупреждение: впереди потенциальная угроза безопасности», но могу перейти на страницу субдомена. Это связано с тем, что Traefik использует сертификат по умолчанию:
| Common Name (CN)|TRAEFIK DEFAULT CERT|
|---|---|
|Organization (O)|<Not Part Of Certificate>|
|Organizational Unit (OU)|<Not Part Of Certificate>|
|Common Name (CN)|TRAEFIK DEFAULT CERT|
|Organization (O)|<Not Part Of Certificate>|
|Organizational Unit (OU)|<Not Part Of Certificate>|
|Issued On|Monday, May 29, 2023 at 10:48:12 AM|
|Expires On|Tuesday, May 28, 2024 at 10:48:12 AM|
Как я могу исправить свою конфигурацию, чтобы правильно использовать сертификат Let’s Encrypt Wildcard с помощью Treafik?
1 ответ
У вас опечатка в пути к файлу ключа для подстановочного сертификата. Вот правильная версия:
certificates = [
{
certFile = "/var/lib/acme/domain.com/cert.pem";
keyFile = "/var/lib/acme/domain.com/key.pem";
stores = "default";
}
];