MTLS в C# для SAP не работает с сертификатамиC#

Место общения программистов C#
Ответить
Anonymous
 MTLS в C# для SAP не работает с сертификатами

Сообщение Anonymous »

Моя цель — реализовать поток OAuth для данной конечной точки системы SAP.
Система SAP доступна с базовой аутентификацией для моего пользователя, и я хочу настроить аутентификацию по сертификату, чтобы мой пользователь не развертывался в облако.
Это то, что мне нужно реализовать:
https://datatracker.ietf.org/doc/html/rfc8705
Для этого я получаю сертификат в виде строки JSON с информацией:
certiticat: "----BEGIN CERTIFICATE----- ...."
закрытый ключ rsa: "- ---BEGIN RSA PRIVATE KEY -----...."
url токена: "...."
При этом у меня есть информация о Python приложение, которое работает именно так, как PoC, и его приходится переписывать на C#:

Код: Выделить всё

import tempfile
import requests
import json
import os
json_file = ".cert.json"
with open(json_file, 'r') as f:
data = json.load(f)['oauth']
client_id = data['clientid']
cert = data['certificate']
key = data['key']
token_endpoint = data['tokenurl']

headers = {
"Accept": "application/json",
"Content-Type": "application/x-www-form-urlencoded",
}

try:
with tempfile.NamedTemporaryFile('w', suffix='.pem', delete=False) as k, tempfile.NamedTemporaryFile('w', suffix='.pem', delete=False) as c:
k.write(key)
c.write(cert)
key_filename = k.name
cert_filename = c.name
query_params = {
"client_id": client_id,
"grant_type": "client_credentials"
}
response = requests.request(
method="POST",
url=token_endpoint,
headers=headers,
cert=(cert_filename, key_filename),
params=query_params
)
print(response.text)
finally:
if key_filename:
os.remove(key_filename)
if cert_filename:
os.remove(cert_filename)
Моя попытка на C# такая:

Код: Выделить всё

/// Load it before
var certificationSecretJson = Encoding.UTF8.GetString(certificationSecretBase64);
var certificateInformation = JsonConvert.DeserializeObject(certificationSecretJson);

var path = Path.GetTempPath();
File.WriteAllText(Path.Combine(path, "cert.pem"), certificateInformation.OAuth.Certificate);
File.WriteAllText(Path.Combine(path, "key.pem"), certificateInformation.OAuth.Key);
var cert7 = X509Certificate2.CreateFromPemFile(Path.Combine(path, "cert.pem"), Path.Combine(path, "key.pem"));
var cert7Eph = new X509Certificate2(cert7.Export(X509ContentType.Pfx));

var handler = new HttpClientHandler();
handler.ClientCertificates.Add(cert7Eph);
handler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) => true;
var client = new HttpClient(handler);

var queryParams = new FormUrlEncodedContent(new[]
{
new KeyValuePair("client_id", certificateInformation.OAuth.ClientId),
new KeyValuePair("grant_type", "client_credentials")
});
var result = await client.PostAsync(certificateInformation.OAuth.TokenUrl, queryParams);
Теперь у меня разные попытки и проблемы:
Когда я пытаюсь использовать cert7 в качестве сертификата, я получаю сообщение «Ошибка аутентификации, поскольку платформа не поддерживает эфемерные ключи». ." в котором я нашел это: Как избежать ошибки о «эфемерных ключах» при использовании файлов PEM в .NET для веб-запросов с MTLS?
Я реализовал экспорт PFX, но теперь получаю:

System.IO.IOException: операция расшифровки не удалась, см. внутреннее исключение.
 ---> System.ComponentModel.Win32Exception (0x80090325) : Цепочка сертификатов выдана ненадежным центром.
   --- Конец внутренней трассировки стека исключений ---
Как я вижу, цепочка сертификатов не нарушена — она работает и на почтальоне, и на Python.
Открыта для любых идей...

Подробнее здесь: https://stackoverflow.com/questions/791 ... rtificates
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»