2010-02-16 8 views
1

호스트에 연결해야합니다. 오프라인 일 경우 TCP 시간 초과가 발생하며 온라인 상태 인 경우 로그온 단계로 진행합니다.서버가 SSL을 지원하는지 어떻게 알 수 있습니까?

서버가 온라인 상태이고 구성된 TCP 포트에서 연결을 허용하지만 SSL 핸드 셰이크에 응답하지 않으면 응용 프로그램이 응답을 무기한 대기합니다.

IBM HACL (C++)을 사용하여 JNI에서 랩핑하여 서버에 액세스하고 있습니다.

서버 측에서 SSL을 사용할 수 있는지 Windows XP에서 Java 또는 C++로 어떻게 테스트 할 수 있습니까? 수동으로 핸드 쉐이크를 시작하고 첫 번째 서버 응답을받은 다음 TCP 소켓을 닫을 수 있습니까? 아니면 핸드 셰이크를 완료해야합니까? (그리고 어떻게해야합니까?)

고마워요.

+0

흠 실제로, 거기에 몇 가지 코드를 제공 하는게 어떨까요? 정상적인 환경에서는 연결이 즉시 중단되기 때문입니다. – Bozho

+0

서버 소켓을 만들고 아무것도 보내지 않고 포트에서 수신 대기 한 다음 해당 포트에 연결을 시도하고 SSL 핸드 셰이크를 시작하십시오. netcat을 사용해 보았습니다. –

+0

ECLConnList ConnList; ECLConnection * Conn = ConnList.GetFirstConnection(); Conn-> StartCommunication(); –

답변

2
try { 
    SSLContext ctx = SSLContext.getDefault(); 
    ctx.getClientSessionContext().setSessionTimeout(5); // in seconds 
    SSLSocket socket = (SSLSocket) 
     ctx.getSocketFactory().createSocket("host.com", 443); 

    socket.setSoTimeout(5000); // in millis 
    socket.startHandshake(); 
} catch (IOException ex) { 
    sslAvailable = false; 
} 

귀하의 의견대로 socket.setSoTimeout(5000)이 트릭을했습니다.

그 다음, 작동하지 않는 경우 :

URLConnection urlConn = // obtain connection 
urlConn.setConnectTimeout(5000); // in millis 
+0

음이 작동하지만, 정확히 내가 할 노력하고있어 반대 할 것 같다 - 호스트가 전혀 응답하지 않는 경우, startHandshake()는 영원히 기다립니다. 스레드에서 래핑하고 주어진 시간 초과 후 소켓을 닫을 수 있습니다. 호스트가 SSL을 지원하는 경우 javax.net.ssl.SSLHandshakeException가 발생합니다. 핸드 셰이크 중 원격 호스트 연결이 닫힙니다. 제대로 작동 할 수는 있지만 올바른 해결책인지는 확실하지 않습니다. –

+0

@G B 제한 시간에 대한 내 업데이트를 참조하십시오. – Bozho

+0

같은 문제가 있습니다. 세션 타임 아웃은 다른 것입니다. –

2

SSL에서 보내는 첫 번째 메시지는 항상 클라이언트에 의해 보내집니다 (ClientHello). 서버는 ServerHello 메시지로 응답해야하므로 SSL을 지원한다는 것을 알게됩니다. ( 지점)에서 연결을 닫을 수 있습니다 (close_notify 알림 전송). 핸드 셰이크를 완료 할 필요가 없습니다.

세션 매개 변수로 신뢰할 수있는 세션을 설정할 수없는 경우 Iit는 중간 핸드 셰이크를 종료하는 데 꽤 일반적입니다.

Java에서는 SSLEngine 클래스가 SSL 핸드 셰이크보다 원하는 제어를 제공하지만 SSL에 대한 심층적 인 지식이 필요한 상당히 복잡한 상태 시스템입니다.

+0

적어도 이론 상으로는 해결책이 있다는 것을 알아두면 좋습니다. Java에서 구현하는 방법을 알아야합니다. –

+0

SSLSocket를 작성해, startHandshake()를 호출하는지, 데이터를 송신합니다. 당신이 그 중 하나를하지 않으면 핸드 셰이크가 시작되지 않습니다. 확실하게 소켓 시간 초과를 설정하십시오. – EJP

+1

@EJP : 여기에서 반갑습니다. 나는 너의 네트워킹 책을 즐겼다.:) –

0

서버가 다음, 온라인 인 구성 TCP 포트에 연결을 받아들이지 만하면 문제가있다가 없습니다 대답을하지 SSL 핸드 셰이크, 응용 프로그램이 답변을 무기한 대기합니다. 스레드에 연결 코드를 삽입하고 제한 시간에 도달 할 때까지 스레드를 대기하지 왜 범용 솔루션으로

.

+0

예, 연결이 중단되어 닫히지 않았습니다. 문제점은 IBM 호스트 액세스 라이브러리입니다. –

+0

범용 솔루션으로 읽기 시간 초과를 사용하지 않는 이유는 무엇입니까? – EJP

관련 문제