2014-10-31 4 views
0

내 클라이언트 - 서버 프로그램은 OpenSSL을 사용하여 데이터 교환을 처리하고 작동하지만 내 클라이언트가 연결하는 서버가 올바른 서버인지 가짜 서버인지 확인해야합니다.안전한 서버 클라이언트 핸드 셰이크 방법

문제는 내 프로그램이 자체 서명 된 인증서를 생성하고 클라이언트가 그 사실을 확인할 수 없다는 것입니다. 인증서를 삽입하면 누구든지 인증서를 추출하고 가짜 클라이언트 - 서버를 만들고 정보를 훔치려 고 시도 할 수 있습니다. OpenPGP 키와 동일합니다.

그래서 클라이언트이기 때문에 모든 사람이 서버 바이너리를 사용할 수있는 경우에도 서버를 확인하는 몇 가지 방법을 구현할 수 있습니까?

+0

"인증서를 포함하면 누군가가이를 추출하여 가짜 클라이언트 - 서버를 만들어 정보를 도용 할 수 있습니다."라는 말이 올바르지 않습니다. 개인 키를 포함시키는 경우에만 발생할 수 있습니다. 간단한 해결책은 언제나 그렇듯이 CA가 서명 한 인증서를 얻는 것입니다. – EJP

+0

하지만 개인 키가 서버에 있어야합니다. 맞습니까? 클라이언트는 P2P와 마찬가지로 서버 역할을합니다. – Fusgyus

답변

0

이 경우 보안 인증은 실제 인증서에 의존하지 않지만 해당 키 쌍이 적용됩니다.

비대칭 암호화는 개인 키와 공개 키를 사용합니다. 개인 키는 기밀로 유지되어야합니다 (따라서 으로 정확하게 설명한 서버 인 서버로 인증해야하는 서버에 보관하십시오). 공개 키는 임의로 퍼뜨릴 수 있습니다. 누군가가 할 수있는 유일한 방법은 개인 키 보유자에 대한 정보를 암호화하거나 자신이 발행 한 서명을 검증하는 것입니다.

실제 인증 프로세스의 기본 개념은 인증 클라이언트가 올바른 서버 만 암호 해독하고 반환 할 수있는 암호화 된 임의의 번호를 보내거나 서버가 클라이언트에 정의 된 것을 서명하도록함으로써 작동합니다. 인증을 위해 구현되는 실제 프로세스는 man-in-the-middle-attack을 방지하기 위해 좀 더 복잡하지만이 대답의 범위를 훨씬 뛰어 넘습니다.

클라이언트이기 때문에 모든 사람이 서버 바이너리를 사용할 수있는 경우에도 서버를 확인하기위한 몇 가지 방법을 구현할 수 있습니까?

이미 알고있는 것에 의지하고 암호 코드를 직접 구현하지 마십시오. 어쨌든 키를 배포하는 중이라면 using TLS for encrypted communication을 고려해보십시오. 핸드 셰이크 단계에서 인증이 수행됩니다.

+0

프로그램에서 이미 TLS 1.2를 사용하고 있지만 가짜 서버가 올바른 서버처럼 작동하고 내 프로토콜 핸드 셰이크 (TLS 연결이 설정된 후 수행됨)를 검사 한 다음 정보를 도용하기 시작할 수 있습니다. 서버 바이너리가 알려져 있기 때문에 30 개 파티가 포함되지 않은 모든 방법은 리버스 엔지니어링을하는 경향이 있다고 생각합니다. – Fusgyus

+0

서버 인증서의 지문을 확인하면이 문제가 발생할 수 없습니다. 어느 누구도 개인 키없이 TLS 핸드 셰이크를 수행 할 수 없으며 게시 할 필요가 없습니다. –

+0

죄송합니다. 이해가 가지 않습니다. TLS 핸드 셰이크를 수행하는 내 서버 (클라이언트도 P2P와 비슷하지만 그렇지 않습니다)에 개인 키를 포함해야합니다 (?). 따라서 리버스 엔지니어링을 통해 서버 바이너리를 개인 키로 가져 가지 않는 공격자가 어떻게 될 수 있습니다. – Fusgyus