SSL 인증서 오류 : 오류 확인 : num = 20 : 로컬 발급자 인증서를 가져올 수 없습니다


11

LDAPS 서버 (Active Directory)에 SSL 연결을 시도했지만 문제가 계속 발생합니다. 나는 이것을 사용하려고 시도했다.

openssl s_client -connect the.server.edu:3269 

결과는 다음과 같습니다.

verify error:num=20:unable to get local issuer certificate 

나는 몇 년 전 서버가 오래된 프로덕션 서버라고 생각했다. CA가 없을 수 있습니다. 그런 다음 출력에서 ​​인증서를 pem 파일로 가져 와서 시도했습니다.

openssl s_client -CAfile mycert.pem -connect the.server.edu:3269

그리고 그것은 작동하지 않았습니다.

내가 무엇을 놓치고 있습니까? 항상 작동하지 않습니까?

ssl  openssl 

명확성을 기하기 위해 Windows에서 제공 될 때 LDAPS가 연결될 때 CA 인증서를 표시하지 않는 것 같습니다. 따라서 CA X.509 인증서를 얻어 base64로 내보내고 아래 답변에 설명 된대로 할당해야합니다. 필자의 경우 python-ldap을 사용하여 GLldal 범위 (ldap.initialize () 인스턴스가 아닌)에서 다음과 같이 할당합니다.이 ldap.set_option(ldap.OPT_X_TLS_CACERTFILE,'./ca_issuer_cert.pem') 후 STARTTLS (LDAP 포트 389 내)를 예상대로 사용할 수있었습니다.
mbrownnyc

답변:


4

이것이 내가 CA 인증서 이름으로 본 것입니다.

depth=1 /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at //www.verisign.com/rpa (c)10/CN=VeriSign Class 3 International Server CA - G3
verify error:num=20:unable to get local issuer certificate
verify return:0

위의 두 번째 시도에서 -showcerts를 수행 한 후 가져온 인증서의 이름입니다. 이 작업을 수행하여 키 저장소에 인증서를 나열했습니다.

$JAVA_HOME/bin/keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts

거기에 CA 인증서가 있습니다.

Alias name: versign2006
Creation date: Jan 21, 2011
Entry type: trustedCertEntry

Owner: CN=VeriSign Class 3 International Server CA - G3, OU=Terms of use at www.verisign.com/rpa (c)10, OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5, OU="(c) 2006 VeriSign, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Serial number: 641be820ce020813f32d4d2d95d67e67
Valid from: Sun Feb 07 19:00:00 EST 2010 until: Fri Feb 07 18:59:59 EST 2020
Certificate fingerprints:
  MD5:  BA:B0:65:B4:3B:9C:E8:40:30:21:7D:C5:C6:CD:3F:EB
  SHA1: B1:8D:9D:19:56:69:BA:0F:78:29:51:75:66:C2:5F:42:2A:27:71:04

openssl이 서버와 함께 사용하는 키 저장소를 사용하도록하려면 -CAfile 인수를 사용합니다.

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts

CA의 Java 키 저장소에 비밀번호가 있음을 알고 다음과 같이 -pass pass : password 옵션을 사용해 보았습니다.

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts -pass pass:changeit

그러나 그것은 작동하지 않았습니다.

재미있는 점은 cacerts 파일에 암호가 있고 openssl이 cacerts 파일을 읽을 수 없다고 불평하지 않는다는 것입니다. 그것은 비린내 보인다. 저것이나 다른 것이 종을 울리는가?


3

이 오류는 openssl의 "인증서 체인을 따라 신뢰할 수있는 루트에 도달 할 수 없습니다"라는 방식입니다. 방금 내 AD 서버와 동일한 명령을 수행하고 전체 인증서 체인을 얻었지만 최상위 인증서에는 정확한 오류가 있습니다. 인증서에 서명 한 CA의 펍 키가있는 경우 -CAfile또는 -CApath옵션을 사용하여이를 지정할 수 있습니다.


응, 고마워 그래서 나는 그것을 시도했다. -showcerts 옵션을 설정 한 상태에서 동일한 작업을 수행하여 다른 인증서를 가져 와서 CA 인증서를 얻었습니다. 그게 CA 증명서 야? pem 파일에서 서버 인증서 대신 시도했지만 동일한 오류 메시지가 나타납니다. 다른 생각?

이 경우 만료와 같은 다른 이유로 유효성 검사에 실패한 것 같습니다.
sysadmin1138

1

LDAPS 서버 (Active Directory)에 SSL 연결을 시도했지만 문제가 계속 발생합니다. 나는 이것을 사용하려고 시도했다.

OpenLDAP를 사용하는 경우 다음을 설정할 수 있습니다.

TLS_REQCERT=never

당신의 openldap.conf 인증서 검증을 시도하지 OpenLDAP를 지시 파일. Apache를 사용하여 LDAP 인증을 수행하는 경우 비슷한 옵션이 있습니다.

실제로 인증서 확인을 수행하려는 경우 다음이 도움이 될 수 있습니다.

내가 무엇을 놓치고 있습니까? 항상 작동하지 않습니까?

나는 그렇게 생각하지 않습니다. 다음은 결정적인 것으로 들릴 수 있지만 실제로는 내 최고의 손님 일뿐입니다.

시도한 것은 자체 서명 된 인증서에서만 작동합니다. 실제로 인증서는 Windows CA에서 발급되었으므로 서버 인증서를 인수로 사용하려고 시도해 -CAfile도 아무런 효과가 없습니다.

-showcerts 옵션을 설정 한 상태에서 동일한 작업을 수행하여 다른 인증서를 가져 와서 CA 인증서를 얻었습니다. 그게 CA 증명서 야?

반드시 그런 것은 아닙니다. 원격 서버가 출력에 CA 인증서를 제공한다고 보장 할 수 없습니다. 먼저 서버 인증서 발급자를 확인해야합니다.

openssl x509 -in server.crt -noout -text | grep Issuer

... 그리고 다른 인증서 중 하나가 해당 발급자와 일치하는지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.