실제로 인증서는 핸드 셰이크 중에 표시되므로 서버가 자신을 식별 할 수 있고 결국 클라이언트와 동일하게 식별 할 수 있습니다.
당신이 할 경우 :
SSLContext context = SSLContext.getInstance("TLS");
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
[...]
SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
try {
socket.startHandshake();
socket.close();
} catch (SSLException e) {
e.printStackTrace(System.out);
}
당신이 startHandshake()에서 예외가 발생하지 않는 경우, 그것은 인증서가 이미 신뢰할 수있는 기관의 서명의 몇 가지 이유 (키 스토어에 직접 존재하는, 신뢰할 의미).
예외가 발생하거나, 당신은 다운로드 체인에 액세스 할 수 없습니다 :를 X509Certificate 객체 인스턴스와 함께 K-ieth 스토어
X509Certificate[] chain = tm.chain;
if (chain == null) {
// error in downloading certificate chain
return;
}
// loop through chain
for (int i = 0; i < chain.length; i++) {
X509Certificate cert = chain[i];
[....]
}
을, 당신이 실제로 업데이트 할 수 있습니다 다음에 대한
X509Certificate cert = chain[k];
String alias = host + "-" + (k + 1);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
[...]
ks.setCertificateEntry(alias, cert);
OutputStream out = new FileOutputStream("jssecacerts");
ks.store(out, passphrase);
out.close();
봐 here을 완전한 샘플.
또는 신뢰할 수있는 서버에 대한 인증서를 다운로드하는 또 다른, 어쩌면 더 안전한 방법은 openssl 명령어를 사용한다 :
# openssl s_client -showcerts -connect $SERVER:$PORT 2>&1 | \
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >/tmp/$SERVERNAME.cert
는
keytool
와 함께 평소와 같이 가져옵니다.
마침내 문서에서 인증 기관이 내 트러스트 스토어에 추가됩니다. 그러나 때로는 설명서에서 찾을 수없는 경우도 있지만 원격 호스트 설명서에 명시 적으로 언급되지 않은 경우 해당 인증서를 검색하는 방법을 알고 싶을 수도 있습니다. 감사합니다 –
+1 당신이 신뢰를 쌓아 가려고하는 연결을 통해 신뢰 자료를 수락하는 것은 말이되지 않습니다. 오프라인 프로세스 여야합니다. – EJP