日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

openssl C函数总结,

發(fā)布時(shí)間:2025/5/22 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 openssl C函数总结, 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

上篇說了,命令行下操作證書的流程,再來個(gè),c下的常用操作函數(shù),這樣就能方便的在自己的程序中加入證書認(rèn)證了,采用這種方式的認(rèn)證基本沒法破解,哈哈,當(dāng)然,做好加殼。

命令行操作參考:

https://my.oschina.net/u/2265334/blog/807586

char *ERR_get_error()
??? openssl的環(huán)境初始化,同時(shí)檢查錯(cuò)誤。
RSA *RSA_generate_key(int num,
???????????????? unsigned long e,
? void (*callback)(int,int,void *),
??????????????????? void *cb_arg);
??? 產(chǎn)生一個(gè)RSA密鑰,并返回,num是密鑰長度,e是指數(shù),剩下兩個(gè)是回調(diào),簡單的應(yīng)用是用不到的,e一般取2^16+1要是一個(gè)質(zhì)數(shù),
BIO *BIO_new(BIO_METHOD *type)
??? 這個(gè)函數(shù)是ssl內(nèi)部用于傳輸轉(zhuǎn)換數(shù)據(jù)的,同時(shí)對用戶隱藏了內(nèi)部操作。
int PEM_write_bio_RSAPrivateKey(BIO *bp, RSA *x, const EVP_CIPHER *enc,
??????????????????????????????????????? unsigned char *kstr, int klen,
??????????????????????????????????????? pem_password_cb *cb, void *u);
??? 這個(gè)函數(shù)是將RSAkey寫入BIO的,后幾個(gè)參數(shù)為NULL時(shí)作用是將RSA寫入BIO buff。
int BIO_get_mem_data(BIO*,char**)
??? 提取bio中的數(shù)據(jù),寫入char*,到這里,就的到了,長度是num,指數(shù)是e的,RSA加密對,存在char中。寫入文件即得到key文件。
BIO_free();
??? 用完bio就可以用這個(gè)函數(shù)釋放了。

BIO *BIO_new_mem_buf(void *buf,int len)
??? 建立一個(gè)內(nèi)存BIO buf,同時(shí),指明這個(gè)BIO內(nèi)容的buf是什么,第二個(gè)參數(shù)為buf的長度,如果是字符串,可以用strlen獲取。
RSA *PEM_read_bio_RSAPrivateKey(BIO* bp,RSA **x,pem_password_cb *cb,void *u)
??? 這個(gè)函數(shù)是讀取bio中的rsa數(shù)據(jù),有可能rsa是被加密的,可以通過參數(shù)傳入。沒有就null,
X509_REQ *X509_REQ_new()
??? 產(chǎn)生一個(gè)證書請求的buf。
EVP_PKEY *EVP_PKEY_new();
??? 產(chǎn)生與一個(gè)EVP結(jié)構(gòu)的buf,EVP結(jié)構(gòu)用以存放RSA文件。
int EVP_PKEY_set1_RSA(EVP_PKEY*,RSA*)
??? 將一個(gè)RSA放入EVP結(jié)構(gòu)中。
X509_REQ_set_pubkey(RSA*,EVP_P *)
??? 從一個(gè)放進(jìn)RSA的evp中提取公鑰部分放入,req中。即其去n,e,這些都在證書請求中,用別的d對自己的公鑰進(jìn)行簽名。
X509_NAME *X509_REQ_get_subject_name(X509_REQ *req)
??? 得到req這個(gè)buf中的subject_name 的地址。通過這個(gè)地址,向證書中添加個(gè)人信息。用下面的函數(shù):
??? int X509_NAME_add_entry_by_txt(X509_NAME *name, "C", MBSTRING_UTF8,
???????????????????????????????????? (unsigned char *) (country),
???????????????????????????????????? int len, -1, 0))

??? int X509_NAME_add_entry_by_txt(X509_NAME *name,"ST",MBSTRING_UTF8,
???????????????????????????????????? (unsigned char *)(state),
???????????????????????????????????? int len, -1, 0))

??? int X509_NAME_add_entry_by_txt(X509_NAME *name,"L",MBSTRING_UTF8,
???????????????????????????????????? (unsigned char *)(city),
???????????????????????????????????? int len, -1, 0))

??? int X509_NAME_add_entry_by_txt(X509_NAME *name,"O",MBSTRING_UTF8,
???????????????????????????????????? (unsigned char *)(organization),
??????????????????????????????????? int len(organization), -1, 0))
??? int X509_NAME_add_entry_by_txt(X509_NAME *name,"OU",MBSTRING_UTF8,
???????????????????????????????????? (unsigned char *)(organization_unit),
???????????????????????????????????? int len, -1,0)
??? int X509_NAME_add_entry_by_txt(X509_NAME *name,"CN", MBSTRING_UTF8,
???????????????????????????????????? (unsigned char *)(cn),
???????????????????????????????????? ine len, -1, 0))

