Назад | Перейти на главную страницу

Как сделать так, чтобы сервер OpenLDAP доверял самозаверяющему сертификату от клиента?

Я использую JNDI для подключения к удаленному серверу OpenLDAP через ldaps с помощью следующего кода:

         Hashtable env = new Hashtable();
         env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
         env.put(Context.SECURITY_AUTHENTICATION, connectionType);
         env.put(Context.PROVIDER_URL, ldapUrl);
         env.put(Context.SECURITY_PRINCIPAL, userDn);
         env.put(Context.SECURITY_CREDENTIALS, password);
         String truststorePath = "C:\\Software\\OpenSSL-Win64\\CertificateEntityMatching\\truststore.ks";
         String keystorePath = "C:\\Software\\OpenSSL-Win64\\CertificateEntityMatching\\keystore.ks";
         String keyStorePassword = "123456789";
         System.setProperty("javax.net.ssl.trustStore", truststorePath);
         System.setProperty("javax.net.ssl.keyStore", keystorePath);
         System.setProperty("javax.net.ssl.keyStorePassword", keyStorePassword);
         try {
             InitialLdapContext ldap = new InitialLdapContext(env, null);
             System.out.println("Connect to LDAP successfully.");
             return ldap;
         } catch (AuthenticationException e) {
             e.printStackTrace();
             return null;
         } catch (NamingException e) {
             e.printStackTrace();
             return null;
         }

Вот как я включаю TLS в моем файле slapd.conf на сервере OpenLDAP:

# Enable TLS
TLSCipherSuite HIGH:MEDIUM:-SSLv2:-SSLv3
TLSVerifyClient demand
TLSCertificateFile /usr/local/etc/openldap/tls/certificate.pem
TLSCertificateKeyFile /usr/local/etc/openldap/tls/key.pem

Сертификат сервера certificate.pem уже был добавлен в хранилище доверенных сертификатов моего приложения, поэтому, если для TLSVerifyClient установлено значение never, мое приложение может успешно подключиться к серверу LDAP. Проблема в том, что когда я устанавливаю TLSVerifyClient на запрос, сервер LDAP отклоняет соединение, потому что мое приложение использует самозаверяющий сертификат:

TLS trace: SSL3 alert write:fatal:unknown CA
TLS trace: SSL_accept:error in error
TLS: can't accept: error:1417C086:SSL routines:tls_process_client_certificate:certificate verify failed (self signed certificate).
5bd922de connection_read(16): TLS accept failure error=-1 id=1001, closing

Может ли кто-нибудь посоветовать мне, как заставить сервер OpenLDAP доверять самозаверяющему сертификату моего приложения? Есть ли что-то похожее на «магазин доверенных сертификатов» для сервера OpenLDAP? Заранее спасибо.

slapd.conf (5)

TLSCACertificateFile Задает файл, содержащий сертификаты для всех центров сертификации, которые распознает slapd. Сертификат ЦС, подписавший сертификат сервера, должен быть включен в эти сертификаты.
Если подписывающий ЦС не был ЦС верхнего уровня (корневым), должны присутствовать сертификаты для всей последовательности ЦС от подписывающего ЦС до ЦС верхнего уровня. К файлу просто добавляются несколько сертификатов; порядок не имеет значения.

TLSCACertificatePath Задает путь к каталогу, который содержит сертификаты центра сертификации в отдельных отдельных файлах. Обычно используется только один из них или TLSCACertificateFile. Эта директива не поддерживается при использовании GnuTLS.
При использовании Mozilla NSS может содержать базу данных сертификатов / ключей Mozilla NSS. Если он содержит базу данных сертификатов / ключей Mozilla NSS и файлы сертификатов ЦС, OpenLDAP будет использовать базу данных сертификатов / ключей и игнорировать файлы сертификатов ЦС.