使用 Openssl 验证自签名证书

2023-10-27

原文地址: http://blog.csdn.net/kmyhy/article/details/6546072

iOS的 security framework 框架前面已经介绍。这个框架提供有限的功能,使用它能做到的,比你想象的要少。笔者一直想找一个 iOS 下比较好的功能全面的安全算法库,结果却一无所获。不知道谁能介绍下这方面。

最终还是只有求助于闻名已久的 Openssl library。

Openssl 确实十分强大,然而其糟糕文档仍让人难以满意。当然,网络上使用Openssl 的例子非常多,不过能写这个的似乎都是高手,必然跟菜鸟划清界限——如果你是一个菜鸟,高手是不会跟你解释每行代码分别都是什么意思。坚信求人不如求己,钻研了许久,终于写出了点能够运行的 Code。

主要参考的来源:一是 Openssl 库中的源代码,一是这本书《Openssl编程》(赵春平 著)——说它是书可能有些勉强,因为没有得以出版(不知道出版社的编辑们看到这本书没?)。但它确实是本 Openssl 方面比较全面的介绍(难得的中文参考书),如果你想对 Openssl 有所了解,不妨把它找来看看(openssl.cn 论坛上)。

一、编译 iOS Openssl 静态库

请参考《在你的 iOS App 中使用 OpenSSL 库》。

二、在 Xcode 项目中进行设置

同上

三、使用 Openssl 验证

直接上代码:

#import <OpenSsl/x509.h>

#import <Openssl/x509v3.h>

void loadCert( NSString *, X509 *);

void printX509( X509 *);

void verity( X509 *, NSString *);

int main( int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[ NSAutoreleasePool alloc init ];

NSString *file= @"/Users/username/Desktop/client.cer" ;

// 新建一个 x509 结构

X509 *x= X509_new ();

loadCert (file,x);

printX509 (x);

// 开始验证

verity (x,file);

// 释放结构体

X509_free (x);

[pool release ];

    return 0 ;

}

// 加载证书到 X509 结构

void loadCert( NSString * string, X509 * x){

NSData * certData;

unsigned char buf[ 4096 ],*p;

int len;

assert (string!= nil );

// 读取证书文件

certData=[ NSData dataWithContentsOfFile :string];

assert (certData!= nil );

len=certData. length ;

// NSData-->uchar*

[certData getBytes :( void *)buf length :len];

// p-->buf[0]

p=buf;

 

//  buf 中的数据进行解码,并返回一个 X509 结构

d2i_X509 (&x,( const unsigned char **)&p,len);

}

// 打印 X509 结构

void printX509( X509 * x){

int ret;

BIO *b;

// 初始化一个文件 BIO

b= BIO_new ( BIO_s_file ());

// 把标准输出 stdout 指向这个文件 BIO

BIO_set_fp (b, stdout , BIO_NOCLOSE );

//  X509 结构打印输出到文件 BIO

ret= X509_print (b,x);

// 释放流

BIO_free (b);

}

// 验证自签名证书

void verity( X509 * x1, NSString * string){

int i= 0 ;

X509_LOOKUP *lookup= NULL ;

// 证书 store 结构体

X509_STORE *cert_ctx;

// 证书 store 相关的上下文

X509_STORE_CTX *csc;

// 构造 CA  X509_STORE 结构体,包含所有有效证书链和废止证书链,用于校验

cert_ctx= X509_STORE_new ();

//  store 中加入一个搜索,可以查找单个的文件

lookup= X509_STORE_add_lookup (cert_ctx, X509_LOOKUP_file ());

assert (lookup!= NULL );

// 通过 lookup 加载 client.cer 内的证书(自签名)

i= X509_LOOKUP_load_file (lookup,[string UTF8String ], X509_FILETYPE_ASN1 );

assert (i!= 0 );

//  flags 赋值给 ctx 里面的 flags, 表明了验证证书时需要验证哪些项

// flags 可以是:

// X509_V_FLAG_IGNORE_CRITICAL 

// X509_V_FLAG_CB_ISSUER_CHECK 

// X509_V_FLAG_CRL_CHECK 

// X509_V_FLAG_CRL_CHECK│X509_V_FLAG_CRL_CHECK_ALL 

X509_STORE_set_flags (cert_ctx, X509_V_FLAG_CRL_CHECK_ALL );

csc = X509_STORE_CTX_new ();

if (! X509_STORE_CTX_init (csc,cert_ctx ,x1, NULL ))

{

NSLog ( @"Can NOT ctx init" );

return ;

}

// 开始校验

i= 0 ;

i= X509_verify_cert (csc);

X509_STORE_CTX_free (csc);

if (i)

NSLog ( @"cert OK" );

else

{

NSLog ( @"cert error" );

}

}

 

先搞个有效证书,client.cer,放在你的桌面上。运行程序,控制台打印:

cert OK

如果证书失效了(比如把证书有效期改为无效),控制台则打印:

cert error


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Openssl 验证自签名证书 的相关文章

随机推荐

  • linux path 多个目录,Linux下多路径Multipath的简单配置

    Linux下多路径Multipath的简单配置 1 启用Multipath 1 启动multipathd服务 service multipathd start 或者 etc init d multipathd start 2 修改multi
  • python房价预测_Python——决策树实战:california房价预测

    Python 决策树实战 california房价预测 编译环境 Anaconda Jupyter Notebook 首先 导入模块 1 importpandas as pd2 importmatplotlib pyplot as plt3
  • 手写算法-python代码实现Kmeans

    手写算法 python代码实现Kmeans 原理解析 代码实现 实例演示 sklearn对比 总结 原理解析 今天 我们来讲一下Kmeans 一种无监督聚类算法 也是最为经典的基于划分的聚类方法 它的思想是 对于给定的样本集 按照样本之间的
  • java中的 Set转List

    构造Map数据 Map
  • Mysql详解

    一 数据库的基本概念 数据库的英文单词 DataBase DB 数据库 用来存储和管理数据的仓库 数据库的特点 持久化存储数据 其实数据库就是一个文件系统 方便存储和管理数据 使用了统一的方式操作数据库 SQL 常见的数据库软件 MySQL
  • 两阶段最小二乘法_最小二乘法(Least Squares)简介

    最小二乘法简介 最小二乘法 Least Squares 是回归分析中的一种标准方法 它是用来近似超定系统 Overdetermined System 答案的一种方法 超定系统是指数学中的一种概念 一组包含未知数的方程组中 如果方程的数量大于
  • arm平台编译adb

    参考github https github com bonnyfone adb arm 本来的目的是在arm平台编译以后能够使用adb shell获取shell权限 然后就可以避开其他权限无法执行su的问题 最开始 先修改了android源
  • kodi刮削器 中文_手把手教您设置KODI播放器,3分钟打造家庭影院级媒体库,流畅播放NAS里的原盘电影!...

    创作立场声明 此文为比较基础的KODI播放器的保姆级安装和配置教程 希望可以帮助一些初入家庭影音的值友们 关于KODI KODI是一款播放器 也是一款媒体库管理软件 不仅在电视上可以安装 还可以在windows电脑上进行安装 当下载高清 高
  • Vue3记录

    Vue3快速上手 1 Vue3简介 2020年9月18日 Vue js发布3 0版本 代号 One Piece 海贼王 耗时2年多 2600 次提交 30 个RFC 600 次PR 99位贡献者 github上的tags地址 https g
  • 【1】TypeScript入门——基本认知

    一 基本认知 1 优点 TypeScript 更加可靠 它与使用 JavaScript 相比 不仅支持在任何地方直观地获取组件的接口定义 还能对属性 状态中的值是否为空进行自动检测并给出提示 容错处理 甚至还支持对 React JSX元素接
  • Java创建数组的方法

    最近学Java 一点小心得 希望和大家分享一下 第一次写文章 写的不好希望大家谅解 当然我也会尽力写好这篇文章 Java创建数组的方法大致有三种 说明 这里以int为数据类型 以arr为数组名来演示 一 声明并赋值 int arr 1 2
  • 嵌入式学习——c语言数据的输入输出

    嵌入式学习 c语言数据的输入输出 一 输入输出概念 1 2C语言本身不提供输入输出语句 1 3 include头文件放在程序中 二 printf输出数据 2 2格式字符 三 scanf输入数据 3 1scanf一般格式 四 输入输出函数 4
  • Spring Boot之分离测试和生产环境的应用配置

    多环境应用配置 将默认不变的配置 设置在application properties文件中 新建开发环境下的属性文件application dev properties 将开发中的配置 设置在该文件中 新建生产环境下的属性文件applica
  • “点两下”就能开发一个AI应用!百度砸亿元基金、千万算力要搞插件生态

    金磊 发自 武汉量子位 公众号 QbitAI 这年头 要想开发一个AI应用 怎么搞 只需要简单的 点击 动作就可以了 例如你想开发一个AI作画的App 只需要先点击与之相匹配的能力 简笔成画 根据手绘草图和语言 生成符合要求的图片 言语之美
  • fiddler设置好代理后不能上网(方法二)

    1 打开fiddler在工具栏找到Tools gt options Connections选项如下图 将Allow remote computers to connect 勾选上 然后记住默认8888这个端口 可更改 设置手机代理时会用到
  • 2023高教社数学建模国赛A题 - 定日镜场的优化设计 - 思路

    问题1 计算年平均光学效率和输出热功率 建立模型的坐标系 以圆形区域中心为原点 正东方向为x轴 正北方向为y轴 垂直地面向上为z轴 计算吸收塔和定日镜的位置 吸收塔建于圆形定日镜场中心 根据给定的数据确定定日镜的位置 计算每个定日镜的光学效
  • 使用阿里云OSS实现文件的上传、下载、删除及修改功能

    一 配置OSS相关配置信息 1 要配置 OSS 相关配置信息 您可以按照以下步骤操作 登录阿里云控制台 进入 OSS 控制台 创建一个新的 OSS Bucket 并记录下以下信息 Bucket 名称 Bucket 所属地域 AccessKe
  • 如何解决git上传文件出错[rejected] master -> master (fetch first) error: failed to push some refs to '

    rejected master gt master fetch first error failed to push some refs to git gitee co 上传到码云的时候 报了这个错误 rejected master gt
  • 使用sklearn学习多项式回归(三)

    目录 1 什么是线性 1 1 变量之间的线性关系 1 2 数据间的线性与非线性 1 3 线性模型与非线性模型 1 4 使用分箱处理非线性问题 2 多项式回归PolynomialFeatures 2 1 什么是多项式回归 2 2 多项式回归处
  • 使用 Openssl 验证自签名证书

    原文地址 http blog csdn net kmyhy article details 6546072 iOS的 security framework 框架前面已经介绍 这个框架提供有限的功能 使用它能做到的 比你想象的要少 笔者一直想