Client: Visit
    1. https://host1.com/ 
    2. https://host2.com/
Server:   There are two certificates.
  certificates1.pfx CN=host1.com and certificates2.pfx CN=host2.com
use wireshark
Client visit https://host1.com/ 
1: C --> S SYN 
2: C <-- S SYN,ACK 
3: C --> S ACK 
4: C --> S Client Hello (Contain Server Name: host1.com) 
... How do I select certificate1 in C# 
5: C <-- S Server Hello, Certificate, Server Hello Done 
Client visit https://host2.com/ 
1: C --> S SYN 
2: C <-- S SYN,ACK 
3: C --> S ACK 
4: C --> S Client Hello (Contain Server Name: host2.com) 
... How do I select certificate2 in C# 
5: c <-- S Server Hello, Certificate, Server Hello Done 
 
SslStream sslStream = new SslStream(
  clientStream,
  false,
  new RemoteCertificateValidationCallback(ValidateServerCertificate),
  new LocalCertificateSelectionCallback(SelectLocalCertificate)
);
X509Certificate2 certificate = new X509Certificate2("certificates1.pfx");
sslStream.AuthenticateAsServer(certificate , false, SslProtocols.Tls | SslProtocols.Ssl3 | SslProtocols.Ssl2, true);
private X509Certificate SelectLocalCertificate(object sender, string targetHost, X509CertificateCollection localCertificates, X509Certificate remoteCertificate, string[] acceptableIssuers)
{
  //In Debug, targetHost is empty string and remoteCertificate=null
  //I can't return right Certificates
  return null;
}
private bool ValidateServerCertificate( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return true;
}