??? int X509_NAME_add_entry_by_txt(X509_NAME *name,"emailAddress", MBSTRING_UTF8,
???????????????????????????????????? (unsigned char *) (email),
???????????????????????????????????? int len, -1, 0))
?? ?
int PEM_write_bio_X509_REQ(BIO *bio, X509_REQ *req)
??? 將填入信息的req寫入bio中,進(jìn)入bio就可以用bio的操作進(jìn)行導(dǎo)出,不再重復(fù)。


X509 *PEM_read_X509(FILE *fp, X509 **x, pem_password_cb *cb, void *u);
??? 這個(gè)函數(shù)從一個(gè)fp中讀取x509的部分即,用于簽名的部分,后面的密碼和回調(diào)沒有就寫NULL,fp 應(yīng)是一個(gè)用于簽名的證書。雖說簽名的原理要有私鑰即可,可是信任證書中保存了,公鑰和給這個(gè)證書簽名的簽名鏈。用x509進(jìn)行簽名,可以追溯到上一級簽名者,直到一個(gè)覺得可以信任的證書。

RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **x,pem_password_cb *cb, void *u);
??? 從文件中讀取key文件,記得到了私鑰部分,即數(shù)值d,后面三個(gè)參數(shù)沒有可以放入NULL。
BIO_new_mem_buf
??? 這個(gè)前面說過了,這里吧csr文件放入BIO
X509_REQ *PEM_read_bio_X509_REQ(BIO *bp, X509_REQ **x, pem_password_cb *cb, void *u);
??? 這個(gè)函數(shù)從保存CSR的BIO中讀取req信息,后面三個(gè)沒有寫NULL,
EVP_PKEY_new
EVP_PKEY_set1_RSA
??? 這兩個(gè)前面也用過了,EVP是高加密解密的函數(shù),
X509 *X509_new()
??? 生產(chǎn)一個(gè)存放x509簽名的證書的buf。這個(gè)buf不是空的,填入了必要的消息,如生產(chǎn)buf的日期等,前面的時(shí)候要用到這個(gè),用于指明簽名的有效日期。
X509_CINF * X509->cert_info;
??? 這個(gè)結(jié)構(gòu)體示意語句,在X509結(jié)構(gòu)中,包還了cert_info的信息,X509的cert_info保存這個(gè)信息的指針,
X509_REQ_get_subject_name
??? 前面說過了,返回req的subname指針。
int X509_set_subject_name(X509 *cert,X509_NAME *name)
??? 設(shè)置證書的主體名稱,其中name要從,證書請求中得到,提交申請的那個(gè)請求了,可以用下面的函數(shù)得到:
??????? X509_NAME *X509_NAME_dup(X509_REQ_get_subject_name(req));當(dāng)然用X509_REQ_get_subject_name(req)不一定返回正確的信息,要進(jìn)行檢查,函數(shù)參數(shù)里引用另一個(gè)函數(shù)的返回值是危險(xiǎn)的。
ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s,long adj)

??? 設(shè)置證書的有限日期,其中,s是證書的 ->cert_info->validity->notBefor則從證書生成開始計(jì)算,adj為以后的時(shí)長,以秒計(jì)算。這是個(gè)很垃圾的設(shè)計(jì),這個(gè)函數(shù)修改s結(jié)構(gòu)體的data字段。!!失敗返回NULL
int X509_set_pubkey(X509 *x, EVP_PKEY *pkey)
??? 設(shè)置證書的公鑰部分,pkey也可以從EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req)這個(gè)函數(shù)的返回值得到,pkey應(yīng)該是證書申請中包含的公鑰而不是用于簽名的證書中的公鑰。
int X509_set_issuer_name(X509 *x, X509_NAME *name)
??? 設(shè)置證書的簽名者,name應(yīng)為用于簽名證書中的名字,那個(gè)名字是有簽名鏈的,可用509_NAME *X509_get_subject_name(X509 *a)得到,自簽名的話就用如下方式得到:xn = X509_REQ_get_subject_name(req);X509_NAME_dup(xn);
int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial)
??? 設(shè)置證書的編號,這個(gè)編號最好是隨機(jī)的,當(dāng)然也可以為了管理設(shè)置一個(gè)有意義的可以這樣得到一個(gè)ASN1_INTERGER類型的數(shù)字ASN1_INTERGER serial_no = ASN1_INTEGER_new();bn = BN_new();BN_pseudo_rand(bn, SERIAL_RAND_BITS, 0, 0);serial_no = BN_to_ASN1_INTEGER(bn, serial_no);

