SSL
Boost.Asio에는 기본 SSL 지원을 위한 클래스 및 클래스 템플릿이 포함되어 있다. 이러한 클래스는 기존 스트림 (TCP 소켓과 같은) 위에 계층화되어 암호화된 통신을 허용한다.
암호화된 스트림이 생성되기 전에, 응용프로그램은 SSL 컨텍스트 개체를 생성해야 한다. 이 개체는 검증 모드, 인증서 파일 등과 같은 SSL 옵션을 설정하는 데 사용된다. 예를 들어, 클라이언트 측 초기화는 다음과 같다:
ssl::context ctx(ssl::context::sslv23); ctx.set_verify_mode(ssl::verify_peer); ctx.load_verify_file("ca.pem");
TCP 소켓으로 SSL을 사용하려면, 다음과 같이 작성할 수 있다:
ssl::stream<ip::tcp::socket> ssl_sock(my_io_context, ctx);
아웃바운드 연결을 설정하거나 들어오는 연결을 수락하는 등 소켓 작업을 수행하려면, 먼저 ssl::stream 템플릿의 lowest_layer() 멤버 함수를 사용하여 기본 소켓을 얻어야 한다.
ip::tcp::socket::lowest_layer_type& sock = ssl_sock.lowest_layer(); sock.connect(my_endpoint);
일부 사용 사례에서 기본 스트림 개체는 SSL 스트림보다 수명이 길어야 한다. 이 경우 템플릿 파라미터는 스트림 유형에 대한 참조여야 한다:
ip::tcp::socket sock(my_io_context); ssl::stream<ip::tcp::socket&> ssl_sock(sock, ctx);
SSL 핸드셰이킹은 암호화된 연결을 통해 데이터 송수신 전에 수행되어야 한다. 이는 ssl::stream 템플릿의 handshake() 또는 async_handshake() 멤버 함수를 사용해 수행한다.
일단 연결되면, SSL 스트림 개체는 동기식이나 비동기식 읽기/쓰기 스트림용으로 사용된다. 이는 개체가 read(), async_read(), write(), async_write(), read_until(), async_read_until() 중에 사용가능한 함수와 사용됨을 의미한다.
인증서 확인 (Certificate Verification)
Boost.Asio는 SSL 인증서 확인 방법을 구성하는 다양한 방법을 제공한다:
- ssl::context::set_default_verify_paths()
- ssl::context::set_verify_mode()
- ssl::context::set_verify_callback()
- ssl::context::load_verify_file()
- ssl::stream::set_verify_mode()
- ssl::stream::set_verify_callback()
RFC6125(전송 계층 보안의 컨텍스트 ID 확인)의 규칙에 따라 인증서가 확인되는 사용 사례를 단순화하기 위해 Boost.Asio는 함수 객체로 재사용 가능한 확인 콜백을 제공한다.
다음 예제는 HTTPS에서 사용하는 규칙에 따른 원격 호스트의 인증서 확인을 보여준다:
using boost::asio::ip::tcp; namespace ssl = boost::asio::ssl; typedef ssl::stream<tcp::socket> ssl_socket; // Create a context that uses the default paths for // finding CA certificates. ssl::context ctx(ssl::context::sslv23); ctx.set_default_verify_paths(); // Open a socket and connect it to the remote host. boost::asio::io_context io_context; ssl_socket sock(io_context, ctx); tcp::resolver resolver(io_context); tcp::resolver::query query("host.name", "https"); boost::asio::connect(sock.lowest_layer(), resolver.resolve(query)); sock.lowest_layer().set_option(tcp::no_delay(true)); // Perform SSL handshake and verify the remote host's // certificate. sock.set_verify_mode(ssl::verify_peer); sock.set_verify_callback(ssl::host_name_verification("host.name")); sock.handshake(ssl_socket::client); // ... read and write as normal ...
SSL과 스레드 (SSL and Threads)
SSL 스트림 개체는 자체 잠금을 수행하지 않는다. 따라서 모든 비동기 SSL 작업은 암시적 또는 명시적 스트랜드(strand)에서 수행되어야 한다. 이는 단일 스레드 프로그램에서 동기화가 필요하지 않으므로 잠금으로 인한 오버헤드가 발생하지 않음을 의미한다.
더 보기
ssl::context, ssl::host_name_verification, ssl::stream, SSL example (C++03), SSL example (C++11).
참고
Boost.Asio의 SSL 지원을 사용하려면 OpenSSL이 필요하다. 응용프로그램이 Boost.Asio에서 래핑되지 않은 OpenSSL 기능을 사용해야 하는 경우, ssl::context::native_handle() 또는 ssl::stream::native_handle()을 호출하여 기본 OpenSSL 유형을 가져올 수 있다.
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio 개요 - C++ 2011 지원 - 이동 가능 I/O 개체 (0) | 2020.12.13 |
---|---|
Boost.Asio 개요 - C++ 2011 지원 (0) | 2020.12.13 |
Boost.Asio 개요 - Windows 전용 기능 - 객체 핸들 (0) | 2020.12.12 |
Boost.Asio 개요 - Windows 전용 기능 - 임의-접근 핸들 (0) | 2020.12.12 |
Boost.Asio 개요 - Windows 전용 기능 - 스트림-지향 핸들 (0) | 2020.12.12 |