openssl C函数总结,

上篇说了,命令行下操作证书的流程,再来个,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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值