in src/NMS.AMQP/Transport/SecureTransportContext.cs [253:330]
protected X509Certificate ContextLocalCertificateSelect(object sender, string targetHost, X509CertificateCollection localCertificates, X509Certificate remoteCertificate, string[] acceptableIssuers)
{
if (Tracer.IsDebugEnabled)
{
string subjects = "{";
string issuers = "{";
string acceptedIssuers = "{";
foreach (X509Certificate cert in localCertificates)
{
subjects += cert.Subject + ", ";
issuers += cert.Issuer + ", ";
}
subjects += "}";
issuers += "}";
for (int i = 0; i < acceptableIssuers.Length; i++)
{
acceptedIssuers += acceptableIssuers[i] + ", ";
}
Tracer.DebugFormat("Local Certificate Selection.\n" +
"Sender {0}, Target Host {1}, Remote Cert Subject {2}, Remote Cert Issuer {3}" +
"\nlocal Cert Subjects {4}, " +
"\nlocal Cert Issuers {5}",
sender.ToString(),
targetHost,
remoteCertificate?.Subject,
remoteCertificate?.Issuer,
subjects,
issuers);
}
X509Certificate localCertificate = null;
if (ClientCertificateSelectCallback != null)
{
try
{
if (Tracer.IsDebugEnabled) Tracer.DebugFormat("Calling application callback for Local certificate selection.");
localCertificate = ClientCertificateSelectCallback(sender, targetHost, localCertificates, remoteCertificate, acceptableIssuers);
}
catch (Exception ex)
{
Tracer.InfoFormat("Caught Exception from application callback for local certificate selction. Exception : {0}", ex);
throw ex;
}
}
else if (localCertificates.Count >= 1)
{
// when there is only one certificate select that certificate.
localCertificate = localCertificates[0];
if (!String.IsNullOrWhiteSpace(this.ClientCertSubject))
{
// should the application identify a specific certificate to use search for that certificate.
localCertificate = null;
foreach (X509Certificate cert in localCertificates)
{
if (String.Compare(cert.Subject, this.ClientCertSubject, true) == 0)
{
localCertificate = cert;
break;
}
}
}
}
if (localCertificate == null)
{
Tracer.InfoFormat("Could not select Local Certificate for target host {0}", targetHost);
}
else if (Tracer.IsDebugEnabled)
{
Tracer.DebugFormat("Selected Local Certificate {0}", localCertificate.ToString());
}
return localCertificate;
}