openssl-OPENSSL PKCS7 认证哪位大神会啊!!!

问题描述

OPENSSL PKCS7 认证哪位大神会啊!!!
我用C++写了一个安卓APK的认证。
主要就是解析里面的CERT.RSA
解析:
PKCS7 *p7 = NULL;
BIO *in = BIO_new(BIO_s_file());
STACK_OF(X509) *certs = NULL;
int i;

    BIO_read_filename(in rsa_path);    p7 = d2i_PKCS7_bio(in NULL);    if(p7) {        i = OBJ_obj2nid(p7->type);    } else {        BIO_free(in);        break;    }    if(i == NID_pkcs7_signed) {        certs = p7->d.sign->cert;    } else if(i == NID_pkcs7_signedAndEnveloped) {        certs = p7->d.signed_and_enveloped->cert;    }    BIO_free(in);    if(sk_X509_num(certs) != 1) {        PKCS7_free(p7);        break;    }

认证:
BIO *p7bio = NULL;
int res = 0;
char buf[1024*4] = {0};
STACK_OF(PKCS7_SIGNER_INFO) *sk;
PKCS7_SIGNER_INFO *si;
X509 * x509;
int i;

PKCS7 *pkcs7 = (PKCS7 *)m_pkcs7;p7bio = PKCS7_dataDecode(pkcs7 0 0 0);    //这里得到的p7bio是空的!!!!为什么    //这段代码是我从网上面找到的for (;;){    i=BIO_read(p7biobufsizeof(buf));    if (i <= 0)        break;}// We can now verify signaturessk = PKCS7_get_signer_info(pkcs7);if (sk == NULL){    goto end;}else{    if (sk_PKCS7_SIGNER_INFO_num(sk) == 0)    {        goto end;    }    /* Ok first we need to for each subject entry     * see if we can verify */    for (i=0; i<sk_PKCS7_SIGNER_INFO_num(sk); i++)    {        si = sk_PKCS7_SIGNER_INFO_value(sk i);        x509 = X509_find_by_issuer_and_serial(pkcs7->d.sign->certsi->issuer_and_serial->issuersi->issuer_and_serial->serial);        int ret;        ret = PKCS7_signatureVerify(p7bio pkcs7 si x509);        if (ret <= 0)            goto end;    }}res = 1;

end:
if (p7bio)
BIO_free_all(p7bio);
return res;

解决方案

m_pkcs7数据是否正确。

解决方案二:
获取m_pkcs7
bool Certificate::parse(const char *rsa_path) {
bool ret = false;
do {
if(m_pkcs7) {
clear();
}
PKCS7 *p7 = NULL;
BIO *in = BIO_new(BIO_s_file());
STACK_OF(X509) *certs = NULL;
int i;

    BIO_read_filename(in rsa_path);    p7 = d2i_PKCS7_bio(in NULL);    if(p7) {        i = OBJ_obj2nid(p7->type);    } else {        BIO_free(in);        break;    }    if(i == NID_pkcs7_signed) {        certs = p7->d.sign->cert;    } else if(i == NID_pkcs7_signedAndEnveloped) {        certs = p7->d.signed_and_enveloped->cert;    }    BIO_free(in);    if(sk_X509_num(certs) != 1) {        PKCS7_free(p7);        break;    }    m_rsa_path = rsa_path;    m_certs = certs;    m_pkcs7 = p7;    ret = true;}while(0);return ret;

}

验证:
bool Certificate::VerifyPkcs7Signature() {
if(m_pkcs7 == NULL) {
return false;
}
BIO *p7bio = NULL;
int res = 0;
char buf[1024*4] = {0};
STACK_OF(PKCS7_SIGNER_INFO) *sk;
PKCS7_SIGNER_INFO *si;
X509 * x509;
int i;

PKCS7 *pkcs7 = (PKCS7 *)m_pkcs7;//    p7bio = PKCS7_dataInit(pkcs7NULL);p7bio = PKCS7_dataDecode(pkcs7 0 0 0);// We now have to 'read' from p7bio to calculate digests etc.do {    i = BIO_read(p7bio buf sizeof(buf));    //we can now verify signatures    sk = PKCS7_get_signer_info(pkcs7);    if(sk == NULL) {        break;    }    if(0 == sk_PKCS7_SIGNER_INFO_num(sk)) {        break;    }    for(i = 0; i < sk_PKCS7_SIGNER_INFO_num(sk); i++) {        si = sk_PKCS7_SIGNER_INFO_value(sk i);        x509 = X509_find_by_issuer_and_serial(pkcs7->d.sign->cert                                              si->issuer_and_serial->issuer                                              si->issuer_and_serial->serial);        int ret = PKCS7_signatureVerify(p7bio pkcs7 si x509);        if(ret < 0) {            res = -1;            break;        }    }}while(0);if(p7bio) {    BIO_free_all(p7bio);}return res != 1;

}
你看看有什么问题
现在是能用了,但是不知道为什么PKCS7_dataDecode仍然是空。
如果你了解怎么用PKCS7来得到签名的话,我就真的谢谢你了!!!!

