마지막으로 모든 문제를 해결 했으므로 내 질문에 대답하겠습니다. 이들은 특정 문제를 해결하기 위해 관리하는 데 사용한 설정 / 파일입니다.
클라이언트의 키 스토어는 A는 PKCS # 12 형식의 포함 된 파일
- 클라이언트의 공개 인증서 (이 경우 자체 서명 된 CA에 의해 서명 됨)
- 클라이언트의 개인 키
이를 생성하기 위해 OpenSSL의 pkcs12
명령을 사용했습니다 .
openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -name "Whatever"
팁 : PKCS # 12 파일을 제대로 생성 할 수없는 버그로 인해 버전 0.9.8h가 아닌 최신 OpenSSL을 구 하십시오.
이 PKCS # 12 파일은 서버가 클라이언트에게 인증을 명시 적으로 요청한 경우 서버에 클라이언트 인증서를 제공하기 위해 Java 클라이언트가 사용합니다. 클라이언트 인증서 인증 프로토콜이 실제로 작동하는 방법에 대한 개요는 TLS Wikipedia 기사를 참조하십시오 (여기서 클라이언트 개인 키가 필요한 이유도 설명 함).
고객의 신뢰는 정직이다 JKS 형식 포함하는 파일을 루트 또는 중간 CA 인증서를 . 이러한 CA 인증서는 통신 할 수있는 엔드 포인트를 결정하며,이 경우 클라이언트가 신뢰 저장소의 CA 중 하나에서 서명 한 인증서를 제공하는 서버에 연결할 수 있습니다.
이를 생성하기 위해 예를 들어 표준 Java 키 도구를 사용할 수 있습니다.
keytool -genkey -dname "cn=CLIENT" -alias truststorekey -keyalg RSA -keystore ./client-truststore.jks -keypass whatever -storepass whatever
keytool -import -keystore ./client-truststore.jks -file myca.crt -alias myca
이 신뢰 저장소를 사용하여 클라이언트는로 식별 된 CA가 서명 한 인증서를 제공하는 모든 서버와 완전한 SSL 핸드 셰이크를 시도합니다 myca.crt
.
위의 파일은 엄격하게 클라이언트 전용입니다. 서버도 설정하려면 서버에 자체 키 및 신뢰 저장소 파일이 필요합니다. Tomcat을 사용하여 Java 클라이언트와 서버 모두에 대한 완전한 예제를 설정하는 데 대한 유용한 정보는 이 웹 사이트 에서 찾을 수 있습니다 .
문제 / 발언 / 팁
- 클라이언트 인증서 인증 은 서버에서만 시행 할 수 있습니다.
- ( 중요! ) 서버가 클라이언트 인증서를 요청하면 (TLS 핸드 셰이크의 일부로) 인증서 요청의 일부로 신뢰할 수있는 CA 목록도 제공합니다. 당신이 인증을 위해 존재하고자하는 클라이언트 인증서가되면 하지 이러한 CA의 중 하나에 의해 서명, (내 의견으로는,이 이상한 행동을하지만, 나는 확실히 그것을위한 이유가있어) 모두에서 발표되지 않습니다. 상대방이 내 자체 서명 클라이언트 인증서를 수락하도록 서버를 올바르게 구성하지 않았기 때문에 이것이 문제의 주요 원인이었으며 요청에서 클라이언트 인증서를 올바르게 제공하지 않아 문제가 발생한 것으로 가정했습니다.
- Wireshark를 받으십시오. SSL / HTTPS 패킷 분석 기능이 뛰어나며 디버깅 및 문제 발견에 큰 도움이됩니다. 그것은 비슷
-Djavax.net.debug=ssl
하지만, 더 구조화되고 (틀림없이) 당신은 자바 SSL 디버그 출력 불편이 있다면 쉽게 해석 할 수.
Apache httpclient 라이브러리를 완벽하게 사용할 수 있습니다. httpclient를 사용하려면 대상 URL을 HTTPS로 대체하고 다음 JVM 인수를 추가하십시오 (HTTP / HTTPS를 통해 데이터를 전송 / 수신하는 데 사용하려는 라이브러리에 관계없이 다른 클라이언트와 동일). :
-Djavax.net.debug=ssl
-Djavax.net.ssl.keyStoreType=pkcs12
-Djavax.net.ssl.keyStore=client.p12
-Djavax.net.ssl.keyStorePassword=whatever
-Djavax.net.ssl.trustStoreType=jks
-Djavax.net.ssl.trustStore=client-truststore.jks
-Djavax.net.ssl.trustStorePassword=whatever