void X509V3_set_ctx(X509V3_CTX *ctx,
??????????????????? X509 *issuer,
??????????????????? X509 *subj,
??????????????????? X509_REQ *req,X509_CRL *crl, int flags)
??? 這個(gè)函數(shù)是用于管理CA的當(dāng)我們用自己證書給下級證書進(jìn)行簽名是,進(jìn)行的數(shù)據(jù)庫管理,issuer是用于簽名的證書,subj是下級證書,剩下的三個(gè)可以為NULL,這個(gè)函數(shù)把用于簽名的證書和下級子證書的信息填入ctx這個(gè)結(jié)構(gòu)體用于管理證書。ctx,用于和X509V3_EXT_conf_nid之間相互傳遞數(shù)據(jù),最后的整個(gè)信息鏈會在證書中體現(xiàn)。
X509_EXTENSION *X509V3_EXT_conf_nid(NULL, &ctx,
??? `?????????????? NID_subject_key_identifier, (char *)"hash");
??? 這個(gè)函數(shù)是CA管理里的一個(gè),做用是,對ctx里的證書做一定的限制,這里的NID_subject_key_identifier限制就是key值的唯一性限制,左右一個(gè)參數(shù)是extension,這個(gè)參數(shù)說明證書是否可以繼續(xù)給下級簽名,可信度等等。地一個(gè)是配置文件的地方那個(gè),NULL就是用默認(rèn)的。
int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc)
??? 吧剛才得到的一個(gè)extention這知道到證書請求中,這個(gè)是合理的,不應(yīng)該這知道用于簽名的證書中,最后一個(gè)參數(shù)寫-1,這是個(gè)匯編寫的函數(shù)。設(shè)置了extention后需要在X509V3_set_ctx一下,應(yīng)為如果設(shè)置了各種性,可能就不能加入證書庫了,
int X509_sign(X509 *,EVP_PKEY * ca_key,*mb)
??? 這個(gè)就是簽名了,在之前的證書請求設(shè)置,證書extension設(shè)置和CA維護(hù)都通過了,就可以給他錢上了,這里,地一個(gè)是證書包還證書請求的設(shè)置好證書模板,這個(gè)函數(shù)之能簽名,且之改動簽名算法用到是數(shù)據(jù),第二個(gè)就是cakey,也就是d,第三個(gè)是簽名算法,有如下:*mb=EVP_has1() 別的用vim + ctags找吧。
BIO_new(BIO_s_mem());
PEM_write_bio_X509(bio,X509)
??? 這兩個(gè)函數(shù)吧crt寫入BIO中。
$$有了簽過名的證書就可以用BIO那套函數(shù)輸出了。

X509_CRL *X509_CRL_new()
??? 生成一個(gè)空的crl buf,以后往這面填數(shù)據(jù)就好了。
int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name)
??? 填入crl簽名者名字,當(dāng)然是用于簽名的證書的信息,也只有能用于簽名的證書的信息才是有用的,name可以這樣得到:X509_get_subject_name(x509);
int X509_CRL_set_lastUpdate(X509_CRL *x, ASN1_TIME *tm);
int X509_CRL_set_lastUpdate(X509_CRL *x, ASN1_TIME *tm);
??? 這兩個(gè)函數(shù)用于這是crl的有效時(shí)間。tm可以這樣得到:ASN1_TIME *tm=ASN1_new();/*這時(shí)tm里是當(dāng)前時(shí)間*/X509_gmtime_adj(tmptm,0);/*用這個(gè)tm可以設(shè)置lsatupdate_time了*/X509_gmtime_adj(tmptm, (long)60 * 60 * 24 * VALIDITY_DAYS);/*用這個(gè)tm設(shè)置nextupdate_time*/
int X509_CRL_sort(X509_CRL *c)
??? 排序crl內(nèi)的時(shí)間,這樣時(shí)間可以作為序列號被使用。
int X509_CRL_sign(CRL *crl,EVP_PKEY *pkey,*mb)
??? 給crl進(jìn)行簽名,當(dāng)然要用d的值了,pkey為用于簽名的證書的私鑰,mb為簽名算法用EVP_sha1()別的用vim + ctags 找。
BIO_new(BIO_s_mem());
PEM_write_bio_X509_CRL(BIO,CRL)
??? 這連個(gè)函數(shù)吧crl寫入bio中就能導(dǎo)出了。

向外引出的一共四個(gè)函數(shù):
openssl_rsa_generate_key? 這個(gè)函數(shù)生成密鑰文件
??? 參數(shù):一個(gè)32為int,這個(gè)是用于取莫的數(shù)字的長度。
??? 返回:text類型證書,這里是證書。
openssl_rsa_key_to_csr??? 這個(gè)函數(shù)用輸入的key和信息生產(chǎn)csr
??? 參數(shù):text類型的key,text類型的名字,text的國家,
????????? text類型的省份,text類型的城市
????????? text類型的部門,text類型的郵箱
??? 返回:text類型的這個(gè)證書請求
openssl_csr_to_crt??????? 這個(gè)函數(shù)用ca的證書簽名csr
??? 參數(shù):text類型的csr,text類型的cacert正式路徑,text類型的cakey證書路徑
??? 返回:簽過名的證書

penssl_rsa_generate_crl?? 這個(gè)用收入的證書和密鑰生產(chǎn)crl
??? 參數(shù):text的cacert證書路徑,text的cakey路徑
??? 返回:text的吊銷單

轉(zhuǎn)載于:https://my.oschina.net/u/2265334/blog/807595

總結(jié)

以上是生活随笔為你收集整理的openssl C函数总结,的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。