时间: 2024-08-26 02:53:25

openssl-OPENSSL PKCS7 认证哪位大神会啊!!!的相关文章

dot1x-请教802.1x认证配置的windows脚本,哪位大神会写啊。

问题描述 请教802.1x认证配置的windows脚本,哪位大神会写啊. 鼠标操作,就是手动添加无线认证设置,勾选1x认证,然后去掉一些认证选项.求大神!!!

java-为什么我按照学号查询查哪个学号都是查出全部,下边有我的代码,哪位大神会的,求详解求改正谢谢了

问题描述 为什么我按照学号查询查哪个学号都是查出全部,下边有我的代码,哪位大神会的,求详解求改正谢谢了 action对应的代码: private int xueHao;public String getList() throws Exception { xueshengList = dao.getList(xueHao); return SUCCESS; } public int getXueHao() { return xueHao;}public void setXueHao(int xue

qt-Qt 编写三维动画有哪位大神会的吗?

问题描述 Qt 编写三维动画有哪位大神会的吗? 之前用MFC编写的三维动画程序,但是现在要在ARM中运行,所以需要更换开发平台.但是对Qt不是很熟悉,所以想请问一下有哪位大神有基于Qt的三维动画源代码,参考学习一下,最好是载入MS3D模型的.先提前谢谢大神了!

软件-哪位大神会nosql 查询语句

问题描述 哪位大神会nosql 查询语句 哪位大神会nosql manager for mongodb professional查询语句 本人刚学习使用这个软件,妹子求大神,,, 解决方案 还是一样的,你用它的shell.就是mongodb的javascript语法 find()

有哪位大神会用Nmap

问题描述 我已经从官网上下载安装了Nmap-6.25,百度了下使用资料,感觉是在Linux系统下,或者还要装什么才能在cmd界面下,好吧,总之我就是不会用............网上资料太少,我用的win7.有哪位大神会用啊,教教我吧,我最开始只要学最简单的,扫自己的电脑系统漏洞,或者别人的系统漏洞.愿意教的,回复一下,我立马告诉您我的QQ号,不甚感激. 解决方案 解决方案二:官网上下windows安装版(.exe),安装完后有图形界面.解决方案三:图形界面不能任意组合参数,要高级点还是要用命令

聚焦爬虫搜索,哪位大神会啊

问题描述 就是用C#程序,将从淘宝搜到的图片和数据存到数据库,这个怎么做啊,做了半天用正则表达式只能显示出来图片,不会存到数据库 解决方案 解决方案二:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingS

sdk-关于百度播放SDK的openssl版本问题,跪求大神

问题描述 关于百度播放SDK的openssl版本问题,跪求大神 如题 我在用百度播放SDK的时候 OpenSSL版本出现了问题 ,在上传谷歌市场的时候 说我的OpenSSL版本过低.哪位大神有遇到过? 该如何解决呢???? 跪求 解决方案 那就是SDK的openssl版本太低了,需要升级到新版本,老版本可能有安全问题

openssl java 双认证 ssh

问题描述 openssl java 双认证 ssh 我使用openssl创建了一个测试双认证服务.当然是自己创建CA认证服务. 生成客户端认证所需要的文件命令如下:->openssl genrsa -out test_key.pem 1024->openssl req -new -key test_key.pem -out test_req.pem -days 3650->openssl x509 -req -in test_req.pem -out test_cert.pem -day

硬件地址-哪位大神来教教我netstat -a的结果是什么意思

问题描述 哪位大神来教教我netstat -a的结果是什么意思 下面3张netstat -a的结果的图: 1.127.0.0.1:端口号,192.168.1.103:端口号,0.0.0.0:端口号,[::]:端口号,这些有什么不同?不是都是这台主机的端口吗? 2.外部地址是什么意思? 3.0.0.0.0:80和[::]:80这两个有什么不同?为什么要分开列出? 4.端口状态中established和listening有什么不同?closewait和sysn_send和fin_send是什么意思?