Codemaru 1.0.0.0
QR 코드, 모바일 랜딩 페이지, vCard 연락처 저장과 명함 디자인을 한 화면에서 제공하는 디지털 명함 서비스입니다.
로딩중...
검색중...
일치하는것 없음
Codemaru.Services.Certificates.X509CertificateMonitorService 클래스 참조sealed

더 자세히 ...

Codemaru.Services.Certificates.X509CertificateMonitorService에 대한 상속 다이어그램 :
Codemaru.Services.Certificates.X509CertificateMonitorService에 대한 협력 다이어그램:

Public 멤버 함수

Task< CertificateStatusInfoGetStatusAsync (CertificateMonitorOptions options, CancellationToken cancellationToken)

정적 Private 멤버 함수

static IEnumerable< string > FindCertificateFiles (CertificateMonitorOptions options)
static bool IsCertificateCandidate (string path)
static int GetCertificatePriority (string path)
static ? CertificateStatusInfo TryReadCertificate (string path, CertificateMonitorOptions options, List< string > readErrors)
static X509Certificate2 LoadCertificate (string path, CertificateMonitorOptions options)
static X509Certificate2 LoadCertificateFromPem (string path)
static bool IsServerCertificate (X509Certificate2 certificate)
static CertificateStatusInfo SelectBestCertificate (IReadOnlyCollection< CertificateStatusInfo > candidates)
static int GetSelectedFilePriority (string? path)
static CertificateHealthState ResolveState (int remainingDays, CertificateMonitorOptions options)
static string BuildMessage (CertificateHealthState state, int remainingDays, string certificatePath)
static CertificateStatusInfo Failure (string? directory, string message)

상세한 설명

파일 시스템의 X509 인증서를 읽어 만료 상태를 계산합니다.

X509CertificateMonitorService.cs 파일의 20 번째 라인에서 정의되었습니다.

멤버 함수 문서화

◆ BuildMessage()

string Codemaru.Services.Certificates.X509CertificateMonitorService.BuildMessage ( CertificateHealthState state,
int remainingDays,
string certificatePath )
inlinestaticprivate

Message 값을 구성합니다.

매개변수
statestate에 사용할 CertificateHealthState 값입니다.
remainingDaysremaining Days에 사용할 int 값입니다.
certificatePathcertificate Path에 사용할 string 값입니다.
반환값
Build Message 작업에서 생성한 string 결과입니다.

X509CertificateMonitorService.cs 파일의 716 번째 라인에서 정의되었습니다.

720 {
721 string fileName = Path.GetFileName(certificatePath);
722
723 return state switch
724 {
725 CertificateHealthState.Ok =>
726 $"Certificate is valid. Remaining days: {remainingDays}. File: {fileName}",
727
728 CertificateHealthState.Warning =>
729 $"Certificate renewal should be checked. Remaining days: {remainingDays}. File: {fileName}",
730
731 CertificateHealthState.Critical =>
732 $"Certificate expires soon. Remaining days: {remainingDays}. File: {fileName}",
733
734 CertificateHealthState.Expired =>
735 $"Certificate expired. Expired days: {Math.Abs(remainingDays)}. File: {fileName}",
736
737 _ =>
738 $"Certificate state is unknown. Remaining days: {remainingDays}. File: {fileName}"
739 };
740 }

다음을 참조함 : Codemaru.Models.Certificates.Critical, Codemaru.Models.Certificates.Expired, Codemaru.Models.Certificates.Ok, Codemaru.Models.Certificates.Warning.

다음에 의해서 참조됨 : TryReadCertificate().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Failure()

CertificateStatusInfo Codemaru.Services.Certificates.X509CertificateMonitorService.Failure ( string? directory,
string message )
inlinestaticprivate

Failure 작업을 수행합니다.

매개변수
directorydirectory에 사용할 string? 값입니다.
message처리할 메시지입니다.
반환값
Failure 작업에서 생성한 CertificateStatusInfo 결과입니다.

X509CertificateMonitorService.cs 파일의 774 번째 라인에서 정의되었습니다.

775 {
776 return new CertificateStatusInfo
777 {
778 IsSuccess = false,
779 CertificateDirectory = directory ?? string.Empty,
780 State = CertificateHealthState.Error,
781 Message = message
782 };
783 }

