上篇說了,命令行下操做證書的流程,再來個,c下的經常使用操做函數,這樣就能方便的在本身的程序中加入證書認證了,採用這種方式的認證基本無法破解,哈哈,固然,作好加殼。算法
命令行操做參考:數據庫
http://www.javashuo.com/article/p-ypygyqtz-ed.htmlvim
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就能夠用這個函數釋放了。ide
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)).net
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的吊銷單