Openssl建立SSL雙向認證連線原始碼

2021-06-16 21:26:16 字數 2666 閱讀 9414

#include "stdio.h"

#include "string.h"

#include "openssl/ssl.h"

#include "openssl/bio.h"

#include "openssl/err.h"

#pragma comment(lib, "ws2_32.lib")

#pragma comment(lib, "libeay32.lib")

#pragma comment(lib, "ssleay32.lib")

//獲取伺服器證書

int getsrvcert(ssl * ssl, x509 ** pcert)

rv = ssl_get_verify_result(ssl);

*pcert = ssl_get_peer_certificate(ssl);

return rv;

}//驗證證書的合法性

int verifycert(x509 * pcert, const char * hostname)

;x509_name * name = null;

if(pcert == null || hostname == null) 

//獲取commonname

name = x509_get_subject_name(pcert);

x509_name_get_text_by_nid(name, nid_commonname, commonname, 512);

fprintf(stderr, "verifycert - common name on certificate: %s\n", commonname);

if(strcmp(commonname, hostname) == 0) 

else 

}int main()

;//初始化ssl庫

ssl_library_init();

err_load_bio_strings();

ssl_load_error_strings();

//新增ssl握手時所有支援的演算法

openssl_add_all_algorithms();

//設定客戶端使用的ssl版本

ssl_method* sslmethod = (ssl_method*)sslv3_client_method();

//建立ssl上下文環境 每個程序只需維護乙個ssl_ctx結構體

ctx = ssl_ctx_new(sslmethod);

//載入受信任的根證書

if(! ssl_ctx_load_verify_locations(ctx, "jinhillrootca.cer", null))

//設定證書密碼

ssl_ctx_set_default_passwd_cb_userdata(ctx, "1234");

//讀取證書檔案

ssl_ctx_use_certificate_file(ctx,"cb.crt",ssl_filetype_pem);

//讀取金鑰檔案

ssl_ctx_use_privatekey_file(ctx,"cb.key",ssl_filetype_pem);

//驗證金鑰是否與證書一致

ssl_ctx_check_private_key(ctx);

bio = bio_new_ssl_connect(ctx);

bio_get_ssl(bio, &ssl);

//裝置ssl連線模式自動重試

ssl_set_mode(ssl, ssl_mode_auto_retry);

//建議連線

bio_set_conn_hostname(bio, "www.jinhill.com:443");

fprintf(stderr, "connecting to host www.jinhill.com\n");

if(bio_do_connect(bio) <= 0)

fprintf(stderr, "retrieving peer certificate\n");

//獲取伺服器證書

if(getsrvcert(ssl, &pcert) != x509_v_ok)

//校驗伺服器證書

fprintf(stderr, "validating peer certificate\n");

if(! verifycert(pcert, "www.jinhill.com"))

//傳送http請求

//讀取http響應

fprintf(stderr, "reading response\n");

ntotallen = 0;

while(1)

szresp[nread] = 0;

ntotallen += nread;

printf("%s", szresp);

}printf("\ntotal bytes read: %i\n", ntotallen);

//關閉連線

bio_free_all(bio);

ssl_ctx_free(ctx);

return 0;

}

Openssl建立SSL雙向認證連線原始碼

include stdio.h include string.h include openssl ssl.h include openssl bio.h include openssl err.h pragma comment lib,ws2 32.lib pragma comment lib,li...

ssl協議,openssl,建立私有CA

ssl是security socket layer 安全的套接字層 他介於http和tcp協議層之間 ssl是netscape公司開發的,屬於個人 tls是標準委員會制定的 openssl是ssl的開源實現 ca 證書頒發機構 certification authority 兩台主機要通訊,他們需要...

使用Nginx配置客戶端實現SSL雙向認證

1.ca 與自簽名 建立相關目錄 mkdir ssl cd ssl製作 ca 私鑰 openssl genrsa out ca.key 2048製作 ca 根證書 公鑰 openssl req new x509 days 3650 key ca.key out ca.crt2.伺服器端證書 製作服務...