다음에 의해서 참조됨 : GetStatusAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ FindCertificateFiles()

IEnumerable< string > Codemaru.Services.Certificates.X509CertificateMonitorService.FindCertificateFiles ( CertificateMonitorOptions options)
inlinestaticprivate

Certificate Files 항목을 찾습니다.

매개변수
options동작을 구성하는 설정입니다.
반환값
Find Certificate Files 작업에서 생성한 IEnumerable<string> 결과입니다.

X509CertificateMonitorService.cs 파일의 147 번째 라인에서 정의되었습니다.

148 {
149 string[] patterns = options.CertificateFilePatterns is { Length: > 0 }
150 ? options.CertificateFilePatterns
151 : ["*.pem", "*.cer", "*.crt", "*.pfx", "*.p12"];
152
153 IEnumerable<string> files = patterns
154 .SelectMany(pattern =>
155 Directory.EnumerateFiles(
156 options.CertificateDirectory,
157 pattern,
158 SearchOption.AllDirectories));
159
160 return files
161 .Where(IsCertificateCandidate)
162 .OrderByDescending(GetCertificatePriority)
163 .ThenByDescending(File.GetLastWriteTimeUtc);
164 }

다음을 참조함 : Codemaru.Options.CertificateMonitorOptions.CertificateDirectory, GetCertificatePriority(), IsCertificateCandidate().

다음에 의해서 참조됨 : GetStatusAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetCertificatePriority()

int Codemaru.Services.Certificates.X509CertificateMonitorService.GetCertificatePriority ( string path)
inlinestaticprivate

Certificate Priority 값을 가져옵니다.

매개변수
pathpath에 사용할 string 값입니다.
반환값
Get Certificate Priority 작업에서 생성한 int 결과입니다.

X509CertificateMonitorService.cs 파일의 237 번째 라인에서 정의되었습니다.

238 {
239 string fileName = Path.GetFileName(path).ToLowerInvariant();
240
241 if (fileName.Contains("-crt.pem", StringComparison.OrdinalIgnoreCase))
242 {
243 return 700;
244 }
245
246 if (fileName.Contains("fullchain", StringComparison.OrdinalIgnoreCase))
247 {
248 return 600;
249 }
250
251 if (fileName.EndsWith(".crt", StringComparison.OrdinalIgnoreCase))
252 {
253 return 500;
254 }
255
256 if (fileName.EndsWith(".cer", StringComparison.OrdinalIgnoreCase))
257 {
258 return 400;
259 }
260
261 if (fileName.EndsWith(".pfx", StringComparison.OrdinalIgnoreCase) ||
262 fileName.EndsWith(".p12", StringComparison.OrdinalIgnoreCase))
263 {
264 return 300;
265 }
266
267 if (fileName.EndsWith(".pem", StringComparison.OrdinalIgnoreCase))
268 {
269 return 100;
270 }
271
272 return 0;
273 }

다음에 의해서 참조됨 : FindCertificateFiles().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetSelectedFilePriority()

int Codemaru.Services.Certificates.X509CertificateMonitorService.GetSelectedFilePriority ( string? path)
inlinestaticprivate

Selected File Priority 값을 가져옵니다.

매개변수
pathpath에 사용할 string? 값입니다.
반환값
Get Selected File Priority 작업에서 생성한 int 결과입니다.

X509CertificateMonitorService.cs 파일의 584 번째 라인에서 정의되었습니다.

585 {
586 if (string.IsNullOrWhiteSpace(path))
587 {
588 return int.MaxValue;
589 }
590
591 string fileName = Path.GetFileName(path).ToLowerInvariant();
592
593 if (fileName.Contains("-crt.pem", StringComparison.OrdinalIgnoreCase))
594 {
595 return 0;
596 }
597
598 if (fileName.Contains("fullchain", StringComparison.OrdinalIgnoreCase))
599 {
600 return 1;
601 }
602
603 if (fileName.EndsWith(".crt", StringComparison.OrdinalIgnoreCase))
604 {
605 return 2;
606 }
607
608 if (fileName.EndsWith(".cer", StringComparison.OrdinalIgnoreCase))
609 {
610 return 3;
611 }
612
613 if (fileName.EndsWith(".pfx", StringComparison.OrdinalIgnoreCase) ||
614 fileName.EndsWith(".p12", StringComparison.OrdinalIgnoreCase))
615 {
616 return 4;
617 }
618
619 return 10;
620 }

