我想要我的 LDAP 服务器的 SSL 证书,它是 Novell eDirectory。我已经使用 openssl 连接到 ldap 以查看证书。
openssl s_client -connect 192.168.1.225:636
它只是打印证书。如何将其保存到某些证书格式文件?
我想要我的 LDAP 服务器的 SSL 证书,它是 Novell eDirectory。我已经使用 openssl 连接到 ldap 以查看证书。
openssl s_client -connect 192.168.1.225:636
它只是打印证书。如何将其保存到某些证书格式文件?
复制和之间-----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
对于那些希望使用 StartTLS 通过 LDAP 连接获取证书的人:
在使用 -starttls for s_client 时,我已经重新提交了一个补丁到 OpenSSL 以支持 LDAP。所以最终这应该可以工作(如果它曾经成功我猜 - 还没有到 2016 年 10 月 18 日):
openssl s_client -connect servername:389 -starttls ldap -showcerts
编辑:支持最终合并在此 PR下。C 不是我的强项,所以幸运的是有人用它跑了;)
在通过 TCP 连接发出 STARTTLS 命令后,我还编写了一个 PHP 函数来提取 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;
}
上述函数将返回一个包含对等证书和对等证书链的数组。所以它可以像这样使用:
// 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 for Java,现在支持 STARTTLS下载和说明。
我发现从任何启用 SSL 的协议(如 ldap、imap、pop、ftps、https 等)保存证书的最简单方法就是使用 chrome 浏览器。假设您的服务器运行任何协议(如上所述)创建这样的 url
http://:(例如,如果您的 ldap 服务器在 SSL 端口 10636 上运行,则为https://example.com:10636)。只需点击此 URL 并从 chrome 浏览器本身获取证书。下面是一个简单的演示。在这个演示中,我的 ldap 服务器使用的是自签名证书。
单击复制到文件并单击下一步保存证书。
此方法适用于在 SSL 上运行的任何服务器,而与协议无关。
干杯。
有一个非常简单的方法只使用openssl
:
openssl s_client -connect 192.168.1.225:636 < /dev/null |
openssl x509 -out cert.pem
第一行从服务器获取证书,第二行解析证书并允许将其转换为不同的格式,例如:
openssl x509 -noout -text
: 以文本格式打印证书,例如,用于调试。openssl x509 -outform der -out cert.crt
: 以 DER 格式保存证书您可以查看所有可能变化的文档。
我们喜欢使用 ldapsearch 来执行此操作。整个过程,几行,但这是它的要点:
ldapsearch -x -T ~/ -t -h your-edirectory-host.yourdomain.com -b "cn=Security" objectclass=nDSPKICertificateAuthority cACertificate
-吉姆
或者,如果您需要 DER 或 PEM 格式的公钥和私钥,您可以通过 iManager 轻松导出它们。(DER 是二进制格式,PEM 是 base64 编码格式,因此在 iManager 中,您的选择将是 DER 或 B64 和 B64 ~= PEM)
您还可以使用https://keystore-explorer.org/导出证书。使用检查 -> 检查 SSL。