使用C語言開發OpenSSL中TLS證書的校驗

2021-08-20 09:51:08 字數 3929 閱讀 8849

wsl環境安裝

參考 wsl(windows subsystem for linux)的安裝與使用

安裝必備的開發環境包

我的ubuntu 開發環境配置

sudo apt-get update

sudo apt-get install build-essential

安裝 libssl-dev

sudo apt-get update sudo apt-install openssl libssl-dev在windows上安裝clion ide

clion 2018.1.2 支援wsl 環境的開發

部署方式參見官方文件 how to use wsl development environment in clion

新建專案,在cmakelists.txt中新增

target_link_libraries(certcheck crypto) target_link_libraries(certcheck ssl)

其中certcheck為可執行檔案的名字

x509是tls/ssl證書的標準,所以在證書的處理中,很多openssl 證書處理的函式的都是以它開頭

維基百科 關於tls/ssl 證書的協議 x.509

#include

#include

#include

#include

#include

#include

bio *certificate_bio = null;

x509 *cert = null;

//initialise openssl

openssl_add_all_algorithms();

err_load_bio_strings();

err_load_crypto_strings();

//create bio object to read certificate

certificate_bio = bio_new(bio_s_file());

//read certificate into bio

if (!(bio_read_filename(certificate_bio, cert_path)))

if (!(cert = pem_read_bio_x509(certificate_bio, null, 0, null)))

其中cert就是我們在後面處理中證書變數的指標

證書的時間可以讀取到乙個asn1_time的結構型別中讀取證書時間

asn1_time *notbefore =

x509_get_notbefore

(cert)

;//讀取開始時間

asn1_time *notafter =

x509_get_notafter

(cert)

;//讀取結束時間

與當前時間比較

int day = 0;

int sec = 0;

asn1_time_diff(&day, &sec, notbefore, null);

null表示拿當前時間減notbefore的時間,然後把結果存在day和sec中,如果day和sec有乙個為負數,則表示當前時間小於notbefore

asn1_time_diff(&day, &sec, null, notafter);//那證書的結束時間與當前時間比較
這是乙個用於網域名稱匹配的函式,tls證書的網域名稱是支援萬用字元*的,但是萬用字元只能用於最末一級網域名稱

頒發給 *.example.com, 的證書可以用於下列網域名稱

payment.example.com

contact.example.com

login-secure.example.com

www.example.com

由於萬用字元證書只能覆蓋一級子域(*不匹配所有子域),該證書無法有效服務於下面的網域名稱:

test.login.example.com

當裸網域名稱被列入可選dns名稱,該證書也可被用於裸網域名稱(又稱根域)

example.com

某些數字證書認證機構存在例外情況, 例如digicert的wildcard plus證書自動包括了裸域。

引用: wikipedia萬用字元證書

bool check_string(asn1_string *as, const char *s)  else 

} else

}if (!memcmp((char *) as->data + 1, &s[i], (size_t) as->length - 1)) else

}}

下面是對主題備用名稱進行校驗

gens = x509_get_ext_d2i(cert, nid_subject_alt_name, null, null);

if (gens)

general_names_free(gens);

}

下面是對subject name 欄位的進行校驗

i = -1;

name = x509_get_subject_name(cert);

while ((i = x509_name_get_index_by_nid(name, nid_commonname, i)) >= 0)

bool valid_rsa_size(x509 *cert) 

rsa_size = rsa_size(rsa);

if (rsa_size * 8 < rsakey_min_len)

return true;

}

bool valid_extension(x509 *cert, int ext, const char *expect) 

bio_flush(bio);

bio_get_mem_ptr(bio, &bptr);

//bptr->data is not null terminated - add null character

buf = (char *) malloc((bptr->length + 1) * sizeof(char));

memcpy(buf, bptr->data, bptr->length);

buf[bptr->length] = '\0';

//can print or parse value

bool rv;

if (!strstr(buf, expect)) else

bio_free_all(bio);

free(buf);

return rv;

}

函式的輸入ext是乙個int常量,參見openssl的文件中 supported extensions

expect 是期待得到的值

openssl是乙個非常強大用於密碼學的庫

openssl x509 開發文件, 學會利用官方文件來解決問題

分析openssl的原始碼,看官方是如何利用庫來解決問題,學習他們的演算法

作者: m2kar

郵箱: m2kar.cn#gmail.com

主頁: m2kar.cn

csdn: m2kar的專欄

Linux下C語言使用openssl庫進行加密

在這裡插一小節加密的吧,使用openssl庫進行加密。使用md5加密 我們以乙個字串為例,新建乙個檔案filename.txt,在檔案內寫入hello 然後在linux下可以使用命令md5sum filename.txt計算md5值 b1946ac92492d2347c6235b4d2611184 ...

c語言gmail基於openssl的簡易程式

本程式基於imap郵件協議 環境比較奇葩,eclipse window 7 cygwin openssl gcc eclipse主要用於編寫 gcc用來編譯 gcc g l c cygwin64 lib o main main.c lssl lcrypto 對返回值未做分析,存在很多不足 gcc g...

Mac下使用GCC開發C語言程式

在mac上開發c語言程式,需要先安裝xcode,之後使用gcc 命令編譯 include int main if a c if b c printf the order of the number is n printf d,d,d n a,b,c 列印排序結果 然後在終端命令視窗敲gcc命令 gc...