2016-12-07 2 views
0

Наше приложение работает с пользователями и группами Active Directory. Мы используем LDAP на порте 389 для операций Active Directory. Теперь один из наших клиентов хочет, чтобы мы добавили опцию для использования LDAP + SSL для связи в Active Directory.Как проверить SSL-сертификат сервера для подключения LDAP + SSL

Они сказали нам, что у них есть локальный ЦС, установленный в их домене, и используя самоподписанный сертификат для LDAPS. Они также сказали нам, что они предоставят сертификат, не требуя взаимного доверия, и мы должны использовать хранилище сертификатов Windows.

Я разработал тестовое приложение для операций LDAP + SSL и увидел, что сервер отправляет его сертификат, когда клиент инициирует соединение LDAP + SSL. Я могу установить соединение, только вернув true из метода проверки сертификата сервера.

Вопросы: - Какой сертификат (root, ceritificate, используемый для LDAP + SSL ...) должен предоставить нам клиент?

Какой должен быть формат сертификата для работы в среде .Net?

Как проверить сертификат сервера при подключении сервера?

Что они подразумевают под «мы должны использовать хранилище сертификатов Windows»? Хотите, чтобы мы автоматически добавляли сертификат сервера в хранилище доверенных сертификатов локального компьютера?

Пример кода я использовал для LDAP + SSL соединения,

LdapConnection _connection = new LdapConnection(new LdapDirectoryIdentifier(m_DomainName, m_PortNo)); 
_connection.Timeout = TimeSpan.FromMinutes(10); 
_connection.AuthType = AuthType.Basic; 
_connection.Credential = new NetworkCredential(m_UserName, m_Password); 

_connection.SessionOptions.ProtocolVersion = 3; 
_connection.SessionOptions.SecureSocketLayer = true; 

_connection.SessionOptions.VerifyServerCertificate = (ldapCon, serverCertificate) => 
{ 
    //TODO: Verify server certificate 
    return true; 
}; 
_connection.SessionOptions.QueryClientCertificate = (con, trustedCAs) => null; 

_connection.Bind(); 

ответ

1

Какой сертификат (корень, то ceritificate используется для LDAP + SSL ...) если клиент дает нам?

Корневой сертификат, который подписывал сертификат сервера LDAP. Они также могут предоставить вам целую цепочку заранее, но это будет отправлено во время рукопожатия TLS. Вам нужно только иметь корневой сертификат заранее.

Каким должен быть формат сертификата для работы в среде .Net?

Все, что вы можете импортировать в certmgr.msc. Pfx является обычным выбором в Windows.

Как проверить сертификат сервера при подключении сервера?

Вы не должны писать валидацию самостоятельно. Проверка сертификата - это сложный бизнес, и это уже сделано для вас. Используйте встроенный материал (см. Ниже).

Что они подразумевают под «мы должны использовать хранилище сертификатов Windows»? Хотите, чтобы мы автоматически добавляли сертификат сервера в хранилище доверенных сертификатов локального компьютера?

Да. Они отправляют вам корневой сертификат, который они использовали для подписания сертификата сервера ldap, который затем можно импортировать в качестве доверенного корня. Как только это будет сделано, вам не нужно выполнять какую-либо ручную проверку, она просто будет работать ™ :) с действительными сертификатами и не будет работать с недопустимыми.

Обратите внимание, что после того, как вы добавите свой корневой сертификат в качестве доверенного, они могут подделать любой сертификат сервера для клиента, на который установлен его корень, и все, что они подписывают, будет считаться действительным на этом клиенте.

Бонус: добавление полу-пользовательские проверки и отладки ошибок сертификата

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

Для этой цели, вы можете определить свои собственные проверки:

private bool VerifyServerCertificate(LdapConnection ldapConnection, X509Certificate certificate) 
{ 
    X509Certificate2 certificate2 = new X509Certificate2(certificate); 
    return certificate2.Verify(); 
} 

А потом добавить его к соединению Ldap:

_connection.SessionOptions.VerifyServerCertificate = 
    new VerifyServerCertificateCallback(VerifyServerCertificate); 

Таким образом, вы можете поймать исключения на Verify() и т.д. Но опять , если сертификат действителен (может быть проверен клиентом), это не является строго необходимым, это делается автоматически в любом случае. Вам нужно только это, если вы хотите что-то не реализовано, например, вы можете просто вернуть true в VerifyServerCertificate, чтобы принять любой сертификат, включая недопустимые (это будет Bad Idea и делает безопасное соединение бесполезным, но может быть полезно для отладка и т. д.).

Еще одна вещь, которую вы можете реализовать в этом методе, - certificate pinning для дополнительной безопасности, но это выходит за рамки этого ответа.

+0

@ Lengyel, эти ответы действительно то, что я хочу, спасибо большое – NthDeveloper

1

BTW: Начиная с введения расширенной операции StartTLS для LDAP v3 в мае 2000 года (RFC 2830) LDAPS (сделанный для LDAP v2) устарел.

Смежные вопросы