Я пытаюсь написать .netCore 3.1 API в контейнере Ubuntu Linux, который запускает эквивалент этой команды Curl.
РАБОТАЮЩАЯ LINUX КОМАНДА КОНТЕЙНЕРНОЙ ЧАСТИ:
curl --cacert /etc/root/trustedroot.crt --cert /etc/mutualauth/tls.crt --key /etc/mutualauth/tls.key
--header "SOAPAction:actionName" --data @test.xml https://this.is.the/instance --verbose
Enter PEM pass phrase: *****
<Success...>
Мы используем Windows ноутбуков для разработки, поэтому все начинается с Windows.
Пока у меня есть следующий HttpClientHandler, который мой HttpClient использует на машине разработки Windows. Этот код работает на Windows с сертификатом на моем локальном компьютере и в личных хранилищах текущего пользователя и не работает в Linux:
WORKING WINDOWS HTTPCLIENTHANDLER CODE:
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
try
{
var cert = store.Certificates.Find(X509FindType.FindByThumbprint, "<<cert thumbprint here>>", true);
var handler = new HttpClientHandler
{
ClientCertificateOptions = ClientCertificateOption.Manual,
SslProtocols = SslProtocols.Tls12,
AllowAutoRedirect = false,
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
};
handler.ClientCertificates.Add(cert[0]);
}
catch (Exception e)
{
//Handle errors
}
finally
{
store.Close();
}
Сертификат, который я импортировал, был в формате .PFX, так что, насколько я понимаю, пароль был введен во время импорта, и код для Windows не должен быть связан с этим.
Упомянутая выше команда Curl работает из контейнера. Таким образом, согласно этому логу c, если он закодирован или настроен правильно, код должен иметь возможность делать то же самое. На мой взгляд, команда Curl, показанная выше, содержит четыре элемента, которые мне необходимо учитывать в моем HttpClientHandler:
- Сертификат Trusted Root (CA): / etc / root /trustedroot.crt
- Сертификат TLS: / etc / mutauth / tls.crt
- Закрытый ключ - / etc / mutauth / tls.key
- Ключевая фраза PEM
Я читал об этом в течение нескольких месяцев и видел различные статьи и сообщения о переполнении стека, но есть ошеломляющее количество переменных и деталей, связанных с SSL, и я не могу найти ничего, что напрямую затрагивает эту проблему так, чтобы это имело смысл для меня с моим ограниченным пониманием.
У меня также есть возможность запуска сценария Linux во время развертывания добавить различные / другие форматы сертификатов / ключей в хранилища / файловую систему в контейнере. Именно так я и получаю сертификаты и ключи в контейнере, поэтому у меня есть некоторый контроль над тем, что я могу сделать и здесь:
LINUX СЦЕНАРИЙ КОНФИГ:
cp /etc/root/trustedroot.crt /usr/share/ca-certificates
cp /etc/mutualauth/tls.crt /usr/share/ca-certificates
cp /etc/mutualauth/tls.key /etc/ssl/private
echo "trustedroot.crt" >> /etc/ca-certificates.conf
echo "tls.crt" >> /etc/ca-certificates.conf
update-ca-certificates
dotnet wsdltest.dll --environment=Production --server.urls http://*:80
Я не верю, что могу получить двоичный файл .PFX в контейнер из-за политик и ограничений безопасности, но я определенно могу получить его форматы сертификатов и ключей в строковом коде контейнер.
... так что, если есть способ использовать разные стили сертификатов, которые я могу извлечь из .PFX или указать пароль и сертификат, когда сервер «раскручивается» чтобы мой код не требовал ввода пароля, это тоже сработало бы - возможно, мне просто не хватало чего-то базового c в конфигурации Linux.
Кто-нибудь будет так любезен, чтобы указать мне правильное направление? узнать, как я могу поднять свой код HttpClientHandler ИЛИ Linux конфиг, чтобы иметь возможность сделать этот вызов API? Любые идеи приветствуются на этом этапе, это было занозой в моей стороне в течение долгого времени ... Большое спасибо!