openssl C函数总结,
2019獨角獸企業重金招聘Python工程師標準>>>
上篇說了,命令行下操作證書的流程,再來個,c下的常用操作函數,這樣就能方便的在自己的程序中加入證書認證了,采用這種方式的認證基本沒法破解,哈哈,當然,做好加殼。
命令行操作參考:
https://my.oschina.net/u/2265334/blog/807586
char *ERR_get_error()
??? openssl的環境初始化,同時檢查錯誤。
RSA *RSA_generate_key(int num,
???????????????? unsigned long e,
? void (*callback)(int,int,void *),
??????????????????? void *cb_arg);
??? 產生一個RSA密鑰,并返回,num是密鑰長度,e是指數,剩下兩個是回調,簡單的應用是用不到的,e一般取2^16+1要是一個質數,
BIO *BIO_new(BIO_METHOD *type)
??? 這個函數是ssl內部用于傳輸轉換數據的,同時對用戶隱藏了內部操作。
int PEM_write_bio_RSAPrivateKey(BIO *bp, RSA *x, const EVP_CIPHER *enc,
??????????????????????????????????????? unsigned char *kstr, int klen,
??????????????????????????????????????? pem_password_cb *cb, void *u);
??? 這個函數是將RSAkey寫入BIO的,后幾個參數為NULL時作用是將RSA寫入BIO buff。
int BIO_get_mem_data(BIO*,char**)
??? 提取bio中的數據,寫入char*,到這里,就的到了,長度是num,指數是e的,RSA加密對,存在char中。寫入文件即得到key文件。
BIO_free();
??? 用完bio就可以用這個函數釋放了。
BIO *BIO_new_mem_buf(void *buf,int len)
??? 建立一個內存BIO buf,同時,指明這個BIO內容的buf是什么,第二個參數為buf的長度,如果是字符串,可以用strlen獲取。
RSA *PEM_read_bio_RSAPrivateKey(BIO* bp,RSA **x,pem_password_cb *cb,void *u)
??? 這個函數是讀取bio中的rsa數據,有可能rsa是被加密的,可以通過參數傳入。沒有就null,
X509_REQ *X509_REQ_new()
??? 產生一個證書請求的buf。
EVP_PKEY *EVP_PKEY_new();
??? 產生與一個EVP結構的buf,EVP結構用以存放RSA文件。
int EVP_PKEY_set1_RSA(EVP_PKEY*,RSA*)
??? 將一個RSA放入EVP結構中。
X509_REQ_set_pubkey(RSA*,EVP_P *)
??? 從一個放進RSA的evp中提取公鑰部分放入,req中。即其去n,e,這些都在證書請求中,用別的d對自己的公鑰進行簽名。
X509_NAME *X509_REQ_get_subject_name(X509_REQ *req)
??? 得到req這個buf中的subject_name 的地址。通過這個地址,向證書中添加個人信息。用下面的函數:
??? 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中,進入bio就可以用bio的操作進行導出,不再重復。
X509 *PEM_read_X509(FILE *fp, X509 **x, pem_password_cb *cb, void *u);
??? 這個函數從一個fp中讀取x509的部分即,用于簽名的部分,后面的密碼和回調沒有就寫NULL,fp 應是一個用于簽名的證書。雖說簽名的原理要有私鑰即可,可是信任證書中保存了,公鑰和給這個證書簽名的簽名鏈。用x509進行簽名,可以追溯到上一級簽名者,直到一個覺得可以信任的證書。
RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **x,pem_password_cb *cb, void *u);
??? 從文件中讀取key文件,記得到了私鑰部分,即數值d,后面三個參數沒有可以放入NULL。
BIO_new_mem_buf
??? 這個前面說過了,這里吧csr文件放入BIO
X509_REQ *PEM_read_bio_X509_REQ(BIO *bp, X509_REQ **x, pem_password_cb *cb, void *u);
??? 這個函數從保存CSR的BIO中讀取req信息,后面三個沒有寫NULL,
EVP_PKEY_new
EVP_PKEY_set1_RSA
??? 這兩個前面也用過了,EVP是高加密解密的函數,
X509 *X509_new()
??? 生產一個存放x509簽名的證書的buf。這個buf不是空的,填入了必要的消息,如生產buf的日期等,前面的時候要用到這個,用于指明簽名的有效日期。
X509_CINF * X509->cert_info;
??? 這個結構體示意語句,在X509結構中,包還了cert_info的信息,X509的cert_info保存這個信息的指針,
X509_REQ_get_subject_name
??? 前面說過了,返回req的subname指針。
int X509_set_subject_name(X509 *cert,X509_NAME *name)
??? 設置證書的主體名稱,其中name要從,證書請求中得到,提交申請的那個請求了,可以用下面的函數得到:
??????? X509_NAME *X509_NAME_dup(X509_REQ_get_subject_name(req));當然用X509_REQ_get_subject_name(req)不一定返回正確的信息,要進行檢查,函數參數里引用另一個函數的返回值是危險的。
ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s,long adj)
??? 設置證書的有限日期,其中,s是證書的 ->cert_info->validity->notBefor則從證書生成開始計算,adj為以后的時長,以秒計算。這是個很垃圾的設計,這個函數修改s結構體的data字段。!!失敗返回NULL
int X509_set_pubkey(X509 *x, EVP_PKEY *pkey)
??? 設置證書的公鑰部分,pkey也可以從EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req)這個函數的返回值得到,pkey應該是證書申請中包含的公鑰而不是用于簽名的證書中的公鑰。
int X509_set_issuer_name(X509 *x, X509_NAME *name)
??? 設置證書的簽名者,name應為用于簽名證書中的名字,那個名字是有簽名鏈的,可用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)
??? 設置證書的編號,這個編號最好是隨機的,當然也可以為了管理設置一個有意義的可以這樣得到一個ASN1_INTERGER類型的數字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)
??? 這個函數是用于管理CA的當我們用自己證書給下級證書進行簽名是,進行的數據庫管理,issuer是用于簽名的證書,subj是下級證書,剩下的三個可以為NULL,這個函數把用于簽名的證書和下級子證書的信息填入ctx這個結構體用于管理證書。ctx,用于和X509V3_EXT_conf_nid之間相互傳遞數據,最后的整個信息鏈會在證書中體現。
X509_EXTENSION *X509V3_EXT_conf_nid(NULL, &ctx,
??? `?????????????? NID_subject_key_identifier, (char *)"hash");
??? 這個函數是CA管理里的一個,做用是,對ctx里的證書做一定的限制,這里的NID_subject_key_identifier限制就是key值的唯一性限制,左右一個參數是extension,這個參數說明證書是否可以繼續給下級簽名,可信度等等。地一個是配置文件的地方那個,NULL就是用默認的。
int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc)
??? 吧剛才得到的一個extention這知道到證書請求中,這個是合理的,不應該這知道用于簽名的證書中,最后一個參數寫-1,這是個匯編寫的函數。設置了extention后需要在X509V3_set_ctx一下,應為如果設置了各種性,可能就不能加入證書庫了,
int X509_sign(X509 *,EVP_PKEY * ca_key,*mb)
??? 這個就是簽名了,在之前的證書請求設置,證書extension設置和CA維護都通過了,就可以給他錢上了,這里,地一個是證書包還證書請求的設置好證書模板,這個函數之能簽名,且之改動簽名算法用到是數據,第二個就是cakey,也就是d,第三個是簽名算法,有如下:*mb=EVP_has1() 別的用vim + ctags找吧。
BIO_new(BIO_s_mem());
PEM_write_bio_X509(bio,X509)
??? 這兩個函數吧crt寫入BIO中。
$$有了簽過名的證書就可以用BIO那套函數輸出了。
X509_CRL *X509_CRL_new()
??? 生成一個空的crl buf,以后往這面填數據就好了。
int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name)
??? 填入crl簽名者名字,當然是用于簽名的證書的信息,也只有能用于簽名的證書的信息才是有用的,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);
??? 這兩個函數用于這是crl的有效時間。tm可以這樣得到:ASN1_TIME *tm=ASN1_new();/*這時tm里是當前時間*/X509_gmtime_adj(tmptm,0);/*用這個tm可以設置lsatupdate_time了*/X509_gmtime_adj(tmptm, (long)60 * 60 * 24 * VALIDITY_DAYS);/*用這個tm設置nextupdate_time*/
int X509_CRL_sort(X509_CRL *c)
??? 排序crl內的時間,這樣時間可以作為序列號被使用。
int X509_CRL_sign(CRL *crl,EVP_PKEY *pkey,*mb)
??? 給crl進行簽名,當然要用d的值了,pkey為用于簽名的證書的私鑰,mb為簽名算法用EVP_sha1()別的用vim + ctags 找。
BIO_new(BIO_s_mem());
PEM_write_bio_X509_CRL(BIO,CRL)
??? 這連個函數吧crl寫入bio中就能導出了。
向外引出的一共四個函數:
openssl_rsa_generate_key? 這個函數生成密鑰文件
??? 參數:一個32為int,這個是用于取莫的數字的長度。
??? 返回:text類型證書,這里是證書。
openssl_rsa_key_to_csr??? 這個函數用輸入的key和信息生產csr
??? 參數:text類型的key,text類型的名字,text的國家,
????????? text類型的省份,text類型的城市
????????? text類型的部門,text類型的郵箱
??? 返回:text類型的這個證書請求
openssl_csr_to_crt??????? 這個函數用ca的證書簽名csr
??? 參數:text類型的csr,text類型的cacert正式路徑,text類型的cakey證書路徑
??? 返回:簽過名的證書
penssl_rsa_generate_crl?? 這個用收入的證書和密鑰生產crl
??? 參數:text的cacert證書路徑,text的cakey路徑
??? 返回:text的吊銷單
轉載于:https://my.oschina.net/u/2265334/blog/807595
總結
以上是生活随笔為你收集整理的openssl C函数总结,的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sQLserver T-SQL 事务的用
- 下一篇: jq实现跳转404跳转,原生js实现跳转