JSON แแแแฎแแแแแฌแแ แ แฆแแ แแแแแแแแแก แแแ แแแแจแ
แกแแฅแแ แแแแแแจแ แแแแฎแแ แชแแแแแแฃแแแ แกแแฅแแ แแแแแแก แแแแแแแแแแแแแแกแแแ แแแแกแแแแแ แฆแแ แแแแแแแแแก แแแแแ แแแ NextGenPSD2 XS2A แฉแแ แฉแแก แกแแคแฃแซแแแแแ. แขแแฅแแแแฃแ แ แแแแแกแแแ แแกแแ แฆแแ แแแแแแแแ แฌแแ แแแแแแแแก RESTful API-แก, แ แแแแแกแแช แแฅแแแงแแแแก แแแแแ แแจแแก แแแแกแแฎแฃแ แ แกแแแแแแฎแแ แแแแกแแฎแฃแ แแแแก แแ แแแแแแแ แ (แแแกแแ), แแแแแแกแฃแ แแ Account Servicing Payment Service Provider (ASPSP) แแ แ แแแแแก แแแแแงแแแแแแช แจแแฃแซแแแ แแแกแแแ แแฎแแ แแก แแ แแแแแแแ แก (แแแ), แแแแแแกแฃแ แแ Third Party Provider (TPP).
API-แก แฃแกแแคแ แแฎแแแแแก แแแแแแ, แกแฎแแ แกแแจแฃแแแแแแแแแ แแ แแแ, แแแแแงแแแแแฃแแแ แชแแคแ แฃแแ แฎแแแแแฌแแ แ. แฆแแ แแแแแแแแแก แคแแ แแแแแจแ แแแคแแ แแแชแแแก แแแชแแแแกแแก แแแแแกแแแแ แ HTTP แแแแฎแแแแ (Request) แแ แแแกแฃแฎแ (Response) แชแแคแ แฃแแแ แฎแแแแแฌแแ แแแแ แจแแกแแแแแแกแ แแแแแฎแแแแแก แแ แแแแแกแฃแฎแแก แแแแ . แฎแแแแแฌแแ แ แฎแแ แชแแแแแแแ "JSON แแแแฎแแแแแฌแแ แแก (JWS) แแแแฎแแ แชแแแแแแแก แกแแฎแแแแซแฆแแแแแแ แฆแแ แคแแแแแกแแแแก แกแแกแขแแแแจแ" แกแแฎแแแแซแฆแแแแแแแก แแแฎแแแแแ, แ แแแแแแช แแแแแก แแฎแ แแ แซแแ แแแแแจแ แแคแฃแซแแแแ "Open Banking Europe. JSON Web Signature Profile for Open Banking" แแ "RFC 7515 - JSON Web Signature (JWS)"-แก.
แ แแแแแแขแแ แ แจแแแชแแแก แแ แซแแ แแแแ แแ แแแฅแขแก แแ แ แแแแแแแแ แแแแแแแแก
แแก แแ แแก แแแแแแแแแแ, แ แแแแแก แแแฎแแแ แแแแ แแแแแฎแกแแแแแฃแแ แกแขแแแแแ แขแแ แจแแกแแซแแแแแแแ HTTP แแแแฎแแแแแก แแ HTTP แแแกแฃแฎแแก แแแแแชแแแแแแ แฎแแแแแฌแแ แแก แจแแฅแแแ แแ แแ แกแแแฃแแ แฎแแแแแฌแแ แแก แจแแแแฌแแแแ.
แแแแแแแแแแ แแแฌแแ แแแแ C#-แแก แแ แแแ แแแแ แแแแก แแแแแ แแ แแแแกแแแแแแ .NET Standard 2.0-แแแ. แแแแแแแแแแฃแแแ แแฎแแแแ แแแแแแแแ Microsoft-แแก แฌแแ แแแแแฃแ แแแแแแแแแขแแแแ.
แแแแแแแแแแแก แแแแแงแแแแแแก แแแแแแแแ แแแแแแแกแแแฃแแแ แแฅ SampleConsole
แแก แแ แแก แแแแแแแแแแ, แ แแแแแแช แแแแจแแแแแแแแแ แแแแ แขแแแแแก TBC.OpenBanking.Jws แแแแแแแแแแแก แแแแแงแแแแแแก.
แแแแแแแแแแ แแแฌแแ แแแแ C#-แแก แแ แแแ แแแแ แแแแก แแแแแ แแ แแแแกแแแแแแ .NET Standard 2.0-แแแ. แแแแแแแแแแฃแแแ แแฎแแแแ แแแแแแแแ Microsoft-แแก แฌแแ แแแแแฃแ แแแแแแแแแขแแแแ.
แแแแแแแแแแ แจแแแชแแแก แแ แซแแ แแแแ แแแแกแก
- class TBC.OpenBanking.Jws.Http.JwsMessageHandler DelegatingHandler-แแก แจแแแแแแแแ แแแแกแ, แ แแแแแจแแช แแแแฎแแ แชแแแแแแฃแแแ TBC.OpenBanking.Jws-แแก แแแฎแแแ แแแแ แฆแแ แแแแแแแแแก แแแแฎแแแแแแแก แจแแกแแแแแแกแแ HTTP แแแแฎแแแแแก แฎแแแแแฌแแ แ แแ HTTP แแแกแฃแฎแแก แฎแแแแแฌแแ แแก แจแแแแฌแแแแ
- class TBC.OpenBanking.Jws.Http.JwsClientOptions IOptions แแแขแแ แคแแแกแแก (Microsoft.Extensions.Options) แแแแแแแแแขแแชแแแก, แ แแแแแแช แแแซแแแแ แกแแจแฃแแแแแแก แฎแแแแแฌแแ แแก แจแแฅแแแแกแแแแแก แแ แจแแแแฌแแแแแกแแแแแก แกแแญแแ แ แแแ แแแแขแ แแแ แแแ แแแ แแแแคแแแฃแ แแชแแแแแ
JwsMessageHandler-แแก แแแแกแ แแซแแแแ แกแแจแฃแแแแแแก แฉแแฏแแแ Request-แแก แแ Response-แแก แฏแแญแแจแ แแ แจแแกแแแแแแกแแ Request-แก แแแแแแ แฎแแแแแฌแแ แ, แฎแแแ Response-แก แแแงแแแแแ แฎแแแแแฌแแ แ แจแแแแแฌแแแ.
แแแแแแแแแแแก แแแแแงแแแแแแก แแแแแแแแ แแแแแแแกแแแฃแแแ แแฅ WebApiHttpClientExample
แ แแแแแแขแแ แแจแ แแแชแแแฃแแแ แกแแแ แแแแแแแแ
แแก แแ แแก TBC.OpenBanking.Jws แแแแแแแแแแแก แแแแแงแแแแแแก แแแแแแแแ.
แแแแแขแแแแแ แคแแแแแแ:
- "HttpRequest-001.txt" โ แขแแฅแกแขแฃแ แ แคแแแแ, แ แแแแแแช แจแแแชแแแก แกแแแแแแแแแ HTTP แแแแฎแแแแแก
- "HttpResponse-001.txt" โ แขแแฅแกแขแฃแ แ แคแแแแ แ แแแแแแช แจแแแชแแแก แกแแแแแแแแแ HTTP แแแกแฃแฎแก
- keyandcert.pfx โ แแแ แแแ แแแกแแฆแแแแก แแ แกแแ แขแแคแแแแขแแก แจแแแชแแแแ แคแแแแ. แแก แแแกแแฆแแแ แแ แกแแ แขแแคแแแแขแ แแแแแแงแแแแแ แฎแแแแแฌแแ แแก แจแแฅแแแแกแแแแแก แแ แจแแแแฌแแแแแกแแแแแก
- rootCACert.crt โ แซแแ แ แกแแ แขแแคแแแแขแ.
แงแฃแ แแแฆแแแ! แแแแกแแแแแก, แ แแ แแ แแแ แแแ แฃแจแแชแแแแแ แแแฃแจแแแก, "rootCACert.crt" แคแแแแจแ แแแแแแแกแแแฃแแ แกแแ แขแแคแแแแขแ แฃแแแ แแแแแแแแแกแแ Windows-แแก "Trusted Root Certificate Authorities"-แก แกแแแแแกแจแ. แกแแฅแแ แแแแจแแ, แ แแ แฎแแแแแฌแแ แแก แจแแแแฌแแแแแจแ แแกแแแ แจแแแแก แแ แกแแ แขแแคแแแแขแแก แจแแแแฌแแแแ, แ แแแแแก แแแฌแงแแแแ แแแ แแแ แแแกแแฆแแแแ แจแแแฅแแแ แฎแแแแแฌแแ แ. แกแแ แขแแคแแแแขแแก แจแแแแฌแแแแแกแแก แแกแแแ แแแฌแแแแแ แกแแแแแ แแฃ แแ แ แแ แกแแ แขแแคแแแแขแแก "แแจแแแแแ". แแฃ แกแแ แขแแคแแแแขแ แแ แแ แแก แกแแแแ, แฎแแแแ แฎแแแแแฌแแ แแก แจแแแแฌแแแแแก แจแแชแแแแ.
แแ แแแ แแแแก แแฃแจแแแแแก แแแแแแแ แแแ แแกแแแแ:
- แแ แแแ แแแ แแแแฎแฃแแแแก แแแ แแ แแแกแแฆแแแก แแ แกแแ แขแแคแแแแขแก "keyandcert.pfx" แคแแแแแแแ
- HTTP แแแแฎแแแแแก แฎแแแแแฌแแ แ
- แแ แแแ แแแ แแแแฎแฃแแแแก แแ แแแ แกแแแก "HttpRequest-001.txt" แคแแแแก. แแฆแแแก แแแแฎแแแแแก แแแแกแแ แแแแแก (headers) แแ แขแแแแก (body) แจแแแแแแก
- แแแฆแแแฃแแ แแแแแชแแแแแแ แแ TBC.OpenBanking.Jws แแแฎแแแ แแแแ แฅแแแแก แแแแฎแแแแแก แชแแคแ แฃแ แฎแแแแแฌแแ แแก
- แฅแแแแก แฎแแแแแฌแแ แแ แแแแฎแแแแแก โ แแ แกแแแฃแ แแแแฎแแแแแก แแแแขแแแ แแ แ แแแแกแแ แแ: "digest", แกแแแแช แแแแแแแกแแแฃแแแ แขแแแแก แฐแแจแ แแ "x-jws-signature", แกแแแแช แแแแแแแกแแแฃแแแ แชแแคแ แฃแแ แฎแแแแแฌแแ แ
- แฎแแแแแฌแแ แแแ แแแแฎแแแแ แแแแฎแแแก แคแแแแจแ "SignedRequest.txt"
- แฎแแแแแฌแแ แแแ HTTP แแแแฎแแแแแก แฎแแแแแฌแแ แแก แจแแแแฌแแแแ
- แแ แแแ แแแ แแแแฎแฃแแแแก แแ แแแ แกแแแก "SignedRequest.txt" แคแแแแก. แแฆแแแก แแแแฎแแแแแก แแแแกแแ แแแแแก (headers) แแ แขแแแแก (body) แจแแแแแแก
- แแแฆแแแฃแแ แแแแแชแแแแแแ แแ TBC.OpenBanking.Jws แแแฎแแแ แแแแ แแแแฌแแแแก แแแแฎแแแแแก แชแแคแ แฃแ แฎแแแแแฌแแ แแก
- HTTP แแแกแฃแฎแแก แฎแแแแแฌแแ แ
- แแ แแแ แแแ แแแแฎแฃแแแแก แแ แแแ แกแแแก "HttpResponse-001.txt" แคแแแแก. แแฆแแแก แแแแฎแแแแแก แแแแกแแ แแแแแก (headers) แแ แขแแแแก (body) แจแแแแแแก
- แแแฆแแแฃแแ แแแแแชแแแแแแ แแ TBC.OpenBanking.Jws แแแฎแแแ แแแแ แฅแแแแก แแแแฎแแแแแก แชแแคแ แฃแ แฎแแแแแฌแแ แแก
- แฅแแแแก แฎแแแแแฌแแ แแ แแแแฎแแแแแก โ แแ แกแแแฃแ แแแแฎแแแแแก แแแแขแแแ แแ แ แแแแกแแ แแ: "digest", แกแแแแช แแแแแแแกแแแฃแแแ แขแแแแก แฐแแจแ แแ "x-jws-signature", แกแแแแช แแแแแแแกแแแฃแแแ แชแแคแ แฃแแ แฎแแแแแฌแแ แ
- แฎแแแแแฌแแ แแแ แแแแฎแแแแ แแแแฎแแแก แคแแแแจแ "SignedResponse.txt"
- แฎแแแแแฌแแ แแแ HTTP แแแกแฃแฎแแก แฎแแแแแฌแแ แแก แจแแแแฌแแแแ
- แแ แแแ แแแ แแแแฎแฃแแแแก แแ แแแ แกแแแก "SignedResponse.txt" แคแแแแก. แแฆแแแก แแแแฎแแแแแก แแแแกแแ แแแแแก (headers) แแ แขแแแแก (body) แจแแแแแแก
- แแแฆแแแฃแแ แแแแแชแแแแแแ แแ TBC.OpenBanking.Jws แแแฎแแแ แแแแ แแแแฌแแแแก แแแแฎแแแแแก แชแแคแ แฃแ แฎแแแแแฌแแ แแก
แ แแแแ แช แฎแแแแแ, แแ แแแ แแแแจแ แแแขแแ แแแฃแแแ แงแแแแ แแก แฅแแแแแแ แ แแช แจแแแซแแแแ แแแแญแแ แแแ TBC.OpenBanking.Jws แแแแแงแแแแแแกแแก
TBC.OpenBanking.Jws แแแแกแแแแก แแแแแงแแแแแ แแแแแแแแแก แแแฎแแแแแ
JWS แกแขแแแแแ แขแแ HTTP แแแแฎแแแแแก แฎแแแแแกแแฌแแ แแ แแแญแแ แแแแ แ แแแแแแแแ แแแแแฏแ
- แแแแแชแแแแแแก แจแแแ แแแแแ, แ แแแแแกแแช แฎแแแ แฃแแแ แแแแแฌแแ แแ(แแแแแ แแคแแแ HTTP แแแแฎแแแแแแแ) แแแแแแงแแแแแ แแแแกแ TBC.OpenBanking.Jws.HttpRequestData
- แฎแแแแแแฌแแ แ แแแ แแแ แแแกแแฆแแแแก แจแแกแแแแแแกแ แกแแ แขแแคแแแแขแแก แแ แแแกแ แแจแแแแแ แกแแ แขแแคแแแแขแแแแก, แแแ แแ แซแแ แ (root) แกแแ แขแแคแแแแขแแกแ, แฏแแญแแแก แแแฆแแแ
- แแแแแ แแแแแก แแ แแแ แแแ แแแกแแฆแแแแก แแแแกแแแฆแแ แ, แ แแแแแแแช แแฌแแ แแแ แฎแแแ แแแแแชแแแแแก แแแแแแงแแแแแ แแแแกแ TBC.OpenBanking.Jws.SupportedAlgorithms
- แแแแ แแแฏแแแแก แจแแแแแแแแก แแแแแงแแแแแแ แฎแแแแแฌแแ แแก แจแแฅแแแ แแ แจแแแแแแก HTTP แแแแฎแแแแแจแ แแแแแแแกแแแ แแแแแแงแแแแแ แแแแกแ TBC.OpenBanking.Jws.HttpSigner
แแแแฎแแแแแกแแแแก แแแแแแแงแแแแ แแแแแแ แแแ แแแแแแแแแแแ.
private static void SignHttpRequestSample(
string algorithmName,
string inFileName,
string outFileName,
X509Certificate2 publicKeyCert,
X509Certificate2 privateKeyCert,
ILoggerFactory loggerFactory)
{
try
{
// Get HttpRequestData from HTTP Request
var httpData = ReadHttpRequestDataFromString(File.ReadAllText(inFileName));
// Get certificate chain
// If it is possible, better to cache chain, because chain creation is slow
X509Certificate2Collection chainCertificates = GetCertificateChain(publicKeyCert);
// Get ISigner
var signer = SupportedAlgorithms.CreateSigner(privateKeyCert, algorithmName);
// Create HttpSigner.
// Need ISigner, certificate with signer's public key and
// certificate chain in X509Certificate2Collection
var reqSign = new HttpSigner<HttpRequestData>(loggerFactory.CreateLogger<HttpSigner<HttpRequestData>>())
{
Signer = signer,
SignerCertificate = publicKeyCert,
SignerCertificateChain = chainCertificates
};
// Create signature
reqSign.CreateSignature(httpData);
if (reqSign.IsSignatureCreated)
{
httpData.Headers.Add(HttpMessageData.DigestHeadertName, reqSign.DigestHeaderValue);
httpData.Headers.Add(HttpMessageData.SignatureHeaderName, reqSign.SignatureHeaderValue);
WriteHttpRequestDataToFile(httpData, outFileName);
}
}
catch (Exception x)
{
Console.Error.WriteLine(x.ToString());
}
}แแแ แแแแ แแแแแฏแ: HttpRequestData แแแแกแแก แแแแแฅแขแแก แจแแฅแแแ แแ แจแแแกแแแ. แฎแแแแแฌแแ แแกแแแแแก แกแแญแแ แแ HTTP แแแแฎแแแแแแแ HttpRequestData แแแแกแแก แแแแแฅแขแจแ แแแแแแแแขแแแแ แงแแแแ แแแแกแแ แแ (header-แ), HTTP แแแแแซแแฎแแแแก แแแแแแ (post, get แแ แ.แจ.) แแ HTTP แแแแแซแแฎแแแแก แจแแแแแแกแ (body).
// Get HttpRequestData from HTTP Request
var httpData = ReadHttpRequestDataFromString(File.ReadAllText(inFileName));แแแแ แ แแแแแฏแ: แแแฆแแแ แฎแแแแแแฌแแ แ แแแ แแแ แแแกแแฆแแแแก แกแแ แขแแคแแแแขแแก แแจแแแแแแก (แซแแ แ (root) แกแแ แขแแคแแแแขแแก แแแ แแ) แแ แแฅแแแแ แกแแ แขแแคแแแแขแแแแก แฏแแญแแก. แกแแ แขแแคแแแแขแแแแก แฏแแญแแแก แจแแฅแแแแก แแแแ แจแแแแซแแแแ แแแฎแแ GetCertificateChain แคแฃแแฅแชแแแจแ.
// Get certificate chain
// If it is possible, better to cache chain, because chain creation is slow
X509Certificate2Collection chainCertificates = GetCertificateChain(publicKeyCert);แแแกแแแ แแแแแฏแ: แแแแแ แแแแแก แแ แแแ แแแ แแแกแแฆแแแแก แแแแแแแ. TBC.OpenBanking.Jws.SupportedAlgorithms แแแแกแแก CreateSigner แแแแแแแ แแฅแแแแ ISigner แแแขแแ แคแแแกแแก แแแแแแแแแขแแชแแแก แแแแแฅแขแก. แ แแแแ แช แฎแแแแแ, แคแฃแแฅแชแแแก แแแแแแชแแแ แแแ แแแ แแแกแแฆแแแแก แจแแแชแแแแ X509Certificate2 แแแแแฅแขแ แแ แฎแแแแแฌแแ แแก แแแแแ แแแแแก แขแแฅแกแขแฃแ แ แแแกแแฎแแแแแ.
// Get ISigner
var signer = SupportedAlgorithms.CreateSigner(privateKeyCert, algorithmName);แแฆแแแแแแแแ แแแแแแแ แแแแแ แแฎแแ แแแญแแ แแแแ แแแแแ แแแแแแ:
| แขแแฅแกแขแฃแ แ แแแกแแฎแแแแแ | แแแแแ แแแแแก แแฆแฌแแ แ |
|---|---|
| "RS256" | RSASSA-PKCS1-v1_5 using SHA-256 |
| "RS384" | RSASSA-PKCS1-v1_5 using SHA-384 |
| "RS512" | RSASSA-PKCS1-v1_5 using SHA-512 |
| "PS256" | RSASSA-PSS using SHA-256 and MGF1 with SHA-256 |
| "PS384" | RSASSA-PSS using SHA-384 and MGF1 with SHA-384 |
| "PS512" | RSASSA-PSS using SHA-512 and MGF1 with SHA-512 |
| "ES256" | ECDSA using P-256 and SHA-256 |
| "ES384" | ECDSA using P-384 and SHA-384 |
| "ES512" | ECDSA using P-521 and SHA-512 |
แแแแแฎแ แแแแแฏแ: แฎแแแแแฌแแ แแกแแแแแก แแแงแแแแแ แแแแกแก HttpSigner. แแ แแแแกแก แจแแฃแซแแแ แ แแแแ แช HTTP แแแแฎแแแแแก, แแกแแแ HTTP แแแกแฃแฎแแก แฎแแแแแฌแแ แ. แแแแกแฎแแแแแแ แแ แแก แแฎแแแแ แแ แแแแแชแแแแแแก แแแแกแจแ แ แแช แแแแแแชแแแ. แแ แจแแแแฎแแแแแจแ แแฅแแแแแ HttpSigner แแแแกแแก แแแแแฅแขแ HttpRequestData แแแแแชแแแแ แขแแแแกแแแแแก. แแกแแแ แแแงแแแแแ Signer (แแแ แแแ แแแกแแฆแแแ แแ แแแแแ แแแแ), SignerCertificate (แฎแแแแแแฌแแ แ แแแ แแแ แแแกแแฆแแแแก แจแแกแแแแแแกแ แกแแ แขแแคแแแแขแ) แแ SignerCertificateChain (แกแแ แขแแคแแแแขแแก แแจแแแแแแแก แฏแแญแแ).
แฎแแแแแฌแแ แแก แแแฎแแ แชแแแแแแ CreateSignature แคแฃแแฅแชแแแ, แ แแแแแกแแช แแแแแแชแแแ HTTP แแแแแซแแฎแแแแก แแแแแชแแแแแ แแแแแแแกแแแฃแแ HttpRequestData แแแแกแแก แขแแแแก แแแแแฅแขแแ httpData.
แแฃ แฎแแแแแฌแแ แ แแแกแ แฃแแแ แฌแแ แแแขแแแแ, HttpSigner-แก แแแแ DigestHeaderValue แจแแแแกแแแ แแแแจแแแแแแแแ, แ แแแแแแช แฃแแแ แแแแแแแกแแแก HTTP แแแแฎแแแแแก "digest" แแแแกแแ แแจแ (header) แแ แแแแ SignatureHeaderName แจแแแแกแแแ แแแแจแแแแแแแแ , แ แแแแแแช แฃแแแ แแแแแแแกแแแก HTTP แแแแฎแแแแแก "x-jws-signature" แแแแกแแ แแจแ (header).
// Create HttpSigner.
// Need ISigner, certificate with signer's public key and
// certificate chain in X509Certificate2Collection
var reqSign = new HttpSigner<HttpRequestData>(loggerFactory.CreateLogger<HttpSigner<HttpRequestData>>())
{
Signer = signer,
SignerCertificate = publicKeyCert,
SignerCertificateChain = chainCertificates
};
// Create signature
reqSign.CreateSignature(httpData);แกแฃแ แแก แแ แแก :)
JWS แกแขแแแแแ แขแแ แฎแแแแแฌแแ แแแ HTTP แแแแฎแแแแแก แจแแแแฌแแแแแก แกแญแแ แแแแ แ แแแแแแแแ แแแแแฏแ:
- แแแแแชแแแแแแก แจแแแ แแแแแ, แ แแแแแกแแช แฎแแแ แฃแแแ แแแแแฌแแ แแ(แแแแแ แแคแแแ HTTP แแแแฎแแแแแแแ) แแแแแแงแแแแแ แแแแกแ TBC.OpenBanking.Jws.HttpRequestData
- HTTP แแแแฎแแแแแก แจแแแแฌแแแแ. แ แแจแแช แจแแแแก
- แฎแแแแแฌแแ แแก แจแแแแฌแแแแ
- แกแแ แขแแคแแแแขแแแแก แจแแแแฌแแแแ
- แแแแแขแแแแแ แจแแแแฌแแแแ (แฎแแแแ แซแแแแแแแก แจแแแแฌแแแแ)
แแแแฎแแแแแกแแแแก แแแแแแแงแแแแ แแแแแแ แแแ แแแแแแแแแแแ.
private static void VerifyHttpRequestSignatureSample(string inFileName, ILoggerFactory loggerFactory)
{
try
{
// Get HttpRequestData from HTTP Request
var httpData = ReadHttpRequestDataFromString(File.ReadAllText(inFileName));
var verifier = new HttpSignatureVerifier<HttpRequestData>(
loggerFactory.CreateLogger<HttpSignatureVerifier<HttpRequestData>>())
{
// Disable time check for sample sake
CheckSignatureTimeConstraint = false,
// Disable revocation check for sample sake
CertificateValidationFlags = new CertificateValidationFlags
{
RevocationMode = X509RevocationMode.NoCheck,
VerificationFlags = X509VerificationFlags.AllFlags
}
};
verifier.VerifySignature(httpData, DateTime.Now);
}
catch (Exception x)
{
Console.Error.WriteLine(x.ToString());
}
}แแแ แแแแ แแแแแฏแ: HttpRequestData แแแแกแแก แแแแแฅแขแแก แจแแฅแแแ แแ แจแแแกแแแ. แฎแแแแแฌแแ แแกแแแแแก แกแแญแแ แแ HTTP แแแแฎแแแแแแแ HttpRequestData แแแแกแแก แแแแแฅแขแจแ แแแแแแแแขแแแแ แงแแแแ แแแแกแแ แแ (header-แ), HTTP แแแแแซแแฎแแแแก แแแแแแ (post, get แแ แ.แจ.) แแ HTTP แแแแแซแแฎแแแแก แจแแแแแแกแ (body). แ แแแแ แช แฎแแแแแฌแแ แแก แจแแฅแแแแแแ แแชแแ, แฎแแแแแฌแแ แแก แแแแแชแแแ แแ แแแแฏแแกแขแ แแกแแแ แแแแกแแ แแแแจแแ แแแแแแแกแแแฃแแ.
// Get HttpRequestData from HTTP Request
var httpData = ReadHttpRequestDataFromString(File.ReadAllText(inFileName));แแ แแ แแแฅแขแจแ แแฅแแแ แจแแแแซแแแแ แแแฎแแ แ แแแแ แฎแแแแ แกแ แฃแแคแแกแแแแแ แฆแแ แแแแแแแแแก แแแแก แแแแแซแแฎแแแ, แแแแแฎแแแแ แชแแคแ แฃแแ แฎแแแแแฌแแ แ แแ แชแแคแ แฃแแ แฎแแแแแฌแแ แแก แจแแแแฌแแแแ. แชแแคแ แฃแ แฎแแแแแฌแแ แแกแแแ แแฃแจแแแแ แฎแแ แชแแแแแแแ แแแแฎแแแ แ แแแแกแแก JwsMessageHandler แแแฎแแแ แแแแ.
แแ แแแฅแขแ แฌแแ แแแแแแแแก แแแ แขแแ แแแแแแแก แแ แแแ-แแ แแ GET แแแแแซแแฎแแแแ. แแแแแแแก แแแแแแแแ แแแงแแแแแแแ แแ แแแกแแแ แแแแ, แ แแ, แแแแ แแแแแแแแแ, แฆแแ แแแแแแแแแก แแแแแแแแแขแแชแแแจแ แแแแแแแช แแแแก แจแแฅแแแ แแแแญแแ แแแแแ, แ แแแแแแช แแฅแแแแแแแก แแแ แ แแแแแแแแ แแแแแ แแแแก แจแแคแฃแแแแก
แแแแแแแชแแแก แแแแคแแแฃแ แแชแแ แกแขแแแแแ แขแฃแแแ แแแแแแแแแฃแแแ "appsettings.json" แคแแแแจแ. แแแแฅแแก แแแ แแแแขแ แแแแก แแ แ แฏแแฃแคแ. แแแ แแแแแ แจแแแ แแแแแก แแแ แแแแขแ แแแ, แ แแแแแแช แแแแแแแกแแแฃแแแ "OpenBankingConnection" แกแแฅแชแแแจแ.
- BaseUrl โ แฆแแ แแแแแแแแแก แแแแก แแแกแแแแ แแ
- ClientCertificate โ แแแแแแขแแก (แฉแแแแ) mTLS แกแแ แขแแคแแแแขแแก แแแแแแ แแแแ
แแแแ แแ Jws แฎแแแแแฌแแ แแก แแแ แแแแขแ แแแ, แ แแแแแแช แแแแแแแกแแแฃแแแ "Jws" แกแแฅแชแแแจแ.
- Enabled โ แฎแแแแแฌแแ แแก แแแแแแแแแขแแก แฉแแ แแแ/แแแแแ แแแ
- AlgorithmName โ แฎแแแแแฌแแ แแก แแแแแ แแแแแก แกแแฎแแแ
- SigningCertificate โ แฎแแแแแฌแแ แแก แกแแ แขแแคแแแแขแ (แฃแแแ แจแแแชแแแแแก แแแ แแ/แแแฎแฃแ แฃแ แแแกแแฆแแแกแแช)
- CheckSignatureTimeConstraint โ แฎแแแแแฌแแ แแก แแ แแแก แจแแแฆแฃแแแแก แจแแแแฌแแแแ. แฉแแ แแแ/แแแแแ แแแ
- CheckCertificateRevocationList โ แกแแ แขแแคแแแแขแแก แแแฃแฅแแแแแก แจแแแแฌแแแแ. แฉแแ แแแ/แแแแแ แแแ
- ValidateSignature โ แฎแแแแแฌแแ แแก แจแแแแฌแแแแ. แฉแแ แแแ/แแแแแ แแแ
แกแแ แขแแคแแแแขแแแแกแแแแแก แแแแแแ แแแแ แจแแกแแซแแแแแแแ แแแฃแแแแ แ แแแแ แช แคแแแแจแ แแกแแแ แแแแ แแชแแฃแแ แกแแกแขแแแแก แกแแ แขแแคแแแแขแแแแก แกแแชแแแจแ.
แแ แแแ แแแแก แแฃแจแแแแแกแแแแแก แกแญแแ แแแแ แแ แ แขแแแแก แกแแ แขแแคแแแแขแ. แแแ แแแแ แแ แแก mTLS-แแก แแแแแแขแแก แกแแ แขแแคแแแแขแ, แ แแแแแแช แแแแแแงแแแแแ แแแแแแขแแคแแแแชแแแกแแแแแก แแ แแแแ แ แชแแคแ แฃแแ แฎแแแแแฌแแ แแก แกแแ แขแแคแแแแขแ.
แแแแแแแแ แ แแ แแแฅแขแจแ แแแแแแแแแกแแแแแก แฉแแแ แแแงแแแแแ แแแแแกแ แแแแแแก แฆแแ แแแแแแแแแก แกแแขแแกแขแ แแแ แแแแก, แ แแแแแกแแแแกแแช แแแกแแจแแแแแ แแฎแแแแ แกแแแแแแ แแกแแชแแแชแแแก แแแแ แแแชแแแฃแแ แกแแขแแกแขแ แกแแ แขแแคแแแแขแแแ. แจแแกแแแแแแกแแ แแ แกแแแแแแ แแกแแชแแแชแแแก แกแแ แขแแคแแแแขแ แฃแแแ แแแฆแแ (แแ แแแแแ แแฃแแแแแ แแแ แแแจแแแแแ), แแ แแแกแแแฏแแ แกแฎแแ แแแแแแแแก แกแแขแแกแขแ แแแ แแแ. แแ แแขแแแแแ แงแแแแ แแแแแแกแแแแแก แแ แแแแแ แแ, แแกแ แ แแ แแฎแแแแ แกแแ แขแแคแแแแขแแก แแแแแแแแ แแแแญแแ แแแแแ.
แกแแ แขแแคแแแแขแ แจแแแซแแแแ แแแแแแแแกแแ แคแแแแจแ (แแกแแ แคแแ แแแขแจแ, แ แแแแแแช .NET-แก แแกแแแก. แแแแแแแแแ, PFX-แ) แแ Windows-แแก แกแแ แขแแคแแแแขแแแแก แกแแชแแแจแ.
แคแแแแแก แจแแแแฎแแแแแจแ แกแแ แขแแคแแแแขแแก แแแแแแแแ แฎแแแแ แแกแแแ แกแขแ แแฅแแแแ:
- pfx โ แแ แแก แกแฅแแแแก แกแแฎแแแ แแ แฃแชแแแแแแ แฃแแแ แแแ แฉแแก
- password โ แแฃ แคแแแแก แแแแแก แแแ แแแ, แจแแแแซแแแแ แแ แแแแแแ แแแแแจแ แแแฃแแแแแ. แแแ แแแแก แแแ แ แแฃแชแแแแแแแแ แแแแงแแคแ
@. แแฃ แแแ แแแ แจแแแชแแแก URI แคแแ แแแขแแกแแแแแก แแแฃแฆแแแแ แกแแแแแแแก แจแแแแซแแแแ แ.แฌ. แแกแแแแแแแแแ แแแฃแแแแแ. แแแแแแแแแ แแฃ แแแ แแแจแ แแ แแกp@ssword, @ แกแแแแแแแก แแแแแแ แแ แจแแแแซแแแแ แแแฌแแ แแ %40 โp%40ssword - localhost โ แแแแกแขแแแขแฃแ แ แแแแจแแแแแแแแ แแ แแ แแชแแแแแ
- path โ แคแแแแแก แแแแแแ แแแแ แแแกแแแ
แแแแแแแแแ:
pfx://localhost/c:\\Apps\\Certs\\mycrypto.pfx
pfx://secretword@localhost/c:\\Apps\\Certs\\mycrypto.pfx
แฃแแแ แแแ PFX แคแแแแแก แจแแแแฎแแแแแจแ แจแแกแแซแแแแแแแ แชแแ แแแแ host-แแก แแแขแแแแแ:
pfx:///c:\\Apps\\Certs\\mycrypto.pfx
แกแแชแแแแก แจแแแแฎแแแแแจแ แกแแ แขแแคแแแแขแแก แแแแแแ แแแแแก แแแแแแแแ แฎแแแแ แแกแแแ แกแขแ แแฅแแแแ:
- cert โ แแ แแก แกแฅแแแแก แกแแฎแแแ แแ แฃแชแแแแแแ แฃแแแ แแแ แฉแแก
- StoreLocation โ แจแแแซแแแแ แแงแแก
CurrentUserโ แแแแแแแแ แ แแแแฎแแแ แแแแแก แแแ แซแ แกแแชแแแLocalMachineโ แกแแ แแแ แแก แกแแชแแแ
- StoreName โ แแแแจแแแแแแแ แจแแแซแแแแ แแงแแก แแ แ-แแ แแ แแแแแแแแ StoreName Enum
- CertificateThumbprint โ แแ แแก แกแแ แขแแคแแแแขแแก SHA-1 แแแแแแญแแ
แแแแแแแแแ:
cert:///CurrentUser/My/CBB4A6C757F4F4798B94ABEB621D7C545E0A656E
แกแแแแแแแแแ แแแแแแแชแแแก แซแแ แแแแแ "แคแแกแแฃแแแแ" แแ แแก, แแฃ แ แแแแ แฃแแแ แแแแแแแแคแแแฃแ แแ แแ Startup.cs-แจแ HttpClient-แ แแกแ แ แแ แฎแแแแแฌแแ แ แแ แฎแแแแแฌแแ แแก แจแแแแฌแแแแ แกแฌแแ แแ แแแฎแแแก. แฉแแแฎแแแแ Startup.cs-แจแ. แแแซแแแแแ แกแขแ แแฅแแแ "AddHttpClient".
HttpClient-แแก แแแแแขแแแแกแแก แแแแฅแชแแแ แงแฃแ แแแฆแแแ
- แแแแแ แแแแก แแแกแแแแ แแก (client.BaseAddress) แแฆแแแก แแแแคแแแฃแ แแชแแแแแ
- แแแแแแขแแก แกแแ แขแแคแแแแขแกแแช แแฆแแแก แแแแคแแแฃแ แแชแแแแแ (ClientCertificates.Add)
- แแ แแแแแแแแแกแแแแแก mTLS-แจแ แแแแแจแฃแแแ แกแแ แแแ แแก แกแแ แขแแคแแแแขแแก แจแแแแฌแแแแ (ServerCertificateCustomValidationCallback), แแฃแแชแ แ แแแแฃแ แแ แแแ แแแแจแ แแแแก แแแแแจแแ แแ แฃแแแ แแแฎแแแก!
- HttpClient-แจแ แฎแแแแ MessageHandler-แแก แแแแแขแแแ (AddHttpMessageHandler). แแแ แซแแ, แแแแขแแแ JwsMessageHandler, แ แแแแแแช แแแแแก แแแแแ แแฆแแแก แแแแแแแแแแแก แฎแแแแแฌแแ แแก แแ แแแฆแแแฃแแแก แฎแแแแแฌแแ แแก แจแแแแฌแแแแแก
แแแแแแ แแแแฌแแ แแ แ แแแแ แฃแแแ แแแแแแแแแ แแแแแแแชแแ แแแกแแจแแแแแ:
- แฃแแแ แแแฆแแ/แแจแแแแ แกแแ แขแแคแแแแขแแแ. แแ แแ mTLS-แแก, แแแแ แ แชแแคแ แฃแแ แฎแแแแแฌแแ แแก แแแแก แแแแแแแแกแฌแแแแแแ, แ แแ แแแแ แกแแขแแกแขแ แแแ แแแ แแแแแฎแแแก แกแแแชแแคแแแฃแ แกแแ แขแแคแแแแขแแแก แแ แแแแแแแแแ แแ แแแฃแแ แแ แแแแแแแแแ
- แแแแแแ แกแแขแแกแขแ แแแ แแแแก แแแกแแแแ แแ (Base url)
แแแแ แแแแแชแแแแแแก แแแงแ แแแแแแ แแแฌแแ แแ แแแแคแแแฃแ แแชแแ "appsettings.json" แคแแแแจแ แแ แแแฃแจแแแ แแ แแแ แแแ.
แ แแแแ แช แแชแแ แแก แแ แแก แแแแแแแแแกแขแฃแ แ WebAPI-แแก แแแแแแแชแแ. แแ แแแ-แแ แแ แฅแแแแแแ แ แแกแแช แแแแแแแก, แแ แแก แกแแขแแกแขแ แแแ แแแแจแ แแแแฎแแแแแก (consent) แจแแฅแแแ. แแแจแแแแแก แจแแแแแ แจแแแแซแแแแ แแฃแแแแช cURL-แแก แแแฎแแแ แแแแ แจแแแแแฌแแแ (แแแ แขแแก แแแแจแแแแแแแ แจแแแซแแแแ แแแแกแฎแแแแแแฃแแ แแงแแก แแฅแแแแแแ)
curl http://localhost:24484/CreateConsent
แแฃ แแแแแซแแฎแแแ แแแกแ แฃแแแ แฌแแ แแแขแแแแ API แแแแแ แฃแแแแก แแแแฎแแแแแก แฉแแแแฌแแ แก แแแแฎแแแแแแ แแกแแแก
{"consentStatus":"received","consentId":"ee0e2d45-24e4-4139-b12c-96b4647959bb","_links":{"scaOAuth":{"href":"https://test-openbanking.tbcbank.ge/openbanking/oauth/.well-known/oauth-authorization-server"},"self":{"href":"/0.8/v1/consents/ee0e2d45-24e4-4139-b12c-96b4647959bb"},"status":{"href":"/0.8/v1/consents/ee0e2d45-24e4-4139-b12c-96b4647959bb/status"},"scaStatus":{"href":"/0.8/v1/consents/ee0e2d45-24e4-4139-b12c-96b4647959bb/authorisations/78aae796-bbda-4542-926c-08d99ecf2c91"}}}แแ แแ แแแฅแขแแก แแแฎแแแ แแแแ แแฅแแแ แจแแแแซแแแแ แแแฎแแ แ แ แแแแแแแแแ แฆแแ แแแแแแแแแก API-แจแ. แแ แแแฅแขแ แฆแแ แแแแแแแแแก แแแแแซแแฎแแแแก แแแแแแแแก httpbin แแแ แแแแ แแแ. แแก แแแแแแแ แแ แแแแฎแแแแแก แแแกแฃแฎแจแ แแแ แฃแแแแก แแแแฎแแแแแแแก แจแแแแแแก. แจแแแแแแ แจแแแแซแแแแ แแแฎแแ แกแแแแแแแ แ แ แแแแฎแแแแ แแแแแแแแแ แฎแแแแแฌแแ แแก แแแแแแแก แจแแแแแ.
Httpbin-แแ แจแแกแแแ แแแแแแ mTLS แกแแญแแ แ แแ แแ แแก. แจแแกแแแแแแกแแ แแแญแแ แแแแ แแฎแแแแ แฎแแแแแฌแแ แแก แกแแ แขแแคแแแแขแ. แฎแแแแแฌแแ แแก แกแแ แขแแคแแแแขแ แจแแแซแแแแ แแงแแก แแแแแกแแแแ แ แแฅแแแแก แแแแ แแแแแแแ แแ แแแฃแแ แแแกแแฆแแแแก แฌแงแแแแแก แจแแแชแแแแ แแ แแฃแแแแ แแแแแฎแแแแแฌแแ แแแ (self-signed) แกแแ แขแแคแแแแขแ. แกแแ แขแแคแแแแขแแก แแแแแแ แแแแ แแ แแแ แแแแก แแแ แแแแขแ แแ แฃแแแ แแแแแกแชแแ.
แแก แแ แแก แจแแแแแ, แ แแแแแแช แแ แฃแแแแแ httpbin-แแแ. แแแแฅแชแแแ แงแฃแ แแแฆแแแ แ แแ แแแแแขแแแฃแแแ แแ แ แแแแกแแ แแ (header) "Digest" แแ "X-Jws-Signature". แแ แแแ แแแแกแแ แแ แฎแแแแแฌแแ แแก แแแฌแแแแ. "origin" แแแแจแ แฉแแฌแแ แแแ IP แแแกแแแแ แแ แจแแชแแแแแแ แแ แแ แแแแฃแ แแ.
{
"args": {},
"data": "{ \"Hello\": \"World\" }",
"files": {},
"form": {},
"headers": {
"Content-Length": "20",
"Content-Type": "text/plain; charset=utf-8",
"Digest": "SHA-256=t67VXtAvlq2Gdu3AkoH1wsgYtxfUwfth68FIkjMZbkA=",
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-61851865-5fbef77e6e514a1f4e3b9ecb",
"X-Jws-Signature": "eyJiNjQiOmZhbHNlLCJ4NWMiOlsiTUlJSGJEQ0NCVlNnQXdJQkFnSVVLWTJhM2xWNmtpeHRoN2pRSXlLcEdJQlRKS0l3RFFZSktvWklodmN ... ... ... gAxUjRkW-7Mr5Bll9RusHqBiaFz1eCMLvZV-mwiJrEtMU5A1kFP8EPCf1wR-w"
},
"json": {
"Hello": "World"
},
"origin": "233.252.0.1",
"url": "https://httpbin.org/post"
}

