Secure Socket Programming 코드는 구글링을 하면 쉽게 찾을 수 있다.
이 코드를 테스트해보자!
테스트를 위해 openssl을 이용해 self signed certificate을 먼저 만든다.
Self Signed Certificate 생성 과정
1. 개인키 생성
2. 공개키 생성
3. CSR 생성
4. CRT 생성
위의 과정을 디테일하게 설명하자면
먼저 ssl 통신을 위해 서버에서는 개인키, 공개키 쌍으로 필요하다.
먼저 생성한 개인키를 기반으로 공개키를 추출할 것이다.
그리고 Certificate Sigining Request(인증요청서)를 생성한다.
인증 요청서란 SSL 인증의 정보를 암호화하여 인증기관에 보내 인증서를 발급받게 하는 신청서이다.
이 CSR도 앞서 생성한 개인키를 이용해서 만들 수 있ㄷ.
CRT(인증서)를 생성한다.
root CA를 통해서 인증서를 만들어야 맞지만, 우리는 테스트를 위한 것이니까
CSR을 명시적으로 넣어서 직접 인증서를 만들 것이다.
*참고로, 서버 개인키는 암호화되어 저장되어서는 안된다. 그렇지 않으면 관리자가 패스워드를 너무 자주 입력해야 한다.
1. 개인키 생성
$openssl genrsa -out private.key 2048
2. 공개키 생성
$ openssl rsa -in private.key -pubout -out public.key
3. CSR 생성
$ openssl req -new -key private.key -out cert.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:Gyeonggi
Locality Name (eg, city) []:Pangyo
Organization Name (eg, company) [Internet Widgits Pty Ltd]:TempCor
Organizational Unit Name (eg, section) []:TempSec
Common Name (e.g. server FQDN or YOUR name) []: # [ip address] or [url]
Email Address []:temp@temp.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
4. crt 생성
$ openssl x509 -req -days 365 -in cert.csr -signkey private.key -out cert.crt
결과
인증서, 인증요청서, 개인키와 공개키를 확인할 수 있다.
Secure Socket Programming 예제 코드
// server의 main.cpp
// server의 CMakeLists.txt
*참고로 cmake를 사용하지 않고 바로 gcc빌드해도 된다 $gcc -o ssl_server -lssl -lcrypto
// client의 main.cpp
// client의 CMakeLists.txt
# required cmake minimum version
CMAKE_MINIMUM_REQUIRED ( VERSION 3.2.1 )
# name of project
PROJECT( "ssl_client" )
SET(TARGET_EXE ssl_client)
# executable program
add_executable(${TARGET_EXE} main.cpp)
TARGET_LINK_LIBRARIES( ${TARGET_EXE} /usr/lib/x86_64-linux-gnu/libssl.a )
TARGET_LINK_LIBRARIES( ${TARGET_EXE} /usr/lib/x86_64-linux-gnu/libcrypto.so )
add_compile_options(-lssl -lcrypto -w) # openssl
이제 ssl_server, ssl_client 프로그램을 실행하여 확인해보자
실행 결과
client가 어떤 사이퍼로 연결을 성공했는지 출력한다.
client,server 코드 둘 다 패킷을 전송만 하고 있다.
SSL_read로 코드를 약간만 수정하면 서로 데이터 패킷 주고받는 것을 확인해 볼 수 있다.
출처
https://www.lesstif.com/system-admin/openssl-root-ca-ssl-6979614.html
https://blog.hangadac.com/2017/07/31/%ED%99%88%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%EA%B8%B0-ssl-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EC%97%B0%EC%8A%B5/OpenSSL API를 이용한 보안 프로그래밍, Part 3: 보안 서비스 제공하기 (한글) :: 인디노트 (tistory.com)
HTTPS와 SSL 인증서 - 생활코딩 (opentutorials.org)
A C++ Client That Sends Data Over TLS Using OpenSSL · GitHub