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)
有一种非常简单的方法,仅使用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 格式保存证书您可以查看文档以了解所有可能的变化。
对于那些希望使用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)
有一种工具可让您从不仅使用 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下载和说明。
我发现从任何支持 SSL 的协议(如 ldap、imap、pop、ftps、https 等)中保存证书的最简单方法就是使用 chrome 浏览器。假设您的服务器运行任何协议(如上述)创建这样的网址
http://:(例如,如果您的 ldap 服务器在 SSL 端口 10636 上运行,它将是https://example.com:10636)。只需点击此 URL 并从 chrome 浏览器本身获取证书。下面是一个简单的演示。在这个演示中,我的 ldap 服务器使用的是自签名证书。
单击复制到文件并单击下一步保存证书。
无论协议如何,此方法都适用于在 SSL 上运行的任何服务器。
干杯。
| 归档时间: |
|
| 查看次数: |
75020 次 |
| 最近记录: |