Auto-renew TLS Certificates with cert-manager
How to deploy and configure cert-manager to automatically renew TLS certificates in your Kubernetes cluster. Works on Raspberry Pi clusters too.
In my last few posts, I touched on the reasons why I chose Traefik as the Ingress Controller of choice for Kubernetes and how I deployed and configured Traefik on my cluster to manage my Let’s Encrypt TLS certificates.
In this post, I’ll introduce how I offloaded TLS certificate management from Traefik to another component and why I did it.
Before we proceed, you may be happy to know that cert-manager is multi-arch, meaning it will work on both amd64, arm64 and armv7 machines. So yes, this works on your Raspberry Pi machines!
What is cert-manager?
cert-manager does exactly what its name says, manage TLS certificates, but in this case, it is built specifically to manage TLS certificates for applications deployed in a Kubernetes environment. It provides useful entity abstractions for TLS certificates in the form of Custom Resource Definitions as a common interface that is significantly more intuitive for the user.
For instance, a TLS certificate can ultimately be reduced to 2 entities: the Issuer of the certificate, and the Certificate itself.
cert-manager provides the exact same abstractions so the user only needs to configure the Issuer and the Certificate and it handles the rest for you.
Why use cert-manager?
You may already be thinking:
Why not use Traefik to manage my TLS certificates as demonstrated in the previous posts?
The keen-eyed readers might have already caught on to this, but for the benefit of those who haven’t, here’s the main reason why I’m using cert-manager:
Offloading TLS certificate management from Traefik to cert-manager would allow for high-availability Traefik deployments
Enablement of HA Traefik
The main obstacle preventing high-availability deployments of Traefik as…
Is there a way to update the TLS certificates in a net/http server without any downtime?
I have a simple https server serving a simple page like so (no error handling for brevity):
I want to use a Let’s Encrypt TLS certificate to serve the content over https. I would like to be able to do certificate renewals and update the certificate in the server without any downtime.
I tried running a goroutine to update the tlsConf :
However, that doesn’t work because the server does not «read in» the changed config. Is there anyway to ask the server to reload the TLSConfig ?
Устранение неполадок с TLS
При возникновении на устройстве проблем с TLS можно предпринять меры по их устранению.
Удаление парольной фразы из файла ключа
Если на компьютере Linux с установлен OpenSSL, можно удалить парольную фразу.
Переименуйте исходный файл ключа.
Создайте новый ключ без парольной фразы.
При выполнении этой команды вам будет предложено ввести парольную фразу ключа.
Дополнительные сведения об OpenSSL см. в документации по OpenSSL.
Преобразование сертификата или ключа TLS в формат PEM
Если у вас установлен OpenSSL, вы можете преобразовать ключ в формат PEM с помощью команды openssl . Например, можно преобразовать ключ из формата DER в формат PEM.
В противном случае для преобразования сертификата в формат PEM можно использовать средство SSL Converter. Дополнительные сведения см. в документации по средству SSL Converter.
Неотвечающая установка после отправки ключа
Если your GitHub Enterprise Server instance не отвечает после отправки ключа TLS, обратитесь в службу поддержки GitHub Enterprise, включая копию сертификата TLS. Убедитесь, что закрытый ключ не включен.
Ошибки допустимости сертификата
Такие клиенты, как веб-браузеры и Git командной строки, будут отображать сообщение об ошибке, если они не могут проверить допустимость сертификата TLS. Это часто происходит с самозаверяющими сертификатами, а также со связанными по цепочке корневыми сертификатами, выданными из промежуточного корневого сертификата, который не распознается клиентом.
Если вы используете сертификат, подписанный центром сертификации (ЦС), файл сертификата, отправляемый в GitHub Enterprise Server, должен включать цепочку сертификатов с корневым сертификатом этого ЦС. Чтобы создать такой файл, присоедините всю цепочку сертификатов (или «пакет сертификатов») к концу сертификата. При этом первым должен быть сертификат субъекта с именем узла. В большинстве систем это можно сделать с помощью следующей команды:
Вы должны иметь возможность скачать пакет сертификатов (например, bundle-certificates.crt ) из центра сертификации или поставщика TLS.
Установка самозаверяющих или недоверенных корневых сертификатов центра сертификации (ЦС)
Если устройство GitHub Enterprise Server взаимодействует с другими компьютерами в сети, которые используют самозаверяющий или недоверенный сертификат, необходимо импортировать корневой сертификат ЦС для подписи в системное хранилище сертификатов, чтобы получить доступ к этим системам по протоколу HTTPS.
Получите корневой сертификат ЦС из локального центра сертификации и проверьте, что он имеет формат PEM.
Скопируйте файл на устройство GitHub Enterprise Server по протоколу SSH в качестве пользователя admin на порту 122.
Подключитесь к административной оболочке GitHub Enterprise Server по протоколу SSH в качестве пользователя admin на порту 122.
Импортируйте сертификат в системное хранилище сертификатов.
Обновление сертификата TLS
Вы можете создать самозаверяющий сертификат или обновить существующий TLS-сертификат для your GitHub Enterprise Server instance с помощью служебной программы командной ghe-ssl-certificate-setup строки. Дополнительные сведения см. в разделе «AUTOTITLE».
Продление (обновление) TLS/SSL сертификата в Exchange
При установке Microsoft Exchange 2019/2016/2013 автоматически выпускаются самоподписанные сертификаты для защиты подключений между клиентами и сервером. Обычно первый SSL сертификат выдается ровно на год. При истечении срока действия этого сертификата, у пользователей при запуске Outlook будет появляться сообщение:

