LDAPS는 루트 인증서가 필요하지 않은 것으로 보이는 Windows 및 Linux 시스템의 ldp.exe 및 기타 여러 프로그램을 통해 작동합니다. 조금도. JSSE를 사용하는 일부 프로그램은 루트 및 중간 CA를 cacerts 신뢰 저장소로 가져온 후 연결에 실패합니다.
NTDS\Personal(AD에서)에 있는 LDAPS 인증서를 cacerts로 직접 가져오는 것을 테스트했으며, java를 사용하는 특정 응용 프로그램에서는 보안 LDAP가 작동합니다.
java를 사용하고 실패하는 프로그램에서 루트 인증서를 가져올 때 오류가 발생합니다.
[루트 예외는 javax.net.ssl.SSLHandshakeException입니다. sun.security.validator.ValidatorException: PKIX 경로 유효성 검사 실패: java.security.cert.CertPathValidatorException: 서명 확인 실패]
LDAPS 인증서를 가져오면 가끔 오류가 발생합니다.
[루트 예외는 javax.net.ssl.SSLHandshakeException입니다. java.security.cert.CertificateException: 인증서가 알고리즘 제약 조건을 따르지 않습니다.]
(java.security를 주석 처리한 후에도)
또는JRE를 사용하는 프로그램에 따라 작동이 시작됩니다. 그러나 일반적인 장애물은 JRE가 오류를 기반으로 하는 인증서 체인을 보편적으로 좋아하지 않는 것 같다는 것입니다.
MY CDP/AIA는 HTTP를 통해 내부적으로 사용할 수 있으며 모든 인증서는 신뢰할 수 있는 개인 내부 2계층 Windows PKI에 의해 서명됩니다.
openssl s_client -connect -showcerts domain:port
올바른 인증서 체인을 반환하지만 오류도 반환합니다.
verify error:num=20:unable to get local issuer certificate
분명히 openssl이 루트 인증서를 보지 못하는 것과 관련이 있으므로 -cafile
부록을 사용해도 동일한 오류가 발생합니다. 이는 알 수 있지만 루트 인증서에 대한 인증서 체인의 지문은 와 동일하므로 -cafile
올바른 것 같습니다. ...
이 시점에서 나는 모든 "Java로 LDAPS를 활성화하는 방법"의 70%가 잘못되었다고 생각하기 시작했으며(모두 확실히 서로 충분히 모순됨) JAVA CAPS에 대한 규칙이 내가 'Java를 사용하는 이유'에 대해 더 의미가 있다고 생각하기 시작했습니다. 루트 인증서를 신뢰하는 것이 아니라 실제 LDAPS 인증서를 가져와야 합니다.https://docs.oracle.com/cd/E19509-01/820-3399/ggfrj/index.html
편집: 답변 보기
그렇다면 내 인증서의 구성 문제인 것처럼 들리나요, 아니면 Java와 관련된 다른 문제가 발생하는 것처럼 들리나요?
답변1
알고 보니 PKI 설정과 관련하여 기술적으로 올바른 모든 작업을 수행했습니다. 내 인증서가 RSASSA-PSS로 서명되었기 때문에 오류가 발생했습니다. Java 1.8은 PKCS #1 v2.1을 지원하지 않습니다.
루트부터 발급 CA까지 전체 인증서 체인을 다시 생성해야 했습니다. 이를 위해서는 CAPolicy.inf를 편집해야 합니다.
AlternateSignatureAlgorithm=1
에게0
또한 cmd 라인
certutil -setreg ca\csp\alternatesignaturealgorithm 0
수동으로 지정해야 합니다.
인증서 문제인 것 같았지만 서명 호환성이 문제가 될 것이라고는 전혀 생각하지 못했습니다. 교훈을 얻었습니다.
관련 문제: Microsoft 인증 기관 공급자 호환성