174 lines
7.6 KiB
C#
174 lines
7.6 KiB
C#
using System;
|
|
using System.Net.Http;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Security.Cryptography.X509Certificates;
|
|
using SystemX.Core.DB;
|
|
using SystemX.Core.Services;
|
|
using WebApi.Library.Enums;
|
|
using WebApi.Project.ProxyKMS.Models;
|
|
|
|
namespace WebApi.Project.ProxyKMS.Services
|
|
{
|
|
public class KmsService : HttpService
|
|
{
|
|
private readonly IServiceScopeFactory _scopeFactory;
|
|
private readonly ConfigService<ProxyKMSConfig>? _configService;
|
|
|
|
private API KmsApi = new API();
|
|
|
|
public KmsService(IServiceProvider serviceProvider, IServiceScopeFactory scopeFactory, ConfigService<ProxyKMSConfig> configSerice)
|
|
{
|
|
_scopeFactory = scopeFactory;
|
|
_configService = configSerice;
|
|
|
|
KmsApi = _configService.GetConfig().API.Find(x=>x.ApiName.ToLower() == "kms");
|
|
}
|
|
|
|
public async Task<RESPONSE?> PostKms<REQUEST,RESPONSE>(REQUEST request, string guid = "", [CallerMemberName] string memberName = "") where REQUEST : class where RESPONSE : class
|
|
{
|
|
RESPONSE? response = default(RESPONSE);
|
|
|
|
LogXnet.WriteLine($"KmsService.PostKms::{memberName}", LogXLabel.Debug);
|
|
|
|
if (request != null)
|
|
{
|
|
var function = KmsApi.Functions.Find(x => x.Name == memberName);
|
|
response = await PostJsonAsync<REQUEST, RESPONSE>($"{function.Url}", request);
|
|
}
|
|
|
|
return response;
|
|
}
|
|
|
|
public async Task<RESPONSE?> PutKms<REQUEST, RESPONSE>(REQUEST request, string guid = "", [CallerMemberName] string memberName = "") where REQUEST : class where RESPONSE : class
|
|
{
|
|
RESPONSE? response = default(RESPONSE);
|
|
|
|
LogXnet.WriteLine($"KmsService.PutKms::{memberName}", LogXLabel.Debug);
|
|
|
|
if (request != null)
|
|
{
|
|
var function = KmsApi.Functions.Find(x => x.Name == memberName);
|
|
response = await PutJsonAsync<REQUEST, RESPONSE>($"{function.Url}", request);
|
|
}
|
|
|
|
return response;
|
|
}
|
|
|
|
|
|
public override async Task<RESPONSE?> PostJsonAsync<REQUEST, RESPONSE>(string url, REQUEST request, short timeOutSeconds = 5) where REQUEST : class where RESPONSE : class
|
|
{
|
|
RESPONSE response = null;
|
|
Guid guid = Guid.NewGuid();
|
|
var handler = GetClientHandler();
|
|
using (HttpClient httpClient = new HttpClient(handler))
|
|
{
|
|
try
|
|
{
|
|
short timeOutSec = SetTimeout(timeOutSeconds);
|
|
httpClient.Timeout = new TimeSpan(0, 0, timeOutSec);
|
|
httpClient.BaseAddress = new Uri(url ?? "");
|
|
LogXnet.WriteLine($"[POST] Request({guid})::{url}{Environment.NewLine}{request?.ToJson()}", LogXLabel.HTTP);
|
|
DateTime requestTime = DateTime.Now;
|
|
|
|
// 추가된 인증서 정보 출력
|
|
foreach (X509Certificate2 c in handler.ClientCertificates)
|
|
{
|
|
LogXnet.WriteLine("Subject: " + c.Subject);
|
|
LogXnet.WriteLine("Issuer: " + c.Issuer);
|
|
LogXnet.WriteLine("Thumbprint: " + c.Thumbprint);
|
|
LogXnet.WriteLine("NotBefore: " + c.NotBefore);
|
|
LogXnet.WriteLine("NotAfter: " + c.NotAfter);
|
|
LogXnet.WriteLine("----------------------------");
|
|
}
|
|
|
|
response = await (await httpClient.PostAsJsonAsync(url, request)).Content.ReadFromJsonAsync<RESPONSE>();
|
|
LogXnet.WriteLine($"[POST] Rseponse({guid}) ({(DateTime.Now - requestTime).TotalSeconds} sec)::{url}{Environment.NewLine}{response?.ToJson()}", LogXLabel.HTTP);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
LogXnet.WriteLine(e);
|
|
LogXnet.WriteLine(e?.InnerException?.InnerException?.Message, LogXLabel.Exception);
|
|
}
|
|
}
|
|
|
|
return response;
|
|
}
|
|
|
|
public virtual async Task<RESPONSE?> PutJsonAsync<REQUEST, RESPONSE>(string url, REQUEST request, short timeOutSeconds = 5) where REQUEST : class where RESPONSE : class
|
|
{
|
|
RESPONSE? response = default(RESPONSE);
|
|
Guid guid = Guid.NewGuid();
|
|
|
|
var handler = GetClientHandler();
|
|
using (HttpClient httpClient = new HttpClient(handler))
|
|
{
|
|
try
|
|
{
|
|
var timeOutSec = SetTimeout(timeOutSeconds);
|
|
httpClient.Timeout = new TimeSpan(0, 0, timeOutSec);
|
|
httpClient.BaseAddress = new Uri($"{url}");
|
|
|
|
LogXnet.WriteLine($"[PUT] Request({guid})::{url}{Environment.NewLine}{request?.ToJson()}", LogXLabel.HTTP);
|
|
|
|
DateTime requestTime = DateTime.Now;
|
|
var res = await httpClient.PutAsJsonAsync(url, request);
|
|
|
|
// 추가된 인증서 정보 출력
|
|
foreach (X509Certificate2 c in handler.ClientCertificates)
|
|
{
|
|
LogXnet.WriteLine("Subject: " + c.Subject);
|
|
LogXnet.WriteLine("Issuer: " + c.Issuer);
|
|
LogXnet.WriteLine("Thumbprint: " + c.Thumbprint);
|
|
LogXnet.WriteLine("NotBefore: " + c.NotBefore);
|
|
LogXnet.WriteLine("NotAfter: " + c.NotAfter);
|
|
LogXnet.WriteLine("----------------------------");
|
|
}
|
|
|
|
response = await res.Content.ReadFromJsonAsync<RESPONSE>();
|
|
|
|
LogXnet.WriteLine($"[PUT] Rseponse({guid}) ({(DateTime.Now - requestTime).TotalSeconds} sec)::{url}{Environment.NewLine}{response?.ToJson()}", LogXLabel.HTTP);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
LogXnet.WriteLine(e);
|
|
LogXnet.WriteLine(e?.InnerException?.InnerException?.Message, LogXLabel.Exception);
|
|
}
|
|
}
|
|
|
|
return response;
|
|
}
|
|
|
|
protected override HttpClientHandler GetClientHandler()
|
|
{
|
|
HttpClientHandler clientHandler = new HttpClientHandler();
|
|
|
|
//인증서가 경로에 있으면
|
|
if (File.Exists(KmsApi.CertPemPath) == true && File.Exists(KmsApi.CertKeyPath) == true)
|
|
{
|
|
LogXnet.WriteLine($"Cert.Pem Path:{KmsApi.CertPemPath}", LogXLabel.Debug);
|
|
LogXnet.WriteLine($"Cert.Key Path:{KmsApi.CertKeyPath}", LogXLabel.Debug);
|
|
var cert = X509Certificate2.CreateFromPemFile(KmsApi.CertPemPath, KmsApi.CertKeyPath);
|
|
cert = new X509Certificate2(cert.Export(X509ContentType.Pkcs12));
|
|
clientHandler.ClientCertificates.Add(cert);
|
|
}
|
|
else
|
|
{
|
|
LogXnet.WriteLine($"File not exist. Cert.Pem Path:{KmsApi.CertPemPath}", LogXLabel.Warning);
|
|
LogXnet.WriteLine($"File not exist. Cert.Key Path:{KmsApi.CertKeyPath}", LogXLabel.Warning);
|
|
}
|
|
|
|
//ssl 인증서 무시
|
|
LogXnet.WriteLine($"CertificateVerify:{KmsApi.CertificateVerify}", LogXLabel.Debug);
|
|
if (KmsApi.CertificateVerify == false)
|
|
{
|
|
clientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) =>
|
|
{
|
|
return true;
|
|
};
|
|
}
|
|
|
|
return clientHandler;
|
|
}
|
|
}
|
|
}
|