OpenSSL을 사용할 때 몇 가지 단계가 있습니다. 개인 키가있는 인증서를 포함 할 수있는 SSL 인증서가 있어야합니다. 인증서의 정확한 위치를 지정해야합니다 (이 예에서는 루트에 있음). 좋은 튜토리얼이 많이 있습니다.
일부는 다음을 포함합니다.
#include <openssl/applink.c>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
OpenSSL을 초기화해야합니다.
void InitializeSSL()
{
SSL_load_error_strings();
SSL_library_init();
OpenSSL_add_all_algorithms();
}
void DestroySSL()
{
ERR_free_strings();
EVP_cleanup();
}
void ShutdownSSL()
{
SSL_shutdown(cSSL);
SSL_free(cSSL);
}
이제 대부분의 기능에 대해 설명합니다. 연결에 while 루프를 추가 할 수 있습니다.
int sockfd, newsockfd;
SSL_CTX *sslctx;
SSL *cSSL;
InitializeSSL();
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd< 0)
{
//Log and Error
return;
}
struct sockaddr_in saiServerAddress;
bzero((char *) &saiServerAddress, sizeof(saiServerAddress));
saiServerAddress.sin_family = AF_INET;
saiServerAddress.sin_addr.s_addr = serv_addr;
saiServerAddress.sin_port = htons(aPortNumber);
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
sslctx = SSL_CTX_new( SSLv23_server_method());
SSL_CTX_set_options(sslctx, SSL_OP_SINGLE_DH_USE);
int use_cert = SSL_CTX_use_certificate_file(sslctx, "/serverCertificate.pem" , SSL_FILETYPE_PEM);
int use_prv = SSL_CTX_use_PrivateKey_file(sslctx, "/serverCertificate.pem", SSL_FILETYPE_PEM);
cSSL = SSL_new(sslctx);
SSL_set_fd(cSSL, newsockfd );
//Here is the SSL Accept portion. Now all reads and writes must use SSL
ssl_err = SSL_accept(cSSL);
if(ssl_err <= 0)
{
//Error occurred, log and close down ssl
ShutdownSSL();
}
그러면 다음을 사용하여 읽거나 쓸 수 있습니다.
SSL_read(cSSL, (char *)charBuffer, nBytesToRead);
SSL_write(cSSL, "Hi :3\n", 6);
업데이트
을 SSL_CTX_new
위해 귀하의 요구에 가장 잘 맞는 대신에, 보안의 최신 버전을 지원하는 TLS 방법으로 호출해야합니다 SSLv23_server_method()
. 참조 :
OpenSSL SSL_CTX_new 설명
TLS_method (), TLS_server_method (), TLS_client_method ().
이는 범용 버전 유연성 SSL / TLS 방법입니다. 사용되는 실제 프로토콜 버전은 클라이언트와 서버가 상호 지원하는 가장 높은 버전으로 협상됩니다. 지원되는 프로토콜은 SSLv3, TLSv1, TLSv1.1, TLSv1.2 및 TLSv1.3입니다.