File mono-1ef655bc0da2477e248492a93e636637f8223d03.diff of Package mono
diff --git a/mcs/class/System/Mono.Btls/MonoBtlsContext.cs b/mcs/class/System/Mono.Btls/MonoBtlsContext.cs
index 06136f611562..5b8b725b6448 100644
--- a/mcs/class/System/Mono.Btls/MonoBtlsContext.cs
+++ b/mcs/class/System/Mono.Btls/MonoBtlsContext.cs
@@ -30,6 +30,7 @@
using System;
using System.IO;
+using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Security.Cryptography.X509Certificates;
@@ -165,12 +166,28 @@ void SetPrivateCertificate (X509CertificateImplBtls privateCert)
ssl.SetCertificate (privateCert.X509);
ssl.SetPrivateKey (privateCert.NativePrivateKey);
var intermediate = privateCert.IntermediateCertificates;
- if (intermediate == null)
- return;
- for (int i = 0; i < intermediate.Count; i++) {
- var impl = (X509CertificateImplBtls)intermediate [i];
- Debug ("SetPrivateCertificate - add intermediate: {0}", impl);
- ssl.AddIntermediateCertificate (impl.X509);
+
+ if (intermediate == null) {
+ /* Intermediate certificates are lost in the translation from X509Certificate(2) to X509CertificateImplBtls, so we need to restore them somehow. */
+ var chain = new System.Security.Cryptography.X509Certificates.X509Chain (false);
+ /* Let's try to recover as many as we can. */
+ chain.ChainPolicy.RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck;
+ chain.Build (new System.Security.Cryptography.X509Certificates.X509Certificate2 (privateCert.X509.GetRawData (MonoBtlsX509Format.DER), ""));
+ var elems = chain.ChainElements;
+ for (int j = 1; j < elems.Count; j++)
+ {
+ var cert = elems[j].Certificate;
+ /* If self-signed, it's a root and should not be sent. */
+ if (cert.SubjectName.RawData.SequenceEqual (cert.IssuerName.RawData)) break;
+ ssl.AddIntermediateCertificate (MonoBtlsX509.LoadFromData(cert.RawData, MonoBtlsX509Format.DER));
+ }
+ }
+ else {
+ for (int i = 0; i < intermediate.Count; i++) {
+ var impl = (X509CertificateImplBtls)intermediate [i];
+ Debug ("SetPrivateCertificate - add intermediate: {0}", impl);
+ ssl.AddIntermediateCertificate (impl.X509);
+ }
}
}