openssl程式設計之服務端

2021-07-03 05:50:52 字數 3654 閱讀 8394

openssl程式設計之服務端

繼續上篇部落格,我們有了openssl的客戶端程式,本篇博文將詳細介紹服務端的openssl程式設計

服務端使用的證書相關檔案:ca.crt,server.crt,server.key,關於證書和key的生成,請參考:

程式如下:

#include "openssl/bio.h"  

#include "openssl/ssl.h"

#include "openssl/err.h"

#include

#ifndef win32

#include

#include

#include

#include

#else

#define close(x) closesocket(x)

#endif

#include

#define server_port 8080

#define ca_cert_file "server/ca.crt"

#define server_cert_file "server/server.crt"

#define server_key_file "server/server.key"

typedef

struct sockaddr sa;

int tcpinit()

while(0);

return -1;

}int main(int argc, char **argv)

printf("server running in wondows\n");

#else

printf("server running in linux\n");

#endif

ssl_ctx *ctx;

ssl *ssl;

x509 *client_cert;

char szbuffer[1024];

int nlen;

struct sockaddr_in addr;

int nlistenfd, nacceptfd;

nlistenfd = tcpinit();

ssleay_add_ssl_algorithms();

openssl_add_all_algorithms();

ssl_load_error_strings();

err_load_bio_strings();

memset(&addr, 0, sizeof(addr));

#ifndef win32

socklen_t len = sizeof(addr);

#else

int len = sizeof(addr);

#endif

nacceptfd = accept(nlistenfd, (struct sockaddr *)&addr, &len);

//int imode = 1;

//int iret = ioctlsocket(nacceptfd, fionbio, (u_long far*)&imode);

ctx = ssl_ctx_new (sslv23_method());

if( ctx == null)

// 是否要求校驗對方證書 此處不驗證客戶端身份所以為: ssl_verify_none

ssl_ctx_set_verify(ctx, ssl_verify_none, null);

// 載入ca的證書

if(!ssl_ctx_load_verify_locations(ctx, ca_cert_file, null))

// 載入自己的證書

if(ssl_ctx_use_certificate_file(ctx, server_cert_file, ssl_filetype_pem) <= 0)

// 載入自己的私鑰 私鑰的作用是,ssl握手過程中,對客戶端傳送過來的隨機

//訊息進行加密,然後客戶端再使用伺服器的公鑰進行解密,若解密後的原始訊息跟

//客戶端傳送的訊息一直,則認為此伺服器是客戶端想要鏈結的伺服器

if(ssl_ctx_use_privatekey_file(ctx, server_key_file, ssl_filetype_pem) <= 0)

// 判定私鑰是否正確

if(!ssl_ctx_check_private_key(ctx))

// 將連線付給ssl

ssl = ssl_new (ctx);

if(!ssl)

ssl_set_fd (ssl, nacceptfd);

while(1)

else

break;

}// 進行操作

memset(szbuffer, 0, sizeof(szbuffer));

nlen = ssl_read(ssl,szbuffer, sizeof(szbuffer));

fprintf(stderr, "get len %d %s ok\n", nlen, szbuffer);

strcat(szbuffer, "\n this is from server*****===server resend to client");

ssl_write(ssl, szbuffer, strlen(szbuffer));

// 釋放資源

ssl_free (ssl);

ssl_ctx_free (ctx);

close(nacceptfd);

}

編寫makefile後者使用g++ -o ***.cpp -i/usr/local/ssl/include/ -lssl test進行編譯得到test可執行檔案

現在有了客戶端和服務端的執行檔案,我們進行測試:

伺服器端:

[root@localhost ssltest]# ./test 

server running in linux

get len 56

this is

from client+++++++++++++++client send to server ok

[root@localhost ssltest]#

客戶端:

[root@localhost ssltestc]# ./test 

server running in linux

ssl_ctx_load_verify_locations start!

getlen

108

this is from client+++++++++++++++client send to

server

this is from server*****===server resend to client ok

[root@localhost ssltestc]#

表明伺服器和客戶端已經通訊成功,通過抓包工具可以看到,所有字元訊息已經變成不可識別的亂碼,linux可使用tcpdump進行抓包,在windows使用wireshark進行檢視,windows直接使用wireshark抓包即可

參考部落格:

python網路程式設計之TCP服務端開發

2.1 匯入 socket 模組import socket 2.2 建立服務端 socket 物件 socket.socket addressfamily,type 引數說明 方法說明 import socket if name main 1.建立服務端套接字 server socket socke...

網路程式設計之服務端和客戶端 Python版

tcp服務端 coding utf 8 匯入 socket 模組 import socket def main print 服務端啟動 1.建立sokcet ssock socket.socket socket.af inet,socket.sock stream 2.繫結 ssock.bind 1...

利用openssl之 htps服務端和客戶端編寫

openssl 是目前最流行的 ssl 密碼庫工具,其提供了乙個通用 健壯 功能完備的工具套件,用以支援ssl tls 協議的實現。官網 密碼演算法庫 金鑰和證書封裝管理功能 ssl通訊api介面 建立 rsa dh dsa key 引數 建立 x.509 證書 證書簽名請求 csr 和crls 證...