上次我们停在
inl = ASN1_item_i2d(asn, &buf_in, it);
调用处(注意是第2次中断),此时的调用栈为
> openssl.exe!ASN1_item_verify
  openssl.exe!X509_verify
  openssl.exe!internal_verify
  openssl.exe!X509_verify_cert
  openssl.exe!check
  openssl.exe!verify_main
  openssl.exe!do_cmd
  openssl.exe!main

我们目标锁定在函数唯一的入参asn上,只有它才可能引起返回参数错误
查看上一层函数栈,代码上下文如下

1 int X509_verify(X509 *a, EVP_PKEY *r)
2  {
3  return(ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF),a->sig_alg,
4   a->signature,a->cert_info,r));
5  }

原来asn是参数a->cert_info,其类型为指向X509_CINF *的指针
在VC自动变量查看窗口,查看a->cert_info的当前值,如下

这里简单介绍下,cert_info 是指向结构X509_CINF(x509_cinf_st)的指针,而 X509_CINF 是 OpenSSL 内部表示证书信息的数据结构
上图中cert_info展开的成员表示证书的某个属性,比如subject表示当前证书持有者的身份信息,等等

再看serialNumber这个成员,它是asn1_string_st*类型,表示证书的序列号,见下面数据结构定义

typedef struct x509_cinf_st{ASN1_INTEGER *version;        /* [ 0 ] default of v1 */ASN1_INTEGER *serialNumber;X509_ALGOR *signature;X509_NAME *issuer;X509_VAL *validity;X509_NAME *subject;X509_PUBKEY *key;ASN1_BIT_STRING *issuerUID;        /* [ 1 ] optional in v2 */ASN1_BIT_STRING *subjectUID;        /* [ 2 ] optional in v2 */STACK_OF(X509_EXTENSION) *extensions;    /* [ 3 ] optional in v3 */} X509_CINF;typedef struct asn1_string_st ASN1_INTEGER;typedef struct asn1_string_st{int length;int type;unsigned char *data;/* The value of the following field depends on the type being* held.  It is mostly being used for BIT_STRING so if the* input data has a non-zero 'unused bits' value, it will be* handled correctly */long flags;} ASN1_STRING;

当前我们看到证书序列号长度为8(见length成员),内容(由data指出)如下
0x006053c0  00 a2 42 4a a2 6a 51 df [cd cd fd fd fd fd ab ab] -- []中的内容不是序列号部分
刚好比证书中的序列号 00 00 a2 42 4a a2 6a 51 df 少一个0x00字节

现在基本可以肯定,正是这里被截断了一个字节,造成后面的一系列错误并最终导致证书验证不过
我们可以做个实验,来验证 serialNumber 的 data 内容不对是造成后面错误的原因

当程序第2次中断在 inl = ASN1_item_i2d(asn, &buf_in, it); 调用处时,我们将内存中序列号的内容临时修改为正确的值
   00 a2 42 4a a2 6a 51 df
改为
00 00 a2 42 4a a2 6a 51 df

F10继续执行,再在 int main(int Argc, char *Argv[]) 中的第8行(注意是显示行)设断点

 1     /* ok, now check that there are not arguments, if there are,
 2      * run with them, shifting the ssleay off the front */
 3     if (Argc != 1)
 4         {
 5         Argc--;
 6         Argv++;
 7         ret=do_cmd(prog,Argc,Argv);
 8         if (ret < 0) ret=0;
 9         goto end;
10         }

按F5全速前进,屏幕上终于打出久违的
openssl.cert.verify.error.pem: OK

这说明,到此为止我们的猜测都是正确

剩下的任务很简单,就是追踪为什么serialNumber记录的序列号出错
而正是从这里开始,我们将进入证书解析Asn1parse命令的Kernel部分

转载于:https://www.cnblogs.com/efzju/archive/2012/04/12/2443345.html

