Чтение сертификата хэша с удаленного сервера - PullRequest
1 голос
/ 06 марта 2012

Я получаю сообщение об ошибке при попытке получить хэш сертификата с удаленного компьютера, используя следующий код:

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;
}

Ошибка, которую я получаю более подробно:

'binding.certhashbyte' выдал исключение типа 'System.Runtime.InteropServices.COMException'

Либо приложение не вызвало WSAStartup, либо WSAStartup не удалось. (Исключение из HRESULT: 0x8007276D)

Если заменить следующую строку:

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

с

using (ServerManager serverManager = new ServerManager)

для использования локального сервера все работает нормально.

Обратите внимание, что использование ServerManager.OpenRemote (Hostname) в целом работает (я получаю всю остальную информацию, только информация CertHash приводит к ошибке. У меня есть права администратора на обеих машинах (локальных и удаленных). Система - Windows 2008 R2 с использованием IIS 7.5.

Пожалуйста, скажите мне, что я делаю неправильно / что отсутствует / почему возникает ошибка.

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

По какой-то причине приведенный выше код теперь работает нормально.Я не мог выяснить, почему это не сработало, но я нашел несколько альтернатив, которыми хочу поделиться:

  1. Использование этого кода и вот пример использования:

    CertStoreReader certStoreReader = new CertStoreReader();
    foreach (X509Certificate2 x509 in certStoreReader.GetCertificates(credentials.Hostname))
    {
        certHash = x509.GetCertHashString();
    }
    
  2. Использование ServerManager в соответствии с первой попыткой выше (в вопросе)

    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. Использование DirectoryEntry

    DirectoryEntry dir = new DirectoryEntry(@"IIS://" + server + @"/W3SVC/" + siteID);
    PropertyValueCollection vals = dir.Properties["SSLCertHash"];
    foreach (string entry in vals)
    {
        certHash += entry;
    }
    
  4. Использование WMI.Я использовал этот запрос в пространстве имен WebAdministration:

    "SELECT CertificateHash FROM SSLBinding WHERE IPAddress = '" + IP + "' AND Port = " + port
    
0 голосов
/ 03 мая 2019

Или вы можете просто сделать:

using (var store = new X509Store(@"\\[RemoteMachineName]\My", StoreLocation.LocalMachine))
{
    store.Open(OpenFlags.ReadOnly);
    certificates = store.Certificates;
}

Просто убедитесь, что у вас есть необходимые разрешения для доступа к хранилищу сертификатов удаленного компьютера.

...