문제

사용자의 CAC 카드에 있는 인증서를 사용하여 웹 서비스 클라이언트(Axis2)에서 SSL 통신을 활성화하려고 합니다.매력처럼 작동합니다.... 웹 서버가 CAC를 활성화할 때까지입니다.이 시점에서 체인의 다른 인증서가 포함되지 않았다는 오류 메시지와 함께 SSL 연결이 거부됩니다.

나는 공급자를 security.properties 파일에 추가하거나 프로그래밍 방식으로 생성하여 공급자를 사용할 수 있는지 확인했습니다.

현재 접근 방식은 단순히 시스템 속성을 설정하는 것입니다.System.setProperty("javax.net.ssl.keyStore", "NONE");System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");

나는부터 이해한다 이것 이 접근 방식은 "최종 엔터티" 인증서만 전송한다는 질문/답변입니다.분명히 내 자신의 X509KeyManager를 구현해야 합니다.이것은 나에게 새로운 기반입니다. 누구든지 좋은 참고 자료를 제안하거나 그렇게 하는 방법에 대한 샘플을 제공할 수 있습니까?

도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

최고의 키 관리자 구현은 사용하려는 인증서 발급자에 따라 다릅니다.

사용자 CAC의 인증서가 언제나 특정 CA에서 발급하려면 해당 발급자의 인증서와 중간 인증서를 PKCS #7 파일에 저장하면 됩니다.에서 getCertificateChain() 메서드를 사용하면 이 컬렉션을 사용자 인증서에 맹목적으로 추가하여 반환할 수 있습니다.

상황이 그렇게 간단하지는 않지만 가능한 발급자의 전체 목록을 열거할 수 있는 경우 모든 인증서를 얻고 그들의 발급자의 인증서 등에서 루트 인증서까지.

모든 루트 인증서를 신뢰할 수 있는 항목으로 키 저장소에 추가합니다.중간 인증서를 PKCS-#7 형식 파일로 묶습니다.

구현하다 X509KeyManager (또는 연장 X509ExtendedKeyManager 당신이 함께 일하고 있다면 SSLEngine).구체적으로, getCertificateChain() 방법을 사용하면 CertPathBuilder 사용자의 인증서에서 신뢰할 수 있는 루트까지 유효한 체인을 생성합니다.그만큼 표적 사용자의 CAC에서 로드하는 인증서입니다. alias 매개변수.그만큼 신뢰할 수 있는 뿌리 귀하가 생성한 신뢰 저장소의 인증서입니다.중간 인증서는 다음과 같습니다. 짐을 실은 PKCS #7 파일에서 빌더 매개변수에 추가되었습니다. 체인이 구축되면, 인증서 경로를 얻으십시오 그리고 그것을 변환하다 배열로.이는 다음의 결과입니다. getCertificateChain() 방법.

사용자 인증서를 발급할 사람을 예측할 수 없는 경우 런타임 시 LDAP 디렉터리나 기타 저장소에서 중간 인증서를 얻을 수 있습니다.그것은 완전히 새로운 수준의 어려움입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top