首页 | 新闻资讯 | 培训认证 | 安全管理 | 病毒分析 | 安全协议 | 网络安全 | 防火墙 | 黑客技术
DB安全 | Web安全 | 入侵检测 | 安全审计 | 设备安全 | 备份恢复 | 安全标准 | 法律法规 | 无线安全
OS安全 | PKI与PMI | 病毒防治 | 隔离网闸 | XML安全 | 网管专区 | 经典案例 | 技术论坛 |  
+ 文章搜索 +
当前位置:首页>>原创作品>>PKI与PMI>>正文
关键字:
范 围:
※推荐文章※
·openssl之pkcs7之2 data内容类型
·openssl之pkcs7之1
·OpenSSL命令行常用功能(1)
·WEB安全模块源代码分析文档之十一
·WEB安全模块源代码分析文档之十-
·WEB安全模块源代码分析文档之九-
openssl之pkcs7之3 signed-data内容类型的编码解码
作者:eboymcy 文章出处:中国信息安全组织 发布时间:2006-05-23 点击: 字体: 【

(说明:openssl技术网站上有不少evp系列,asn1系列等技术资料,没找到关于pkcs7开发的,故整理了一下自己的学习笔记。由于水平有限,肯定有不少错误,请网友不吝赐教,本人万分感谢。如需转载请保留出处.

作者 eboymcy

)

关键字:openssl   pkcs7   pkcs#7   sign

正文:

PKCS7_SIGNED.sign在openssl中的定义如下:

typedef struct pkcs7_signed_st

{

ASN1_INTEGER *version; /* version 1 */

STACK_OF(X509_ALGOR) *md_algs; /* md used */

STACK_OF(X509) *cert; /* [ 0 ] */

STACK_OF(X509_CRL) *crl; /* [ 1 ] */

STACK_OF(PKCS7_SIGNER_INFO) *signer_info;

struct pkcs7_st *contents;

} PKCS7_SIGNED;

signed内容类型由任意类型的内容和数字签名组成。任何类型的内容能够同时被任意数量的签名者签名。

签名数据的产生过程有如下几步:

1. 对于每一个签名者,他用消息摘要算法计算出摘要值 。

2. 对于每一个签名者,消息摘要和相关的信息用自己的私钥加密。

3. 对于每一个签名者,把加密的消息摘要和其他的签名者特定信息放入signer_info值中。每个 签名者的证书、crl等也在这一步被收集进来。

4. 把所有签名者的信息摘要算法、他们的signer_info值和内容一起放进sign值中。

调用openssl的代码如下:

PKCS7* p7 = PKCS7_new();

PKCS7_set_type(p7, NID_pkcs7_signed);//设置类型为NID_pkcs7_signed

PKCS7_content_new(p7, NID_pkcs7_data);

PKCS7_set_detached(p7, 0);

//添加签名者信息,

//x509:签名证书,pkey:签名者私钥。EVP_sha1()签名者摘要算法。

PKCS7_SIGNER_INFO* info = PKCS7_add_signature(p7, x509, pkey, EVP_sha1());

//添加签名者证书

PKCS7_add_certificate(p7, x509);

//添加签名者的CA证书链

for (int i=0; i<sk_X509_num(ca); i++)

{

  PKCS7_add_certificate(p7, sk_X509_value(ca, i));

}

BIO* p7bio = PKCS7_dataInit(p7, NULL);

BIO_write(p7bio, "How are you!", strlen("How are you!"));//加入原始数据,

PKCS7_dataFinal(p7, p7bio); //处理数据。

//转换为der编码输出

i2d_PKCS7(p7,&dertmp);

PKCS7_free(p7);

BIO_free(p7bio);

解析P7签名的代码:

//der编码转换为PKCS7结构体

PKCS7 * p7 =d2i_PKCS7(NULL,dertmp,derLen)

//解析出原始数据

BIO *p7bio= PKCS7_dataDecode(p7,NULL,NULL,NULL);

//从BIO中读取原始数据,将得到"How are you!"

srcLen = BIO_read(p7bio,src,1024);

//获得签名者信息stack

STACK_OF(PKCS7_SIGNER_INFO) *sk = PKCS7_get_signer_info(p7);

//获得签名者个数(本例只有1个)

int signCount = sk_PKCS7_SIGNER_INFO_num(sk );

for(int i=0;i

{

   //获得签名者信息

  PKCS7_SIGNER_INFO *signInfo = sk_PKCS7_SIGNER_INFO_value(sk,i);

  //获得签名者证书

  X509 *cert= PKCS7_cert_from_signer_info(p7,signInfo);

  //验证签名

  if(PKCS7_signatureVerify(p7bio,p7,signInfo,cert) != 1)
  {
     printf("signatureVerify Err\n");
  }

}

作者简介:
eboymcy,一直从事pki相关的研究和开发,中国信息安全组织PKI版版主。现为某CA中心高级软件工程师。
您可以通过以下方式联系他:
mail:eboymcy@163.com
blog:http://5233studio.blogchina.com

返回顶部↑】 【推荐好友】 【查看评论
用户名: 新注册) 密码: 匿名评论 [查看评论] 发表评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  Copyright © 2004-2005 infosecurity.org.cn . All Rights Reserved
版权所有:中国信息安全组织 系统管理:webmaster@infosecurity.net.cn
本站部分资源来自互联网,如有侵犯您的版权或其他问题,请通知管理员,我们会尽快处理!