6
votes

Comment utiliser SDK non borné pour se connecter à un serveur LDAP avec le certificat SSL Server?

J'ai dans ma main un certificat de serveur SSL LDAP. Je souhaite l'utiliser pour vous connecter au serveur LDAP à l'aide de SDK non borné.

Je ne veux pas utiliser com.unboundid.util.ssl.trustalltrustmanager comme a été montré ici: Utilisation du Français SDK avec un fichier de certificat SSL pour se connecter à LDAP Server dans l'application Android P>

Les fiduciaires suivants ne correspondent pas à nos exigences de notre produit: p>

CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate cert = cf.generateCertificate(byteArrayInputStream);
SSLUtil sslUtil = new SSLUtil(new CertificateTrustManager(cert));
SSLSocketFactory socketFactory = sslUtil.createSSLSocketFactory();
LDAPConnection connection = new LDAPConnection(socketFactory,
     "server.example.com", 636);


0 commentaires

3 Réponses :


3
votes

S'il existe un certificat spécifique ou un ensemble de certificats que vous souhaitez faire confiance, vous pouvez simplement créer vos propres implémentations personnalisées Javax.NET.SSL.X509TRUSTMANAGER qui examine la chaîne de certificats présentée et détermine si elle représente l'un des certificats attendus. . Vous pouvez obtenir des informations de coder difficiles sur ces certificats dans votre code (ou mieux encore, mettez-le dans un fichier de configuration afin que vous puissiez la modifier sans modifier de code) et faire quelque chose comme comparer les empreintes digitales de certificat pour obtenir un degré d'assurance approprié qu'il est en fait le certificat légitime.

Si vous ne savez pas ce que les certificats individuels seront mais savent qu'ils ont tous un émetteur commun, et vous faites confiance à cet émetteur à seulement émettre de bons certificats, vous pouvez inclure des informations de confiance pour cet émetteur.

Si vous souhaitez autoriser une gamme de certificats inconnus, potentiellement d'émetteurs non approuvés (et vous ne savez pas ce que ces émetteurs peuvent être à l'avance), et vous ne souhaitez pas inciter l'utilisateur à leur faire confiance. (que vous pourriez potentiellement mettre en cache donc vous devez seulement demander une fois), alors je ne suis pas sûr de ce que vous pourriez faire. À moins que vous ne puissiez trouver un moyen de différencier les certificats à partir de bons serveurs par rapport à ceux des serveurs Bad, votre application dirigera le risque de faire confiance aux certificats de confiance ou de ne pas faire confiance aux bonnes.


1 commentaires

Merci pour la réponse (+1)! J'ai trouvé la solution. Sera heureux pour vos commentaires.



7
votes

J'ai trouvé la solution en utilisant Utilisation du SDK non borné avec un fichier de certificat SSL pour se connecter au serveur LDAP dans l'application Android et Comment importer un certificat .Cer dans un kingle Java? (réponse de Patrick M).

Maintenant, je peux prendre un certificat de l'interface utilisateur et Connectez-vous au LDAP via SSL :) P>

import com.unboundid.ldap.sdk.LDAPConnection;
import com.unboundid.util.ssl.SSLUtil;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import java.io.ByteArrayInputStream;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

String base64EncodedCertificateString = "...";
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(base64EncodedCertificateString.getBytes());
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
int i = 0;
while (byteArrayInputStream.available() > 0) {
    Certificate cert = cf.generateCertificate(byteArrayInputStream);
    trustStore.setCertificateEntry("cert " + i++, cert);
}

TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(trustStore);
TrustManager[] trustManagers = tmf.getTrustManagers();
SSLUtil sslUtil = new SSLUtil(trustManagers);
SSLSocketFactory socketFactory = sslUtil.createSSLSocketFactory();
LDAPConnection connection = new LDAPConnection(socketFactory);
connection.connect("place.myserver.com", 636);


0 commentaires

0
votes

Bien qu'il ne soit pas recommandé pour des raisons de sécurité, il peut parfois être utile au moins pour tester les situations d'utiliser le FustaLTRustManager comme suit:

TrustAllTrustManager tm = new TrustAllTrustManager();
TrustManager[] trustManagers = new TrustManager[] {tm};
SSLUtil sslUtil = new SSLUtil(trustManagers);
SSLSocketFactory socketFactory = sslUtil.createSSLSocketFactory();
LDAPConnection connection = new LDAPConnection(socketFactory);


0 commentaires