「C Sharpとネットワーク - FTP」の版間の差分

ナビゲーションに移動 検索に移動
334行目: 334行目:
           // SSL / TLS証明書の検証
           // SSL / TLS証明書の検証
           // 注意: 実務では適切に証明書を検証すること
           // 注意: 実務では適切に証明書を検証すること
           if (!SslCertificateValidator.SetupCertificateValidation())
           System.Net.ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;
          {
            return;
          }
   
   
           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;
       }
       }
   
   
       Console.WriteLine($"証明書エラー: {sslPolicyErrors}");
       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 == SslPolicyErrors.RemoteCertificateChainErrors)
       {
       {
           return ValidateSelfSignedCertificate(certificate);
           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))
      foreach (string trustedHash in TrustedCertificates)
       {
       {
           if (certHash.Equals(trustedHash, StringComparison.OrdinalIgnoreCase))
           LogMessage("情報", "信頼された自己署名証明書を検証しました。");
          {
          return true;
            Console.WriteLine("信頼された自己署名証明書を確認");
            return true;
          }
       }
       }
   
   
       Console.WriteLine("未知の自己署名証明書を確認");
       LogMessage("エラー", $"未知の自己署名証明書です。サムプリント: {certHash}");
      return false;
    }
   
   
       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);
      // ファイルやデータベースへのログ記録処理等を追加
     }
     }
  }
  }

案内メニュー