使用 Openssl 验证自签名证书

本文介绍了如何在iOS应用中使用OpenSSL库验证自签名证书。通过加载证书到X509结构,然后进行验证,展示了验证证书的代码实现。在证书有效时,控制台会显示'cert OK',否则显示'cert error'。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

 

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;

// 构造CAX509_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,[stringUTF8String],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(@"CanNOT ctx init");

return;

}

//开始校验

i=0;

i=X509_verify_cert(csc);

X509_STORE_CTX_free(csc);

if (i)

NSLog(@"certOK");

else

{

NSLog(@"certerror");

}

}

 

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

cert OK

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

cert error

 

 

           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值