using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Net.Sockets;
using log4net.Repository.Hierarchy;
private static readonly ILog Logger = LogManager.GetLogger(typeof(Program));
public static void Setup()
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
PatternLayout patternLayout = new PatternLayout();
patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
patternLayout.ActivateOptions();
ConsoleAppender appender = new ConsoleAppender();
appender.Name = "Console";
appender.Layout = patternLayout;
appender.ActivateOptions();
hierarchy.Root.AddAppender(appender);
MemoryAppender memory = new MemoryAppender();
memory.ActivateOptions();
hierarchy.Root.AddAppender(memory);
hierarchy.Root.Level = Level.Info;
hierarchy.Configured = true;
public static void Main(string[] args)
Connect("www.google.com");
Connect("incomplete-chain.badssl.com");
private static void Connect(string url)
new SslStream(new TcpClient(url, 443).GetStream(), false,
new RemoteCertificateValidationCallback(ServerCertificateValidationCallback))
.AuthenticateAsClient(url);
private static bool ServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
if (sslPolicyErrors == SslPolicyErrors.None)
Logger.Error("SSL Policy Error: " + sslPolicyErrors);
Logger.Error("Certificate:\n" + certificate.ToString(true));
foreach (var element in chain.ChainElements)
Logger.Error("Parent Cert:\n" + element.Certificate.ToString(true));
foreach (var status in chain.ChainStatus)
Logger.Error("Chain Status: " + status.StatusInformation);