2014-01-14 4 views
0

기존 응용 프로그램에 SSL 지원을 추가하기 위해 노력하고 있으며 이전 버전과의 호환성에 대해 생각하기 시작했습니다.동일한 포트에서 SSL 및 비 SSL 지원

내가 읽은 다른 게시물과 다른 점은 서버가 SSL 코드로 업데이트되지 않을 수도 있다는 것입니다. 그래서 나는 SSL에 관해 아무것도 모르는 서버에 SSL 클라이언트를 연결하게 할 것이다.

이 설명을 위해 응용 프로그램은 한 번에 하나씩 서버로 키 입력을 보내고 각 키 입력에 대해 새 소켓이 만들어집니다. 따라서 기존 포트 번호에서이 작업을 수행하고 서버가 SSL을 지원하는지 여부를 확인하기 위해 시간 초과를 사용하지 않는 방법을 찾아야합니다.

이 문제를 해결할 수있는 적절한 방법에 대한 제안이 있으십니까?

+0

SSL은 TCP의 최상위 프로토콜이기 때문에 항상 동일한 포트에서 실행됩니다. –

+0

죄송합니다. 나는 내 문제를 잘못 말했다. 결정된. – BigHands79

+0

데이터가 불충분합니다. * 서버 *가 업그레이드 될 때/업그레이드가 어떻게 될지 생각해야합니다. 서버가 SSL로 업그레이드되었거나 업그레이드되지 않은 클라이언트를 어떻게 처리합니까? 예를 들어 StartTLS를 사용할 것입니까? – EJP

답변

1

보통 응용 프로그램은 예를 들어, 일반 연결과 다른 포트에 직접 SSL 연결을 수락 (나는 Winsock을하고 OpenSSL을 사용하고 있습니다) smtp 포트 25 및 smtps 포트 465, http 포트 80 및 https 포트 443 등. 다른 방법은 동일한 포트를 사용하고 클라이언트에서 SSL로 업그레이드 할 수있는 특정 명령을 사용하는 것입니다. STARTTLS는 smtp 또는 AUTH TLS는 ftp와 같습니다.

이러한 일반적인 방법이 옵션이 아니며 클라이언트가 어쨌든 (http와 같지만 smtp 또는 ftp를 사용하지 않는) 프로토콜의 첫 번째 패킷을 보내면 초기에 recv (.. MSG_PEEK)를 수행 할 수 있습니다 소켓 버퍼에서 데이터를 제거하지 않고 클라이언트가 보내는 데이터의 종류를 받아들입니다. SSL에서 클라이언트 안녕하세요 (https://security.stackexchange.com/questions/34780/checking-client-hello-for-https-classification 참조)처럼 보이면 엿보기 데이터가 일반 응용 프로그램 프로토콜처럼 보이면 계속해서 SSL 업그레이드를 수행하십시오.

+0

정말 좋은 솔루션입니다. *하지만 * 실제로 서버 코드를 구현하여 수정할 수는 없습니다. 저는 기본적으로 클라이언트에만 SSL 지원을 추가하고 SSL에 대해 전혀 모르는 서버에 연결합니다. 이 경우 클라이언트는 암호화되지 않은 연결을 사용합니다. – BigHands79

+0

내가 이해한다면, 서버에 SSL이 있는지 여부는 모르지만 같은 포트에서 수신 대기합니다. SSL이있는 경우 STARTTLS와 같은 특정 명령을 사용하여 SSL 업그레이드를 수행하는 대신 직접 SSL이됩니다. 그건 나쁜 디자인 :) 다음 전략은 통신 프로토콜에 따라 다릅니다. 서버를 연결 한 후 인사말로 시작하면 잠시 기다린 다음 SSL을 가정합니다. 그렇지 않으면 평범한 말을하려고 할 수 있으며, 실패 할 경우 서버가 SSL을 선호한다고 가정 할 수 있습니다. 어떤 경우에는 다음에 연결 속도를 높이기 위해 서버 선택을 기억하십시오. –

+0

비 SSL 연결 후 클라이언트와 서버간에 버전 식별자가 교환됩니다. 간단히 SSL 업그레이드를 사용하는 방법을 고려했지만 침입자는 비 SSL 연결을 유지하기 위해 버전 번호를 수정할 수 있습니다. (예 : 클라이언트가 이전 서버와 대화하고 있다고 생각 함) – BigHands79

관련 문제