走读OpenSSL代码----从一张奇怪的证书说起(五)相关推荐

  1. 一张六西格玛证书,换取五十万年薪 -- 优思学院

    一般从事非管理阶层的朋友都苦于工资低,有些人工作5年了还在为月入过万而发愁.小编之前也是制造业的苦工,做技术的话工资涨幅涨不过货币贬值,做管理自己又不是那个性格也没有背景,当时也想过考一个含金量的证来 ...

  2. Java福尔摩斯的约会大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧 3485djDkxh4hhGE 2984akDfkkkkggEdsb shgsfdk dHyscvnm”。大侦探很快就明白了

    题目描述: 大侦探福尔摩斯接到一张奇怪的字条:"我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm&qu ...

  3. OpenSSL 代码问题漏洞(CVE-2020-1971)(CVE-2020-1967)

    突然接到任务要维护服务器,一脸懵逼,硬着头皮上..... 一.OpenSSL 代码问题漏洞(CVE-2020-1967) 目前厂商已发布升级补丁以修复漏洞,补丁获取链接: https://www.op ...

  4. OpenSSL 使用拾遗(二)---- X509 证书的 SKID/AKID 字段

    SKID(证书使用者密钥标识符,subject key identifier 的简称)和 AKID(证书颁发机构密钥标识符,authority key identifier 的简称)是 X509 证书 ...

  5. 套用模板,又申请了两张软著证书

    关于软著申请,之前写过一篇相关的介绍 软件著作权申请成功,申请流程攻略,附模板 ,可以看一看. 值得一提的是,因为存在信息不对称的缘故,软著申请代办的行业应运而生,看某宝就知道了.其实大可不必去找这些 ...

  6. openssl 自建ca,颁发客户端证书

    openssl 自建ca,颁发客户端证书 概念理解 数字证书: 数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在Internet上验证通信实体身份的方式,数字证书不是数字身份证,而 ...

  7. 基于OpenSSL自建CA和颁发SSL证书

    关于SSL/TLS介绍见文章 SSL/TLS原理详解. 关于证书授权中心CA以及数字证书等概念,请移步 OpenSSL 与 SSL 数字证书概念贴 . openssl是一个开源程序的套件.这个套件有三 ...

  8. 数据3分钟丨​PingCAP DevCon 2021回顾;openGauss社区颁发首张OGCA认证证书

    数据 3 分钟 由 ACDU (中国 DBA 联盟) 与墨天轮联合出品的全新视频节目上线啦-三分钟带你来了解数据行业动态,节目内容主要包含数据行业最新的产品发布.公司大事件.行业新闻等. 本期内容概览 ...

  9. python︱写markdown一样写网页,代码快速生成web工具:streamlit 缓存(五)

    系列参考: python︱写markdown一样写网页,代码快速生成web工具:streamlit介绍(一) python︱写markdown一样写网页,代码快速生成web工具:streamlit 重 ...

最新文章

  1. OpenGL ES3 非常好的系列文章
  2. sort与sorted
  3. 手把手教你:如何让Windows恋上Linux bash
  4. Python爬虫入门(1):综述
  5. DE连接,创建数据集,数据导入以及数据导出(转载)
  6. Java基础知识强化83:System类之gc()方法(垃圾回收)以及和finalize()区别
  7. eai app_EAI的Spring集成教程
  8. docker mysql:8.0.27
  9. Android_Jar mismatch! Fix your dependencies
  10. 微信小程序-滚动消息通知
  11. 系列(一):加解密字符串及配置文件(CSASPNETEncryptAndDecryptConfiguration)
  12. 免费下载百度文库需下载券文件
  13. 抢购器 抢拍器 秒杀器 秒杀软件 抢购软件 设计思路(未实现)
  14. 算法竞赛宝典 递归算法 地盘划分
  15. ug创建html文件,UG8.0如何创建和打开中文名称的部件
  16. HALO博客配置华为云OSS上传附件
  17. VL53L0X+stm32激光测距
  18. 乐博乐博亮相2020科博会,掀起少儿编程教育新浪潮!
  19. 四川子苗电商:抖音直播安心购怎么解约?
  20. R: 更改行名及矩阵数据提取的易错点——下标出界

热门文章

  1. 字节Java高工面试:java软件开发工程师的市场薪资
  2. 【高级Java架构师系统学习】java十六进制字符串转数字
  3. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY4-决策树
  4. 智能集群理论优化控制_无人机集群对抗研究的关键问题
  5. 打开闪光灯java代码_android 拍照带水印(可打开闪光灯功能)
  6. iconfont 图标转为字体_阿里字体库iconfont使用方法
  7. mysql gtid 1236_MYSQL主从搭建GTID报错 error 1236 master has purged binary logs containing GTIDs?...
  8. 网络营销激烈竞争下,网站被黑了怎么办?
  9. 网络营销专员浅析在网络营销中网站关键词对网站流量获取有何影响?
  10. 个人网站建设要避开这些“通病”