Вы можете обновить сертификат или выпустить новый через графической интерфейс Exchange Admin Center (EAC) или командлетами PowerShell из Exchange Management Shell.
Далее я покажу действия по продлению сертификата в интерфейсе EAC и потом приведу аналогичные команды PowerShell.
Продление сертификата Exchange из Exchange Admin Center
Откройте панель управления Exchange ECP, перейдя по адресу https://msk-mail1/ecp/

Сначала нужно сформировать запрос на продление сертификата. Перейдите в раздел Server -> Certificate. Выберите просроченный сертификат и нажмите кнопку Renew. Сохраните файл запроса (.req) на продление сертификата в сетевую папку.
В консоли EAC статус сертификата изменится на Pending Request.
Передайте req файл на продление сертификата в ваш центр сертификации (это может быть как внешний, так и внутренний Certification authority). На основе вашего reg запроса вам должны сформировать сертификат и вернуть готовый .cer файл.
Выберите ваш сертификат в консоли EAC и нажмите Complete.

Укажите UNC путь к вашему файлу сертификату в сетевой папке и нажмите OK.
Теперь нужно назначить (переназначить) сертификат на сервисы Exchange (обычно сертфикат используется для служб IMAP, POP, IIS).

Перезапустите IIS на сервере Exchange командой:
Статус сертификата в консоли Exchange должен сменится на Valid.
Вы можете экспортировать новый сертификат на другие серверы Exchange. Для этого экспортируйте сертификат в формат .pfx (в нем будет содержаться закрытый ключ, поэтому используйте криптостойкий пароль). Выполните импорт сертификата на целевом сервере Exchange.
Статус сертификата в консоли Exchange должен сменится на Valid.
Продление сертификата Exchange из PowerShell
Выведите полный список сертификатов, установленных в Exchange, и скопируйте отпечаток (ThumbPrint) того сертификата, который нужно продлить. Список сертификатов можно сохранить в txt файл:
Создадим новый запрос на продление сертификата, указав ThumbPrint того сертификата, который нужно продлить, например 12345678901234567890. Следующая команда сформирует файл запроса на продление SSL/TLS сертификата:
Get-ExchangeCertificate -Thumbprint 12345678901234567890| New-ExchangeCertificate -GenerateRequest -RequestFile «\\msk-mail1\share\renew_cert.req» -PrivateKeyExportable:$true
После получение нового сертификата из CA, завершите запрос продления командой:
Import-ExchangeCertificate -FileName \\msk-mail1\share\company_new_sslcert.cer» -PrivateKeyExportable:$true
Теперь активируйте данный SSL сертификат для нужных служб Exchange:
Enable-ExchangeCertificate –Thumbprint 123123123123123123123123123 –Services «IIS, SMTP, POP, IMAP»