Có một số bước khi sử dụng OpenSSL. Bạn phải có chứng chỉ SSL được tạo, chứng chỉ này có thể chứa chứng chỉ với khóa cá nhân, hãy chắc chắn chỉ định vị trí chính xác của chứng chỉ (ví dụ này có nó trong thư mục gốc). Có rất nhiều hướng dẫn tốt trên mạng.
Một số bao gồm:
#include <openssl/applink.c>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
Bạn sẽ cần khởi tạo 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);
}
Bây giờ cho phần lớn các chức năng. Bạn có thể muốn thêm một vòng lặp trong khi kết nối.
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();
}
Sau đó, bạn có thể đọc hoặc viết bằng:
SSL_read(cSSL, (char *)charBuffer, nBytesToRead);
SSL_write(cSSL, "Hi :3\n", 6);
Cập nhật
Sự SSL_CTX_new
nên được gọi là phương pháp TLS phù hợp nhất với nhu cầu của bạn để hỗ trợ các phiên bản mới hơn của an ninh, thay vì SSLv23_server_method()
. Xem:
Mô tả OpenSSL SSL_CTX_new
TLS_method (), TLS_server_method (), TLS_client_method ().
Đây là các phương pháp SSL / TLS phiên bản linh hoạt có mục đích chung . Phiên bản giao thức thực tế được sử dụng sẽ được thương lượng với phiên bản cao nhất được hỗ trợ lẫn nhau bởi máy khách và máy chủ. Các giao thức được hỗ trợ là SSLv3, TLSv1, TLSv1.1, TLSv1.2 và TLSv1.3.