Ssl

如何啟用 OpenLDAP 伺服器信任來自客戶端的自簽名證書?

  • October 31, 2018

我正在使用 JNDI 通過以下程式碼通過 ldaps 連接到遠端 OpenLDAP 伺服器:

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

以下是我在 OpenLDAP 伺服器上的 slapd.conf 文件中啟用 TLS 的方法:

# 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 設置為從不,我的應用程序可以成功連接到 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 將辨識的所有證書頒發機構的證書的文件。簽署伺服器證書的 CA 的證書必須包含在這些證書中。

如果簽名 CA 不是頂級(根)CA,則應該存在從簽名 CA 到頂級 CA 的整個 CA 序列的證書。多個證書只是附加到文件中;順序不重要。

TLSCACertificatePath 指定包含單獨文件中的證書頒發機構證書的目錄的路徑。通常只使用其中一個或 TLSCACertificateFile。使用 GnuTLS 時不支持此指令。

使用 Mozilla NSS 時,可能包含 Mozilla NSS 證書/密鑰數據庫。如果包含 Mozilla NSS 證書/密鑰數據庫和 CA 證書文件,OpenLDAP 將使用證書/密鑰數據庫並忽略 CA 證書文件。

引用自:https://serverfault.com/questions/938127