Как сохранить SSL-сертификат LDAP из OpenSSL - PullRequest
42 голосов
/ 17 августа 2011

Я хотел получить сертификат SSL моего сервера LDAP, который является Novell eDirectory.Я использовал openssl для подключения к ldap для просмотра сертификата.

openssl s_client -connect 192.168.1.225:636

Это просто печать сертификата.Как я могу сохранить это в какой-нибудь файл формата сертификата?

Ответы [ 6 ]

77 голосов
/ 17 августа 2011

Скопируйте все между -----BEGIN CERTIFICATE----- и -----END CERTIFICATE----- (включая эти разделители) и вставьте его в новый текстовый файл (обычно с расширением .pem или .crt). Для этого вы можете использовать свой любимый (простой) текстовый редактор, например, Блокнот, Gedit, Vim, Emacs (в зависимости от используемой системы).

В качестве альтернативы вы можете направить вывод в sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p', как описано здесь :

echo -n | openssl s_client -connect 192.168.1.225:636 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ldapserver.pem
7 голосов
/ 19 октября 2016

Для тех, кто хочет получить сертификаты через соединение LDAP с помощью StartTLS:

Я повторно отправил патч в OpenSSL для поддержки LDAP при использовании -starttls для s_client. Таким образом, в конечном итоге это должно сработать (если это когда-нибудь произойдет, я думаю - еще не по состоянию на 18.10.16) :

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

Редактировать : Поддержка была в конечном итоге объединена в этот PR . C не моя сильная сторона, так что, к счастью, кто-то еще бежал с ней;)

Я также написал функцию PHP для извлечения SSL-сертификатов после выполнения команды STARTTLS по TCP-соединению. Его можно легко перенести на другие языки с небольшой работой:

/**
 * @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;
}

Приведенная выше функция вернет массив, содержащий сертификат однорангового узла и цепочку сертификатов однорангового узла. Так что это можно использовать так:

// 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;
}
3 голосов
/ 25 августа 2015

Самый простой способ сохранить сертификат из любых протоколов с поддержкой SSL, таких как ldap, imap, pop, ftps, https и т. Д., - это просто использовать браузер Chrome. Предположим, что на вашем сервере работает какой-либо протокол (например, упомянутый выше), создайте URL-адрес, подобный этому

http://: (например, если ваш ldap-сервер работает на SSL-порту 10636, это будет https://example.com:10636). Просто нажмите этот URL и получите сертификат из самого браузера Chrome. Простая демонстрация ниже. В этой демонстрации мой ldap-сервер использует самозаверяющий сертификат.

Click On Certificate Information

Нажмите на копию в файл и сохраните сертификат, нажав «Далее».

enter image description here

Этот метод работает для любого сервера, работающего по SSL, независимо от протокола.

Приветствие.

3 голосов
/ 29 ноября 2013

Существует инструмент, который позволяет собирать и сохранять сертификат SSL / TLS с сервера, который говорит не только на LDAPS, но и на LDAP / STARTTLS.Это ревизия известной InstallCert программы, написанной на Java.

Просто запустите ее так:

java -jar installcert-usn-20131123.jar host_name:port

, и она сохранит сертификат для вас.в файле jssecacerts хранилища ключей в вашем дереве файлов JRE, а также в файле extracerts хранилища ключей в вашем текущем каталоге.Затем вы можете использовать Java keytool для экспорта сертификатов в другие форматы.

Приглашаем посетить страницу моего блога Еще один InstallCert для Java, теперь с поддержкой STARTTLS для скачивания и инструкции.

2 голосов
/ 09 апреля 2015

Нам понравилось использовать ldapsearch для этого. весь процесс , несколько строк, но это суть этого:

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

-jim

1 голос
/ 25 августа 2011

Или вы можете легко экспортировать открытый и закрытый ключи через iManager, если они вам нужны в формате DER или PEM.(DER - это двоичный формат, PEM - это кодированный в base64 формат, поэтому в iManager вы можете выбрать DER или B64 и B64 ~ = PEM в этом контексте)

...