다음에 의해서 참조됨 : SelectBestCertificate().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetStatusAsync()

Task< CertificateStatusInfo > Codemaru.Services.Certificates.X509CertificateMonitorService.GetStatusAsync ( CertificateMonitorOptions options,
CancellationToken cancellationToken )
inline

Status Async 값을 가져옵니다.

매개변수
options동작을 구성하는 설정입니다.
cancellationToken취소 요청을 감시하는 토큰입니다.
반환값
Get Status Async 작업에서 생성한 Task<CertificateStatusInfo> 결과입니다.

Codemaru.Services.Certificates.ICertificateMonitorService를 구현.

X509CertificateMonitorService.cs 파일의 54 번째 라인에서 정의되었습니다.

57 {
58 ArgumentNullException.ThrowIfNull(options);
59 cancellationToken.ThrowIfCancellationRequested();
60
61 if (string.IsNullOrWhiteSpace(options.CertificateDirectory))
62 {
63 return Task.FromResult(Failure(options.CertificateDirectory, "Certificate directory is empty."));
64 }
65
66 if (!Directory.Exists(options.CertificateDirectory))
67 {
68 return Task.FromResult(Failure(
70 $"Certificate directory not found: {options.CertificateDirectory}"));
71 }
72
73 try
74 {
75 string[] files = FindCertificateFiles(options).ToArray();
76
77 if (files.Length == 0)
78 {
79 return Task.FromResult(Failure(
81 $"No certificate files were found. Directory: {options.CertificateDirectory}"));
82 }
83
84 List<string> readErrors = [];
85 List<CertificateStatusInfo> candidates = [];
86
87 foreach (string file in files)
88 {
89 cancellationToken.ThrowIfCancellationRequested();
90
91 CertificateStatusInfo? status = TryReadCertificate(file, options, readErrors);
92 if (status is not null)
93 {
94 candidates.Add(status);
95 }
96 }
97
98 if (candidates.Count == 0)
99 {
100 string errorText = readErrors.Count == 0
101 ? "No detailed read errors were captured."
102 : string.Join(Environment.NewLine, readErrors);
103
104 return Task.FromResult(Failure(
105 options.CertificateDirectory,
106 $"Certificate files were found, but none could be loaded.{Environment.NewLine}{errorText}"));
107 }
108
109 CertificateStatusInfo selected = SelectBestCertificate(candidates);
110
111 return Task.FromResult(selected);
112 }
113 catch (OperationCanceledException)
114 {
115 throw;
116 }
117 catch (Exception ex)
118 {
119 return Task.FromResult(Failure(options.CertificateDirectory, ex.Message));
120 }
121 }

다음을 참조함 : Codemaru.Options.CertificateMonitorOptions.CertificateDirectory, Failure(), FindCertificateFiles(), SelectBestCertificate(), TryReadCertificate().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ IsCertificateCandidate()

bool Codemaru.Services.Certificates.X509CertificateMonitorService.IsCertificateCandidate ( string path)
inlinestaticprivate

Is Certificate Candidate 조건을 확인합니다.

매개변수
pathpath에 사용할 string 값입니다.
반환값
Is Certificate Candidate 조건이 충족되면 true이고, 그렇지 않으면 false입니다.

X509CertificateMonitorService.cs 파일의 190 번째 라인에서 정의되었습니다.

191 {
192 string fileName = Path.GetFileName(path).ToLowerInvariant();
193 string extension = Path.GetExtension(path).ToLowerInvariant();
194
195 if (fileName.Contains("key", StringComparison.OrdinalIgnoreCase))
196 {
197 return false;
198 }
199
200 if (fileName.Contains("privkey", StringComparison.OrdinalIgnoreCase))
201 {
202 return false;
203 }
204
205 if (fileName.Contains("chain-only", StringComparison.OrdinalIgnoreCase))
206 {
207 return false;
208 }
209
210 return extension is ".pem" or ".crt" or ".cer" or ".pfx" or ".p12";
211 }

다음에 의해서 참조됨 : FindCertificateFiles().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ IsServerCertificate()

