public void Populate(CertificateInfo item) { this.item = item; lblID.Text = item.Id.ToString(); lblAlias.Text = item.Alias; if (item.CertificateRequest != null) { CertificateManager certManager = new CertificateManager(); string certPath = parentApp.VaultManager.GetCertificateFilePath(item.Id); string crtDerFilePath = certPath + "\\" + item.CrtDerFile; lblFilePath.Text = crtDerFilePath; if (File.Exists(crtDerFilePath)) { var cert = certManager.GetCertificate(crtDerFilePath); lblExpiryDate.Text = cert.GetExpirationDateString(); lblIssuer.Text = cert.Issuer; lblSubject.Text = cert.Subject; foreach (System.Security.Cryptography.X509Certificates.X509Extension extension in cert.Extensions) { if (extension.Oid.FriendlyName == "Subject Alternative Name") { var asndata = new System.Security.Cryptography.AsnEncodedData(extension.Oid, extension.RawData); txtSAN.Text = asndata.Format(true); } } /* * //http://stackoverflow.com/questions/16698307/how-do-you-parse-the-subject-alternate-names-from-an-x509certificate2 * foreach (System.Security.Cryptography.X509Certificates.X509Extension extension in cert.Extensions) * { * // Create an AsnEncodedData object using the extensions information. * System.Security.Cryptography.AsnEncodedData asndata = new System.Security.Cryptography.AsnEncodedData(extension.Oid, extension.RawData); * Console.WriteLine("Extension type: {0}", extension.Oid.FriendlyName); * Console.WriteLine("Oid value: {0}", asndata.Oid.Value); * Console.WriteLine("Raw data length: {0} {1}", asndata.RawData.Length, Environment.NewLine); * Console.WriteLine); * }*/ DateTime expiryDate = DateTime.Parse(cert.GetExpirationDateString()); TimeSpan timeLeft = expiryDate - DateTime.Now; lblDaysRemaining.Text = timeLeft.Days.ToString(); if (timeLeft.Days < 7) { lblDaysRemaining.ForeColor = Color.Red; } else { lblDaysRemaining.ForeColor = Color.Black; } } else { lblFilePath.Text = "[Not Found] " + lblFilePath.Text; } } }
private void X509Certificate_Changed(X509Certificate2 certificate) { this.labDates.Text = certificate == null ? "" : $"Valid from {certificate.NotBefore} to {certificate.NotAfter}"; if (certificate == null) { this.ToolTipFor(this.labDates, null); } else { List <string> domains = new List <string>(); Debug.WriteLine(""); for (var it = 0; it < certificate.Extensions.Count; it++) { var extension = certificate.Extensions[it]; // Create an AsnEncodedData object using the extensions information. var asndata = new System.Security.Cryptography.AsnEncodedData(extension.Oid, extension.RawData); //Debug.WriteLine("======== {0} ========", it); //Debug.WriteLine($"Extension type: {extension.Oid.FriendlyName}"); //Debug.WriteLine($"Oid value: {asndata.Oid.Value}"); //Debug.WriteLine("Raw data length: {0} {1}", asndata.RawData.Length, Environment.NewLine); //Debug.WriteLine(asndata.Format(true)); if (asndata.Oid.Value == "2.5.29.17") { domains.AddRange(asndata.Format(true).Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) .Select(x => x.Split(new[] { '=' }, 2).Skip(1).SingleOrDefault()?.Trim())); } } var main = certificate.GetNameInfo(X509NameType.SimpleName, false); var alt = certificate.GetNameInfo(X509NameType.DnsFromAlternativeName, false); if (!string.IsNullOrWhiteSpace(main)) { domains.Add(main); } if (!string.IsNullOrWhiteSpace(alt)) { domains.Add(alt); } this.ToolTipFor(this.labDates, string.Join("\n", domains.Distinct())); } }