web-dev-qa-db-fra.com

Comment enregistrer le certificat SSL LDAP depuis OpenSSL

Je voulais le certificat SSL de mon serveur LDAP qui est Novell eDirectory. J'ai utilisé openssl pour me connecter à ldap pour afficher le certificat.

openssl s_client -connect 192.168.1.225:636

Il s'agit simplement d'imprimer le certificat. Comment puis-je l'enregistrer dans un fichier de format de certificat?

43
Dungeon Hunter

Copiez tout entre -----BEGIN CERTIFICATE----- et -----END CERTIFICATE----- (y compris ces délimiteurs) et collez-le dans un nouveau fichier texte (généralement avec l'extension .pem ou .crt). Pour cela, vous pouvez utiliser votre éditeur de texte (brut) préféré, par exemple le Bloc-notes, Gedit, Vim, Emacs (selon le système que vous utilisez).

Vous pouvez également diriger la sortie vers sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p', comme décrit ici :

echo -n | openssl s_client -connect 192.168.1.225:636 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ldapserver.pem
79
Bruno

Pour ceux qui cherchent à récupérer les certificats via une connexion LDAP à l'aide de StartTLS:

J'ai re-soumis un patch à OpenSSL pour prendre en charge LDAP lors de l'utilisation de -starttls pour s_client. Donc, finalement, cela devrait fonctionner (si jamais il arrive, je suppose - pas encore au 18/10/16):

openssl s_client -connect servername:389 -starttls ldap -showcerts

Modifier : le support a finalement été fusionné sous ce PR . C n'est pas mon fort donc heureusement quelqu'un d'autre a couru avec;)

J'ai également écrit une fonction PHP pour extraire les certificats SSL après avoir émis une commande STARTTLS sur une connexion TCP. Elle pourrait facilement être portée dans d'autres langues avec un peu travail:

/**
 * @param string $server The server name to connect to
 * @param int $port The standard LDAP port
 * @return array In the form of ['peer_certificate' => '', 'peer_certificate_chain' => [] ]
 */
function getLdapSslCertificates($server, $port = 389)
{
    $certificates = [
        'peer_certificate' => null,
        'peer_certificate_chain' => [],
    ];
    // This is the hex encoded extendedRequest for the STARTTLS operation...
    $startTls = hex2bin("301d02010177188016312e332e362e312e342e312e313436362e3230303337");
    $opts = [
        'ssl' => [
            'capture_peer_cert' => true,
            'capture_peer_cert_chain' => true,
            'allow_self_signed' => true,
            'verify_peer' => false,
            'verify_peer_name' => false,
        ],
    ];

    $context = stream_context_create($opts);
    $client = @stream_socket_client(
        "tcp://$server:$port",
        $errorNumber,
        $errorMessage,
        5,
        STREAM_CLIENT_CONNECT,
        $context
    );
    @stream_set_timeout($client, 2);
    @fwrite($client, $startTls);
    @fread($client, 10240);
    @stream_socket_enable_crypto($client, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
    $info = @stream_context_get_params($client);

    if (!$info) {
        return $certificates;
    }
    openssl_x509_export($info['options']['ssl']['peer_certificate'], $certificates['peer_certificate']);

    foreach ($info['options']['ssl']['peer_certificate_chain'] as $index => $cert) {
        $certChain = '';
        openssl_x509_export($cert, $certChain);
        $certificates['peer_certificate_chain'][$index] = $certChain;
    }
    @fclose($client);

    return $certificates;
}

La fonction ci-dessus renverra un tableau contenant le certificat homologue et la chaîne de certificats homologue. Il pourrait donc être utilisé comme ceci:

// Just pass it the server name
$certificates = getLdapSslCertificates('dc1.example.local');

// The certificates are in the array as strings in PEM format
echo $certificates['peer_certificate'].PHP_EOL;
foreach ($certificates['peer_certificate_chain'] as $cert) {
    echo $cert.PHP_EOL;
}
8
ChadSikorra

Le moyen le plus simple que j'ai trouvé pour enregistrer un certificat à partir de n'importe quel protocole SSL comme ldap, imap, pop, ftps, https etc. utilise simplement le navigateur chrome. Supposons que si votre serveur exécutant un protocole (comme mentionné) crée l'URL comme ceci

http: //: (exemple si votre serveur LDAP fonctionne sur le port SSL 10636, ce serait https://example.com:10636 ). Appuyez simplement sur cette URL et obtenez le certificat à partir du navigateur chrome lui-même. Une démo simple ci-dessous. Dans cette démo, mon serveur LDAP utilise un certificat auto-signé.

Click On Certificate Information

Cliquez sur copier dans un fichier et enregistrez le certificat en cliquant sur suivant.

enter image description here

Cette méthode fonctionne pour tout serveur fonctionnant sur SSL quel que soit le protocole.

À votre santé.

3
Dungeon Hunter

Il existe un outil qui vous permet de collecter et d'enregistrer un certificat SSL/TLS à partir d'un serveur qui parle non seulement LDAPS, mais aussi LDAP/STARTTLS. C'est une révision du célèbre programme InstallCert , écrit en Java.

Exécutez-le comme ceci:

Java -jar installcert-usn-20131123.jar Host_name:port

et il enregistrera le certificat pour vous dans le fichier de clés jssecacerts de votre arborescence de fichiers JRE, ainsi que dans le fichier de clés extracerts de votre répertoire actuel. Vous pouvez ensuite utiliser Java keytool pour exporter le (s) certificat (s) vers d'autres formats.

Vous êtes invités à visiter ma page de blog Encore un autre InstallCert pour Java, maintenant avec le support STARTTLS pour le téléchargement et les instructions.

3
Sergey Ushakov

Nous avons aimé utiliser ldapsearch pour effectuer cette opération. Le tout le processus , quelques lignes, mais c'est l'essentiel:

ldapsearch -x -T ~/ -t -h your-edirectory-Host.yourdomain.com -b "cn=Security" objectclass=nDSPKICertificateAuthority cACertificate

-jim

2
jwilleke

Ou vous pouvez facilement exporter la clé publique et privée via iManager si vous en avez besoin au format DER ou PEM. (DER est un format binaire, PEM est un format encodé en base64, donc dans iManager, vos choix seront DER ou B64 et B64 ~ = PEM dans ce contexte)

1
geoffc