2

소켓을 만들고 ssl 핸드 셰이크를 시작하는 http://sanjaal.com/java/tag/get-public-key-of-ssl-certificate-in-java/의 다음 코드가 있습니다.어떻게하면 ssl 핸드 셰이크 대기 시간을 줄일 수 있습니까?

SSLSocketFactory factory = HttpsURLConnection 
.getDefaultSSLSocketFactory(); 

System.out.println("Creating a SSL Socket For "+hostname+" on port "+port); 

SSLSocket socket = (SSLSocket) factory.createSocket(hostname, port); 

socket.startHandshake(); 
System.out.println("Handshaking Complete"); 

문제는 핸드 쉐이크가 설정할 수 있다면 예외를보기 전에, 긴 대기 시간이 있다는 것입니다 : 연결이 나는 최대 대기 시간을 설정할 수있는 방법

시간 초과? ssl 핸드 셰이크가 성공하지 못하도록 보장하는 적절한 최소 시간은 얼마입니까?

+0

어쨌든 스레드에서이 작업을 수행해야하므로 핸드 쉐이크를 기다릴 필요가 없습니다. SSLSocket는'addHandshakeCompletedListener' 메소드를 제공합니다. – Falmarri

+0

가능한 [SSL 연결 시간 초과 및 읽기 시간 초과] 복제 (http : // stackoverflow.질문/7734188/ssl 연결 시간 제한 및 읽기 시간 초과) –

+0

소켓의 setSoTimeout() 메소드는 어떻습니까? – peshkira

답변

5

'연결 시간 초과'는 핸드 셰이크 또는 SSL과 관련이 없습니다. startHandshake()를 호출하면 발생하지 않습니다. 소켓을 만들 때 발생합니다. 당신의 스택 추적은 당신에게 그렇게 말했을 것입니다.

줄이려면 기본 생성자를 사용하여 Socket()을 만듭니다. 전화 연결 (SocketAddress 주소, 긴 시간 초과); 성공하면 (자), SSLSocketFactory.createSocket (Socket, ...)를 호출 해 SSLSocket로 랩합니다.

귀하가 언급 한 블로그는 실제로 매우 열악한 품질입니다. 일부 문제 :

  1. SSL 인증서가 '암호화 사용'을 설정하지 않았습니다. 그것은 주로 인증을위한 것입니다. 또한 세션 키로 이어지는 핸드 셰이크에서 중요하지 않은 역할을합니다.

  2. TLS는 단순히 도청, 변조 및 메시지 위조를 방지하는 것 이상의 기능을 제공합니다. 예를 들어 재생 및 man-in-the-middle 공격도 막을 수 있습니다. 1024 또는 2048 바이트 키가있는 RSA보다 훨씬 더 많은 암호화 가능성을 제공합니다.

  3. '브라우저 수준에서는 브라우저가 서버 인증서를 검증했다는 것을 의미하며, 보안을 위해 사용자/응용 프로그램은 인증서에 포함 된 공개 키를 사용하여 무언가를 암호화하고 서버는 그것을 완전히 이해할 수 있습니다. 브라우저는 SSL 핸드 셰이크 중 서버가 디지털 서명 메커니즘을 통해 해당 인증서를 소유하고 있는지 확인했습니다.

  4. 이 모든 것 : '잠긴 자물쇠'아이콘은 서버의 URL, DNS 이름 또는 IP 주소와 아무런 관련이 없습니다. 그렇지 않으면 생각하는 것이 일반적인 오해입니다. 이러한 바인딩은 URL, 이름 또는 주소가 서버의 인증서 자체에 지정되어있는 경우에만 안전하게 설정할 수 있습니다. '는 완전히 잘못되었습니다. HTTPS 에는이 포함되어 있으며 인증서에 포함 된 호스트 이름과 비교하여 호스트 이름을 확인합니다. 인증서에 포함 된 내용은 여기에 넣고 서명 기관에서 확인합니다.

미 심사되지 않은 미 검토 사이트에 의존하지 마십시오. 공식 제품 설명서를 사용하십시오.

+0

Greate Answer 실제로 !! 1 고마워요 –

1

sslSocket.startHandshake()를 수행하기 전에; sslSocket.setSoTimeout (timeout);을 사용하십시오.

setSoTimeout은 읽기 시간 초과이므로 setSoTimeout에서 제공하는 제한 시간 값은 핸드 셰이크에서도 작동합니다.

+0

읽기 타임 아웃을 설정합니다. 이것은 연결 시간 종료입니다. – EJP

+0

@EJP는 중요하지 않습니다. 초기 핸드 쉐이크에 대해 언급 된 타임 아웃 옵션이 실제로 작동합니다. 'socket.startHandshake()'는 예외를 throw합니다 (테스트 된 jdk8) – benez

관련 문제