如何从OpenSSL保存LDAP SSL证书

Dun*_*ter 44 ssl openssl ldap ssl-certificate edirectory

我想要我的LDAP服务器的SSL证书,它是Novell eDirectory.我使用openssl连接到ldap来查看证书.

openssl s_client -connect 192.168.1.225:636
Run Code Online (Sandbox Code Playgroud)

它只是打印证书.如何将其保存为某些证书格式文件?

Bru*_*uno 82

复制-----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
Run Code Online (Sandbox Code Playgroud)


Yan*_*oto 9

有一种非常简单的方法,仅使用openssl

openssl s_client -connect 192.168.1.225:636 < /dev/null |
  openssl x509 -out cert.pem
Run Code Online (Sandbox Code Playgroud)

第一行从服务器获取证书,第二行解析证书并允许将其转换为不同的格式,例如:

  • openssl x509 -noout -text:以文本格式打印证书,例如用于调试。
  • openssl x509 -outform der -out cert.crt:以 DER 格式保存证书

您可以查看文档以了解所有可能的变化。


Cha*_*rra 8

对于那些希望使用StartTLS通过LDAP连接获取证书的人:

在为s_client使用-starttls时,我已经重新向OpenSSL 提交了一个补丁来支持LDAP.所以最终这应该工作(如果它曾经在我猜 - 它还没有从10/18/16开始):

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

编辑:支持最终在此PR下合并.C不是我的强项所以幸运的是其他人用它跑了;)

我还编写了一个PHP函数,在通过TCP连接发出STARTTLS命令后提取SSL证书.它可以通过一些工作轻松移植到其他语言:

/**
 * @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;
}
Run Code Online (Sandbox Code Playgroud)

上面的函数将返回一个包含对等证书和对等证书链的数组.所以它可以像这样使用:

// 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;
}
Run Code Online (Sandbox Code Playgroud)


Ser*_*kov 5

有一种工具可让您从不仅使用 LDAPS 还使用 LDAP/STARTTLS 的服务器收集和保存 SSL/TLS 证书。这是著名的InstallCert程序的修订版,用 Java 编写。

像这样运行它:

java -jar installcert-usn-20131123.jar host_name:port
Run Code Online (Sandbox Code Playgroud)

它会将证书保存jssecacerts在 JRE 文件树中的extracerts密钥库文件中,以及当前目录中的密钥库文件中。然后您可以使用 Java keytool将证书导出为其他格式。

欢迎您访问我的博客页面Yet another InstallCert for Java,现在支持 STARTTLS下载和说明。


Dun*_*ter 5

我发现从任何支持 SSL 的协议(如 ldap、imap、pop、ftps、https 等)中保存证书的最简单方法就是使用 chrome 浏览器。假设您的服务器运行任何协议(如上述)创建这样的网址

http://:(例如,如果您的 ldap 服务器在 SSL 端口 10636 上运行,它将是https://example.com:10636)。只需点击此 URL 并从 chrome 浏览器本身获取证书。下面是一个简单的演示。在这个演示中,我的 ldap 服务器使用的是自签名证书。

点击证书信息

单击复制到文件并单击下一步保存证书。

在此处输入图片说明

无论协议如何,此方法都适用于在 SSL 上运行的任何服务器。

干杯。

  • 我曾经遵循这个,但如果有一个检查,LDAP 管理员可以阻止说 HTTPS 的不安全端口 (3认同)