bool Codemaru.Services.Certificates.X509CertificateMonitorService.IsServerCertificate ( X509Certificate2 certificate)
inlinestaticprivate

Is Server Certificate 조건을 확인합니다.

매개변수
certificatecertificate에 사용할 X509Certificate2 값입니다.
반환값
Is Server Certificate 조건이 충족되면 true이고, 그렇지 않으면 false입니다.

X509CertificateMonitorService.cs 파일의 496 번째 라인에서 정의되었습니다.

497 {
498 foreach (X509Extension extension in certificate.Extensions)
499 {
500 if (extension is X509EnhancedKeyUsageExtension eku)
501 {
502 foreach (Oid oid in eku.EnhancedKeyUsages)
503 {
504 if (oid.Value == "1.3.6.1.5.5.7.3.1")
505 {
506 return true;
507 }
508 }
509 }
510 }
511
512 return certificate.Subject.Contains("CN=", StringComparison.OrdinalIgnoreCase);
513 }

다음에 의해서 참조됨 : LoadCertificateFromPem().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ LoadCertificate()

X509Certificate2 Codemaru.Services.Certificates.X509CertificateMonitorService.LoadCertificate ( string path,
CertificateMonitorOptions options )
inlinestaticprivate

Certificate 데이터를 불러옵니다.

매개변수
pathpath에 사용할 string 값입니다.
options동작을 구성하는 설정입니다.
반환값
Load Certificate 작업에서 생성한 X509Certificate2 결과입니다.

X509CertificateMonitorService.cs 파일의 388 번째 라인에서 정의되었습니다.

391 {
392 string extension = Path.GetExtension(path).ToLowerInvariant();
393
394 if (extension is ".pfx" or ".p12")
395 {
396 return string.IsNullOrEmpty(options.PfxPassword)
397 ? new X509Certificate2(path)
398 : new X509Certificate2(path, options.PfxPassword);
399 }
400
401 if (extension == ".pem")
402 {
403 return LoadCertificateFromPem(path);
404 }
405
406 return new X509Certificate2(path);
407 }

다음을 참조함 : LoadCertificateFromPem(), Codemaru.Options.CertificateMonitorOptions.PfxPassword.

다음에 의해서 참조됨 : TryReadCertificate().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ LoadCertificateFromPem()

X509Certificate2 Codemaru.Services.Certificates.X509CertificateMonitorService.LoadCertificateFromPem ( string path)
inlinestaticprivate

Certificate From Pem 데이터를 불러옵니다.

매개변수
pathpath에 사용할 string 값입니다.
반환값
Load Certificate From Pem 작업에서 생성한 X509Certificate2 결과입니다.
예외
InvalidOperationException현재 객체 상태에서 Load Certificate From Pem 작업을 수행할 수 없는 경우 발생합니다.

X509CertificateMonitorService.cs 파일의 441 번째 라인에서 정의되었습니다.

442 {
443 string pem = File.ReadAllText(path);
444
445 X509Certificate2Collection collection = new();
446 collection.ImportFromPem(pem);
447
448 if (collection.Count == 0)
449 {
450 throw new InvalidOperationException("No certificate block was found in the PEM file.");
451 }
452
453 X509Certificate2? serverCertificate = collection
454 .OfType<X509Certificate2>()
455 .Where(IsServerCertificate)
456 .OrderByDescending(item => item.NotAfter)
457 .FirstOrDefault();
458
459 if (serverCertificate is not null)
460 {
461 return new X509Certificate2(serverCertificate.RawData);
462 }
463
464 X509Certificate2 first = collection
465 .OfType<X509Certificate2>()
466 .OrderByDescending(item => item.NotAfter)
467 .First();
468
469 return new X509Certificate2(first.RawData);
470 }

다음을 참조함 : IsServerCertificate().

다음에 의해서 참조됨 : LoadCertificate().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ResolveState()

CertificateHealthState Codemaru.Services.Certificates.X509CertificateMonitorService.ResolveState ( int remainingDays,
CertificateMonitorOptions options )
inlinestaticprivate

Resolve State 작업을 수행합니다.

매개변수
remainingDaysremaining Days에 사용할 int 값입니다.
options동작을 구성하는 설정입니다.
반환값
Resolve State 작업에서 생성한 CertificateHealthState 결과입니다.

