C# принудительно доверенные сертификаты для Arch Linux
ПРЕДЫСТОРИЯ:
Однажды я спрашивал каким образом можно создать сертификаты под Arch Linux для разработки на .NET Core. Мне дали ответ в этом треде.
Спустя кучу времени я понял, что хочу потрогать GRPC и микросервисы и упёрся в то, что эти самые сертификаты, созданные по гайдлайну не работают.
Не работают они так, как указано вот тут.
После того, как я прочитал справку по grpc на сайте Microsoft, я понял, что вся проблема в том, что сертификаты должны быть принудительно доверенными.
После гугла я понял, что надо было сделать dotnet dev-certs https --trusted, но его в линукс-версии dotnet не сделали. Снова погуглив я начал делать свои сертификаты. Делал утилитой easyrsa3, но эти сертификаты по каким-то причинам не понравились. Делал свои руками - та же история.
ВОПРОС:
Как сделать сертификаты для разработки в arch linux так, чтобы они были доверенными?
ПРИ ЭТОМ:
- я знаю про то, что grpc можно попробовать заставить не проверять подлинность сертификатов, но во-первых это не сработало(возможно я где-то ошибся), а во-вторых, что-то мне подсказывает, что подобный случай будет не единственным и подобные проблемы будут встречаться и дальше в других кейсах.
- Решение желательно выдавать именно для Arch Linux. Причина сугубо субъективная, но тем не менее там свежие пакеты и AUR, что в совокупе сильно упрощает жизнь.
- Я не уверен на 100%, но как я понял, Kestrel'у в остальных случаях так же, как и в конкретном данном достаточно подсунуть адрес сертификата в формате *.pfx в appsettings.json.
UPD: 10.02.2021
Сделал сертификат и пытаюсь теперь скормить его Kestrel'у. Клиент отказывается работать с сервером, продолжая ссылаться на кривой сертификат, незащищённое соединение.
Содержание appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
},
"Certificates": {
"Default": {
"Path": "/home/marko/Certs/devcerts/debug-server.pfx",
"Password": ""
}
}
}
}
Ответы (1 шт):
Для того, чтобы клиентское приложение начало нормально работать (с кастомными сертификатами) вам нужно:
Создать CA (Certificate Authority) сертификаты:
Это можно сделать разными способами, напрямую через openssl, с использованием easy-rsa (рекомендую), гайдов как это делать достаточно много, но в итоге у вас должно получиться два файла *.key и *.crt (в формате PEM).
Создать сертификат для сервера, который будет подписан вашим CA:
Аналогично с предыдущим пунктом, только это уже будет сертификаты, которые будут использоваться в вашем сервере (Kestrel).
Добавить CA в список доверенных на клиентской системе:
sudo trust anchor --store <путь_к_CA_crt>
После этого ваша система начнет доверять всем сертификатам, которые были выданы/подписаны вашим CA.
Если потому нужно будет удалить, то можно:
sudo trust anchor --remove <путь_к_CA_crt>
Настроить Kestrel:
Тут нужно скормить созданные сертификаты и пароль в Kestrel, через переменные окружения или appsettings.json. Тут главное сконвертировать ваши серверные crt/key в pfx (из PEM в PKСS#12 формат), т.к. будут исключения (возможно Kestrel можно настроить и на использование crt/key, но я этого не знаю).
Например так:
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt
Также, возможно есть способ использовать сертификат, который был создан dev-certs (чтобы не создать собственный CA и сертификаты), но пока оно не работает (возможно связано с багом).
В случае с реальными сертификатами все эти действия не понадобятся, т.к. клиентская система и так будет доверять CA.