이 글을 읽기 전 boost.asio의 ssl적용법에 대해 궁금하신 분들은 https://hwan-shell.tistory.com/240?category=703822를 참고해주세요.
openssl 설치가 안되신 분들을 설치를 해주세요.
1. http_listener_config
http_listener_config에서 제공하는 함수중에는 set_ssl_context_callback()
함수가 있습니다.
인자로는 boost::asio::ssl::context
를 받습니다.
서버의 private.key와 certificate를 만드는 방법은 다음과 같습니다.
2. private.key & certificate
root private key
$ openssl genrsa -out rootca.key 2048
※ https 통신에는 일일히 인증서에 대한 암호입력을 하지 않아도 되기 때문에 -'des3'을 추가하지 않습니다.
또한 저렇게 생성된 key에는 public.key와 private.key가 합쳐진 상태입니다.
저 상태에서 public.key만 따로 빼는 명령어도 있지만 boost에선 필요없기 때문에 생략하겠습니다.
root certificate based on private key
$ openssl req -x509 -new -nodes -key rootca.key -days 20000 -out rootca.crt
인증서 생성.
Diffie-Hellman
$
openssl dhparam -out dh2048.pem 2048
DH암호 알고리즘 생성.
3. server.cpp 에 적용.
set_options()에는 통신방식에 대한 정보가 들어가있습니다. ssl2와 tls1, tls1.1 은 사용하지 않겠다는 뜻입니다.
set_password_callback()은 사용자가 필요로 할 때 인증서에 대한 암호를 제공해주는 함수로 생략하셔도 됩니다.
그 후에 나오는 함수들은 인증서와 key, DH정보를 읽는 용도로 사용됩니다.
3. 결과
제가 만든 인증서가 나오는것을 확인할 수 있습니다.
하지만 공인 CA가 아닌 사설(개인이 만든)CA라 신뢰할 수 없다는 정보가 출력됩니다.
와이어샤크로 패킷을 봤을 때 전송되는 정보가 암호화된 것을 확인할 수 있으며 hello패킷을 주고받는것을 확인할 수 있습니다.
하지만 boost의 ssl한계 때문인지는 모르겠지만 중간에 인증서 교환작업은 이뤄지지 않았습니다.
재 생각엔 클라이언트도 따로 구축해서 공통된 인증서를 교환할 경우에만 인증서 교환을 하는 것 같습니다.
뭔가 좀 아쉽지만 데이터가 암호화 됬다는 사실에 만족해야겠습니다.
참고 레퍼런스
'프로그래밍 > C++ rest(Casablanca)' 카테고리의 다른 글
C++] cpprestful-server 완성본(CpprestSDK) (0) | 2020.11.05 |
---|---|
C++] cpprestSDK(Casablanca) 1. http_listener 에 대해서.... (0) | 2020.07.02 |
C++] cpprestSDK 에 대한 간략한 설명. (0) | 2020.07.02 |
C++로 Restful서버 만들기(casablanca) 2. Server Sample Code (6) | 2019.05.28 |
C++로 Restful서버 만들기(casablanca) 1. 셋팅 및 설치 (1) | 2019.05.28 |
댓글