2013-04-26 3 views
5

동일한 포트에서 HTTP 및 HTTPS 연결을 통해 트래픽을 처리 할 수있는 Indy 및 OpenSSL을 사용하여 Delphi XE3에서 웹 서버를 설정하려고합니다.Delphi XE3에서 TIdTCPServer 및 OpenSSL을 사용하여 동일한 포트에서 SSL 및 비 SSL 트래픽을 지원하는 방법은 무엇입니까?

나는 이것에 대한 두 가지 주요 접근법을 보았으며 둘 다 나를 위해 효과가없는 것으로 보인다.

첫 번째 : Up-front TLS/SSL. 이것은 비보안 핸드 셰이크의 "Client-Hello"부분을 찾기 위해 스트림의 처음 몇 바이트를 읽는 것과 서버 SSL 핸드 셰이크 응답을 호출하는 (발견되는 경우) 부분을 읽는 것을 포함하지만, 그렇게하면 OpenSSL 라이브러리가 인식하지 못합니다 나는 메시지의 선두 바이트를 제거 했으므로 악수를했다.

둘째 : TLS 이후 STARTTLS (또는 이에 상응하는 금액). 여기에는 특수 문자 집합 (STARTTLS)이 전송되며 바로 뒤에 "Client-Hello"가옵니다. 그런 다음 서버는 전체 SSL 핸드 셰이크 메시지를 그대로 OpenSSL 라이브러리로 전달합니다. 이 방법의 문제점은 대부분의 웹 브라우저가이를 지원하지 않는다는 것입니다 (RFC 2817). 두 가지 방법에 대한 요약

, 이쪽을 봐 : What happens on the wire when a TLS/LDAP or TLS/HTTP connection is set up?)

어떻게 델파이 XE3에서 TIdHTTPServer 및 OpenSSL을 사용하여 동일한 포트에서 SSL 및 비 SSL 트래픽을 지원 할 수 있습니까?

답변

1

주문한 제품은 기본적으로 Indy에서 불가능합니다. 기본 SSL 구현은 자체 소켓 I/O를 모두 수행하는 OpenSSL의 기존 API를 사용하므로 데이터를 먼저 들여다 보지 않고도 완전한 핸드 셰이크 데이터에 직접 액세스해야합니다. 그러나 모든 것이 사라지지 않습니다.

1) libpcap/Winpcap을 사용하여 소켓이 응용 프로그램에 제공하기 전에 새로운 연결을 위해 유선에서 가져온 원시 데이터의 처음 몇 바이트를 캡처하고 봅니다.

2) OpenSSL의 최신 BIO API 또는 Microsoft의 SChannel API를 사용하는 사용자 고유의 TIdIOHandler 파생 클래스를 작성하여 소켓 I/O를 제어하고 들어오는 바이트를 직접 읽고이를 처리를위한 암호화 엔진.

+0

다른 의견을 보내 주셔서 감사합니다. 나는 그것들을 들여다 볼 것이고 만약 내가 결국 여기에 다시 올릴 사람들 중 하나를 구현하게된다. – Andy

2

인터넷 다이렉트 (Indy)로는 이것을 구현하기가 쉽지 않을 것입니다. 아파치 웹 서버는 그렇게 할 수 없습니다. 이것은 거의 아무도이 기능을 원한 적이 없었습니다. b) 쉽지가 않습니다. 구현 또는 c) 보안 위험을 초래할 수 있습니다. https://serverfault.com/questions/359461/apache-answer-both-http-and-https-on-the-same-port

이에서 허용 대답에서

아파치 가능 될 수 없습니다. Apache에서는 에 HTTPS와 HTTP를 동일한 포트에서 실행할 수 없습니다.

HTTPS/OpenVPN 또는 SSH를 동일한 포트에서 실행하도록 설계된 몇 가지 포트 멀티플렉서를 알고 있지만 추가 소프트웨어가 필요합니다. I HTTPS 및 HTTP를 다중화 할 도구를 알지 못합니다.

관련 문제