c # - Læsecertifikat hash fra fjernserver

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg modtager en fejl, når jeg prøver at få en certifikat hash fra en fjernmaskine med følgende kode:


private string getCertHash(string Hostname)
{
    string result = "";

    using (ServerManager serverManager = ServerManager.OpenRemote(Hostname))
    {
        SiteCollection siteCollection = serverManager.Sites;
        foreach (Site site in siteCollection)
        {
            foreach (Binding binding in site.Bindings)
            {
                if (binding.Protocol == "https")
                {
                    // Error here
                    foreach (Byte certhashbyte in binding.CertificateHash)
                        result += certhashbyte.ToString(); 
                }
            }
        }
    }

    return result;
}


Fejlen jeg modtager mere detaljeret:



  'binding.certhashbyte' smed en undtagelse af type
  'System.Runtime.InteropServices.COMException'

  
  Enten har programmet ikke kaldt WSAStartup eller WSAStartup
  mislykkedes. (Undtagelse fra HRESULT: 0x8007276D)



Hvis jeg erstatter følgende række:


using (ServerManager serverManager = ServerManager.OpenRemote(Hostname))


med


using (ServerManager serverManager = new ServerManager)


at bruge den lokale server fungerer det fint.


Bemærk, at bruger ServerManager.OpenRemote (værtsnavn) fungerer generelt (jeg får alle de andre oplysninger, kun CertHash-oplysningerne resulterer i en fejl. Jeg har administratorrettigheder på begge maskiner (lokalt og fjernt). Systemet er Windows 2008 R2 ved hjælp af IIS 7.5 .


Fortæl mig hvad jeg gør galt/hvad mangler/hvorfor fejlen opstår.

Bedste reference


Af en eller anden grund fungerer koden ovenfor nu fint. Jeg kunne ikke finde ud af hvorfor det ikke fungerede, men jeg fandt nogle alternativer, jeg vil dele:



  1. Brug af denne kode og her et eksempel forbrug: [8]


    CertStoreReader certStoreReader = new CertStoreReader();
    foreach (X509Certificate2 x509 in certStoreReader.GetCertificates(credentials.Hostname))
    {
        certHash = x509.GetCertHashString();
    }
    

  2. Brug af ServerManager som først prøvet ovenfor (i spørgsmålet)


    using (ServerManager serverManager = ServerManager.OpenRemote(server))
    {
        Site site = serverManager.Sites.Where(s => s.Name == websiteName).Single();
        foreach (Binding binding in site.Bindings)
        {
            certHash += BitConverter.ToString(binding.CertificateHash).Replace("-", string.Empty);      
        }              
    }
    

  3. Brug af DirectoryEntry


    DirectoryEntry dir = new DirectoryEntry(@"IIS://" + server + @"/W3SVC/" + siteID);
    PropertyValueCollection vals = dir.Properties["SSLCertHash"];
    foreach (string entry in vals)
    {
        certHash += entry;
    }
    

  4. Brug af WMI. Jeg brugte denne forespørgsel i navneområdet Webadministration:


    "SELECT CertificateHash FROM SSLBinding WHERE IPAddress = '" + IP + "' AND Port = " + port