12,964
回編集
334行目: | 334行目: | ||
// SSL / TLS証明書の検証 | // SSL / TLS証明書の検証 | ||
// 注意: 実務では適切に証明書を検証すること | // 注意: 実務では適切に証明書を検証すること | ||
System.Net.ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate; | |||
using (FileStream fileStream = File.OpenRead(localFilePath)) | using (FileStream fileStream = File.OpenRead(localFilePath)) | ||
441行目: | 438行目: | ||
if (sslPolicyErrors == SslPolicyErrors.None) | if (sslPolicyErrors == SslPolicyErrors.None) | ||
{ // 証明書チェーンとポリシーエラーが無い場合 | { // 証明書チェーンとポリシーエラーが無い場合 | ||
LogMessage("情報", "証明書の検証に成功"); | |||
return true; | return true; | ||
} | } | ||
LogMessage("警告", $"証明書エラー: {sslPolicyErrors}"); | |||
if (sslPolicyErrors.HasFlag(SslPolicyErrors.RemoteCertificateChainErrors)) | |||
{ | |||
return HandleChainErrors(chain); | |||
} | |||
if (sslPolicyErrors.HasFlag(SslPolicyErrors.RemoteCertificateNameMismatch)) | |||
{ | |||
LogMessage("エラー", "証明書の名前が不一致"); | |||
return false; | |||
} | |||
if (sslPolicyErrors.HasFlag(SslPolicyErrors.RemoteCertificateNotAvailable)) | |||
if (sslPolicyErrors | |||
{ | { | ||
LogMessage("エラー", "リモート証明書が利用不可"); | |||
return false; | |||
} | } | ||
// その他のエラーの場合 | // その他のエラーの場合 | ||
return false; | |||
} | |||
private static bool HandleChainErrors(X509Chain chain) | |||
{ | |||
foreach (X509ChainStatus status in chain.ChainStatus) | |||
{ | |||
if (status.Status == X509ChainStatusFlags.UntrustedRoot) | |||
{ | |||
X509Certificate2 rootCert = chain.ChainElements[chain.ChainElements.Count - 1].Certificate; | |||
if (ValidateSelfSignedCertificate(rootCert)) | |||
{ | |||
LogMessage("情報", "信頼されたルート証明書を検証しました。"); | |||
return true; | |||
} | |||
} | |||
LogMessage("エラー", $"証明書チェーンエラー: {status.StatusInformation}"); | |||
} | |||
return false; | return false; | ||
} | } | ||
458行目: | 487行目: | ||
private static bool ValidateSelfSignedCertificate(X509Certificate certificate) | private static bool ValidateSelfSignedCertificate(X509Certificate certificate) | ||
{ | { | ||
string certHash = certificate.GetCertHashString(); | string certHash = certificate.GetCertHashString(); | ||
if (TrustedCertificates.Contains(certHash, StringComparer.OrdinalIgnoreCase)) | |||
{ | { | ||
LogMessage("情報", "信頼された自己署名証明書を検証しました。"); | |||
return true; | |||
} | } | ||
LogMessage("エラー", $"未知の自己署名証明書です。サムプリント: {certHash}"); | |||
return false; | |||
} | |||
private static void LogMessage(string level, string message) | |||
{ | |||
string logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] [{level}] {message}"; | |||
Console.WriteLine(logMessage); | |||
// ファイルやデータベースへのログ記録処理等を追加 | |||
} | } | ||
} | } |