Как сохранить сертификат SSL LDAP из OpenSSL

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

openssl s_client -connect 192.168.1.225:636

Это просто печать сертификата. Как сохранить это в файл формата сертификата?

6 ответов


скопировать все, что находится между -----BEGIN CERTIFICATE----- и -----END CERTIFICATE----- (включая разделители) и вставить его в новый текстовый файл (обычно с расширением .pem или .crt). Для этого вы можете использовать свой любимый (простой) текстовый редактор, например Notepad, 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

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

Я повторно представлен патч для OpenSSL для поддержки LDAP при использовании-starttls для s_client. Так что в конце концов это должно сработать (если он когда-нибудь сделает это, я думаю, еще нет по состоянию на 10/18/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;
}

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

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

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

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

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


нам понравилось использовать ldapsearch для выполнения этого. The


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


самый простой способ сохранить сертификат из любых протоколов с поддержкой 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, независимо от протокола.

Ура.