X509CertificateMonitorService.cs 파일의 654 번째 라인에서 정의되었습니다.

657 {
658 if (remainingDays < 0)
659 {
660 return CertificateHealthState.Expired;
661 }
662
663 if (remainingDays < options.CriticalDays)
664 {
665 return CertificateHealthState.Critical;
666 }
667
668 if (remainingDays < options.WarningDays)
669 {
670 return CertificateHealthState.Warning;
671 }
672
673 return CertificateHealthState.Ok;
674 }

다음을 참조함 : Codemaru.Options.CertificateMonitorOptions.CriticalDays, Codemaru.Options.CertificateMonitorOptions.WarningDays.

다음에 의해서 참조됨 : TryReadCertificate().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SelectBestCertificate()

CertificateStatusInfo Codemaru.Services.Certificates.X509CertificateMonitorService.SelectBestCertificate ( IReadOnlyCollection< CertificateStatusInfo > candidates)
inlinestaticprivate

Select Best Certificate 작업을 수행합니다.

매개변수
candidatescandidates에 사용할 IReadOnlyCollection<CertificateStatusInfo> 값입니다.
반환값
Select Best Certificate 작업에서 생성한 CertificateStatusInfo 결과입니다.

X509CertificateMonitorService.cs 파일의 539 번째 라인에서 정의되었습니다.

541 {
542 DateTimeOffset now = DateTimeOffset.Now;
543
544 CertificateStatusInfo? validCertificate = candidates
545 .Where(item => item.NotAfter is not null && item.NotAfter.Value > now)
546 .OrderBy(item => GetSelectedFilePriority(item.CertificatePath))
547 .ThenBy(item => item.NotAfter)
548 .FirstOrDefault();
549
550 if (validCertificate is not null)
551 {
552 return validCertificate;
553 }
554
555 return candidates
556 .OrderByDescending(item => item.NotAfter ?? DateTimeOffset.MinValue)
557 .First();
558 }

다음을 참조함 : GetSelectedFilePriority().

다음에 의해서 참조됨 : GetStatusAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ TryReadCertificate()

? CertificateStatusInfo Codemaru.Services.Certificates.X509CertificateMonitorService.TryReadCertificate ( string path,
CertificateMonitorOptions options,
List< string > readErrors )
inlinestaticprivate

Read Certificate 작업을 시도하고 성공 여부를 반환합니다.

매개변수
pathpath에 사용할 string 값입니다.
options동작을 구성하는 설정입니다.
readErrorsread Errors에 사용할 List<string> 값입니다.
반환값
Try Read Certificate 작업에서 생성한 CertificateStatusInfo? 결과입니다.

X509CertificateMonitorService.cs 파일의 315 번째 라인에서 정의되었습니다.

319 {
320 try
321 {
322 using X509Certificate2 certificate = LoadCertificate(path, options);
323
324 if (string.IsNullOrWhiteSpace(certificate.Subject))
325 {
326 readErrors.Add($"{Path.GetFileName(path)}: Certificate subject is empty.");
327 return null;
328 }
329
330 DateTimeOffset notAfter = new(certificate.NotAfter);
331 DateTimeOffset notBefore = new(certificate.NotBefore);
332 int remainingDays = (int)Math.Floor((notAfter - DateTimeOffset.Now).TotalDays);
333 CertificateHealthState state = ResolveState(remainingDays, options);
334
335 return new CertificateStatusInfo
336 {
337 IsSuccess = true,
338 CertificateDirectory = options.CertificateDirectory,
339 CertificatePath = path,
340 Subject = certificate.Subject,
341 Issuer = certificate.Issuer,
342 NotBefore = notBefore,
343 NotAfter = notAfter,
344 RemainingDays = remainingDays,
345 State = state,
346 Message = BuildMessage(state, remainingDays, path)
347 };
348 }
349 catch (Exception ex)
350 {
351 readErrors.Add($"{Path.GetFileName(path)}: {ex.GetType().Name} - {ex.Message}");
352 return null;
353 }
354 }

다음을 참조함 : BuildMessage(), Codemaru.Options.CertificateMonitorOptions.CertificateDirectory, LoadCertificate(), ResolveState().

다음에 의해서 참조됨 : GetStatusAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

이 클래스에 대한 문서화 페이지는 다음의 파일로부터 생성되었습니다.: