2011-08-16 3 views
35

Novell eDirectory 인 LDAP 서버의 SSL 인증서를 원했습니다. 나는 인증서OpenSSL에서 LDAP SSL 인증서를 저장하는 방법

을 볼 수 LDAP에 연결하려면 openssl을 사용하고있는 OpenSSL s_client가 -connect 192.168.1.225:636

그냥 내가 어떤 인증서 형식 파일이을 절약 할 수있는 방법 인증서를 인쇄?

감사의 말로,

맑음.

답변

64

-----BEGIN CERTIFICATE----------END CERTIFICATE----- 사이의 모든 내용 (이러한 구분 기호 포함)을 새 텍스트 파일 (일반적으로 확장자는 .pem 또는 .crt)로 붙여 넣으십시오. 메모장, Gedit, Vim, Emacs (예 : 사용중인 시스템에 따라 다름)와 같이 자주 사용하는 텍스트 편집기를 사용할 수 있습니다.

다른 방법으로 파이프 할 수 here을 설명 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 
+0

감사 답변 –

+0

접선 우려 : StartTLS를에 의해 반환 된 SSL 인증서를 검색하는 방법 (LDAPS이 비활성화 된 경우). A :'OpenSSL 0.9.8r 2011 년 2 월 8 일 '현재로서는 불가능합니다. OpenSSL은 아직 StartTLS에 대한 LDAP 프로토콜을 지원하지 않습니다. –

1

아니면 DER 또는 PEM 형식 중 하나에 필요할 경우 쉽게 iManager를 통해 공개 키와 개인 키를 내보낼 수 있습니다. (DER은 바이너리 형식이며 PEM은 base64로 인코딩 된 형식이므로 iManager에서 DER 또는 B64와 B64 ~ = PEM을이 컨텍스트에서 사용합니다)

4

SSL을 수집하고 저장할 수있는 도구가 있습니다/TLS 인증서는 LDAPS뿐 아니라 LDAP/STARTTLS도 사용합니다. 이것은 Java로 작성된 잘 알려진 InstallCert 프로그램의 개정판입니다.

그냥 다음과 같이 실행 :

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

을하고 당신의 JRE 파일 트리에서 jssecacerts 키 스토어 파일에 당신을 위해 인증서를 저장합니다, 또한 현재 디렉토리에있는 extracerts 키 스토어 파일입니다. 그런 다음 Java keytool을 사용하여 인증서를 다른 형식으로 내보낼 수 있습니다.

내 블로그 페이지 Yet another InstallCert for Java, now with STARTTLS support을 방문하여 다운로드 및 지침을 환영합니다.

+0

매력처럼 작동합니다. 감사! –

+0

이것은 maven central에 게시됩니까? 만약 내가 그것을 게시 할 수 없다면 – spy

+0

fyi, 나는 이것을 포크로 만들었고, 그것을 수정하기 위해 주로 라이브러리에 포함시키기를 지원했다. https://github.com/spyhunter99/installcert – spy

2

이 작업을 수행하는 데 ldapsearch를 사용하는 것이 좋습니다. whole process, 몇 줄,하지만이 그것의 요점입니다 :

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

- 짐

+0

인증서가 디렉토리에 있다고 가정합니다. – EJP

+2

그는 "내 LDAP 서버는 Novell eDirectory"이므로 디렉토리에 있습니다. – jwilleke

1

내가 FTPS LDAP, IMAP, POP, 같은 어떤 SSL을 사용 프로토콜에서 인증서를 저장하는 것으로 가장 쉬운 방법 , https 등은 Chrome 브라우저를 사용하고 있습니다. 언급 한 프로토콜을 실행하는 서버가 다음과 같은 URL을 작성한다고 가정하십시오.

http : // : (예 : LDAP 포트가 10636 인 LDAP 서버는 https://example.com:10636입니다. 이 URL을 클릭하고 크롬 브라우저에서 인증서를 가져 오기 만하면됩니다. 아래 간단한 데모. 이 데모에서는 LDAP 서버가 자체 서명 된 인증서를 사용하고 있습니다. 사본에

Click On Certificate Information

을 클릭하여 파일 및 다음을 클릭하여 인증서를 저장합니다.

enter image description here

이 방법은 상관없이 프로토콜의 SSL에서 실행중인 모든 서버에 적용됩니다.

건배. StartTLS를을 사용하여 LDAP 연결을 통해 인증서 표시를 잡기 위해 찾고있는 사람들을 위해

+0

Firefox에서도 거의 동일하게 작동합니다. IE에서는 먼저 인증서를 Windows 키 스토어에 저장해야합니다. 그러면 인증서를 파일로 내보낼 수 있습니다. – geoffc

4

:

나는 s_client가에 대한 -starttls를 사용하는 경우 LDAP를 지원하기 위해 OpenSSL과 re-submitted a patch 있습니다.

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

편집 : 지원은 결국 this PR에서 합병을 - (아직 10/18/16의로 그 어느 것 같아요 그것을 만드는 경우) 그래서 결국이 를 작동합니다. C는 내 운명이 아니기 때문에 운 좋게도 다른 사람도 같이 달렸습니다.)

나는 또한 TCP 연결을 통해 STARTTLS 명령을 내린 후 SSL 인증서를 추출하는 PHP 함수를 작성했습니다. 그것은 쉽게 약간의 작업으로 다른 언어로 포팅 될 수있다 :

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

'@'소음기의 무심코 사용. +1하세요! – bishop

관련 문제