2009-07-09 3 views
12

여기 내 질문이 있습니다. (. 비주얼 스튜디오 9, Qt는 4.5)는 Windows C++ 클라이언트 응용 프로그램과 통신기존 TCP 및 UDP 코드에 SSL 지원을 추가 하시겠습니까?

추가 할 매우 가장 쉬운 방법은 무엇입니까 -

는 지금은 (GCC C++를 사용하여 작성된) 리눅스 서버 응용 프로그램이 기존 프로토콜을 완전히 망쳐 놓지 않고도 통신을 보호하기 위해 양측에 SSL을 지원합니까?

UDP와 TCP의 조합을 사용하여 초기에 연결을 설정하고 포트 터널링 작업을 수행 한 다음 스트리밍 데이터에 UDP를 사용하는 VOIP 애플리케이션입니다.

나는 과거에이 물건을 작동시키는 데 필요한 처음부터 보안 인증서를 작성하는 데 많은 문제가있었습니다.

기존 작업 예제 코드가 이상적입니다.

감사합니다.

답변

11

SSL is very complex이므로 라이브러리를 사용하려고합니다.

이 샘플 코드를가집니다 같은 Keyczar, Botan, cryptlib 등 각 (예 : Boost.Asio 또는 OpenSSL이 같은 다른 제안 또는 라이브러리)의 라이브러리를 모두 같은 몇 가지 옵션이 있습니다.


(방법 너무 많은 고통을 유발하지 않고 기존 코드에 라이브러리 통합하는 방법) 두 번째 질문에 대답 : 당신의 현재 코드에 의존하는 것입니다. 이미 Winsock 또는 소켓 메서드를 호출하여 int, strings 등을 보내거나받는 간단한 함수가있는 경우 해당 함수의 내용을 다시 작성하면됩니다. 그리고 물론 소켓을 설정하는 코드를 변경하십시오.

반면에 Winsock/socket 함수를 직접 호출하는 경우 비슷한 의미론을 가진 함수를 작성하고 암호화 된 데이터를 보내고 Winsock 호출을 해당 함수로 바꿔야 할 것입니다.

그러나 Google Protocol Buffers 또는 Apache Thrift (a.k.a Facebook Thrift)으로 전환하는 것이 좋습니다. Google의 프로토콜 버퍼 설명서에는 "프로토콜 버퍼 이전에는 요청 및 응답의 수동 정렬/비 정렬을 사용한 요청 및 응답 형식이 있었으며 여러 프로토콜 버전이 지원되어 매우 추악한 코드가 생성되었습니다. ... "

현재 마샬링/언 마샬링 단계에 있습니다. 그것은 작동 할 수 있고, 사실 내가 작업하는 프로젝트는이 방법을 사용합니다. 그러나 도서관에 보관하는 것이 훨씬 더 좋습니다. 특히 미래의 소프트웨어 업데이트에 대해 이미 생각해 봤던 도서관이 있습니다.

이 라우트로 간다면 SSL 라이브러리로 네트워크 연결을 설정 한 다음 Thrift/Protocol Buffer 데이터를 해당 연결로 푸시 할 수 있습니다. 그게 전부 야. 광범위한 리팩토링이 필요하지만 유지 보수 할 코드가 적어집니다. 우리가 언급 한 프로젝트의 코드베이스에 프로토콜 버퍼를 도입했을 때 약 300 행의 마샬링/디 마샬링 코드를 제거 할 수있었습니다.

+0

안녕, 맥스, 을

그들은뿐만 아니라 당신의 기존 코드에 CyaSSL 추가에 대한 접촉의 SSL 튜토리얼이 추가 세부 정보 주셔서 감사합니다. (아마도 내 원래의 질문은 명확하게 말하지 않았을 것입니다.) 당신의 답은 저를 클릭하는 통찰력을 추가합니다. 나는 서버와 "일종의"악수 (handshake)를 수행하는 코드에서 소켓을 기반으로 한 프로세스를 꽤 못생긴 손으로 코드화했으며, 특별히 UDP 포트 터널링을 설정한다. 나머지 네트워크 코드는 "SendXMLViaTCPAndWaitForResponse()"유형 도우미 함수로 추상화되어 있습니다. 총알을 무는 것이 그렇게 힘들지 않아야하며, 도우미 fcts를 초월한 기록이 거의 필요하지 않습니다. 이 문제에 대해 다시 한 번 고마워합니다. –

4

GnuTLS은 클라이언트와 서버 측 모두에서 TCP 연결에만 사용하는 것이 좋습니다. 지금 UDP 데이터는 잊어 버려. GnuTLS 문서에는 클라이언트와 서버 모두를 작성하기위한 example code이 있습니다. 적어도 서버 측 (일반적으로 TCP 응답자)에는 인증서가 있어야한다는 점을 이해하십시오. 클라이언트 측은 익명의 ID로 작업 할 수 있습니다 (예 : DH 인증서 만 사용하는 서버 인증서가없는 경우에도 man-in-the-middle 공격 허용).

일반적으로 사용하는 라이브러리에 관계없이 SSL 원칙을 이해해야합니다. 라이브러리 대안은 OpenSSL (Unix 및 Windows)과 SChannel (Windows 만 해당)입니다.

2

Boost.Asio 또는 ACE에서 SSL 지원을 시도한 적이 있습니까? 둘 다 OpenSSL을 사용하고 TCP, UDP 및 SSL에 대해 유사한 추상화를 제공합니다. 샘플 코드는 Boost.Asio 및 ACE 배포판에서 사용할 수 있습니다.

SSL은 스트림 지향 (TCP 및 UDP) 대신 레코드 지향적이라는 점을 명심해야합니다. 예를 들어, 읽기 작업을 완료하기 전에 전체 SSL 레코드를 읽어야하기 때문에 이벤트를 다중화하는 방법에 영향을 미칠 수 있습니다.

2

응용 프로그램을 변경하지 않고이를 처리하려면 stunnel 프로젝트 (http://www.stunnel.org/)를보고 싶을 수 있습니다. 나는 그것이 당신을 위해 UDP를 처리 할 것이라고 생각하지 않습니다.

2

yaSSL 및 CyaSSL 임베디드 SSL/TLS 라이브러리는 과거 나를 위해 잘 작동했습니다. 임베디드 시스템을 대상으로하므로 속도와 크기가 모두 최적화되어 있습니다. yaSSL은 C++로 작성되었으며 CyaSSL은 C로 작성되었습니다. 비교해 보면 CyaSSL은 OpenSSL보다 최대 20 배까지 작을 수 있습니다.

모두 최신 업계 표준 (최대 TLS 1.2)을 지원하며 스트림 암호와 같은 멋진 기능을 제공하며 GPLv2 및 상용 라이센스 (상업적 지원이 필요한 경우)로 이중 라이센스가 부여됩니다. http://www.yassl.com/yaSSL/Docs-cyassl-manual-11-ssl-tutorial.html

제품 페이지 : http://yassl.com/yaSSL/Products.html

감사합니다,
크리스

+0

안녕하세요, Chris, 답변 해 주셔서 감사합니다. 불행히도, 내 게시물 이후 1 년 이상이 지났고 클라이언트는 프로젝트를 취소하고 2 주 전에 프로젝트에서 저를 버렸습니다. –

+0

슬프고 들으십시오. 게시 이후 오랜 시간이 걸렸다는 것을 알았지 만 나중에 참조할만한 게시물로 남았습니다. – Chrisc

관련 문제