`
wangpengfei360
  • 浏览: 1055917 次
文章分类
社区版块
存档分类
最新评论

使用 Openssl 验证自签名证书

 
阅读更多

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

分享到:
评论

相关推荐

    openssl自签名证书命令

    https目前广泛流行,现提供openssl自签名证书的命令和基本验证命令。

    用openssl命令制作生成证书和自签名

    用openssl命令制作生成证书和自签名

    golang生成公钥私钥证书 及 自签名证书 通过云账号dns验证直接生成freessl证书 openssl常用方法介绍

    1.go生成rsa证书 自签名证书 2.go生成ecc证书 自签名证书 3.go生成公钥私钥 4.对自已生成的公钥私钥进行签名,得到签名证书crt 5.通过设置云dns账号直接生成freessl证书 6.openssl一些惯用方法介绍 7.如生成pfx格式的...

    使用openssl 1.1.1版本,调试国密SM2签名、验签、加密解密、SM3

    OpenSSL 1.1.1 新特性: 全面支持国密SM2/SM3/SM4加密算法,最近的项目涉及到国密,又局限于资源有限,只能只能上了。

    使用数字证书进行PKCS#7数字签名

    越来越多的应用需要我们使用USB接口数字证书进行PKCS#7数字签名。本文分别介绍了使用微软CryptoAPI方式和OpenSSL Engine方式进行数字签名。特别地,提出了OpenSSL Engine简化方式,这种方式更为灵活方便易行。

    国密SM2算法基于Openssl实现

    实现数字签名和密钥交换,公钥加密没有实现。全部源代码,需要Openssl库支持,VC工程。 KDF使用标准HASH算法,没有使用SM3。 可参考作者的SM3算法实现KDF。 ECC曲线使用SM2算法建议曲线,内含SM2建议曲线测试。 仅...

    certify:使用“subjectAltName”扩展名创建自签名证书

    一旦您的浏览器拥有自签名证书的合法副本,您就可以通过加密的 TLS 连接安全地访问该网站。 由于政府控制根证书颁发机构,一些人甚至认为安全分发的自签名证书。 至少,自签名证书成功地避免了以明文形式发送密码。...

    openssl-1.0.0a

    OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。 7.Engine机制 Engine机制的出现是在OpenSSL的0.9.6版的事情,开始的时候是将普通版本跟支持Engine的版本...

    openssl 编程 当前版本

    26.7.2 Openssl中的证书验证 221 第二十七章 OCSP 222 27.1 概述 222 27.2 openssl实现 222 27.3 主要函数 222 27.4编程示例 227 第二十八章 CRL 228 28.1 CRL介绍 228 28.2 数据结构 228 28.3 CRL函数 230 28.4 ...

    openssl编程

    213 26.7 证书验证 216 26.7.1证书验证项 216 26.7.2 Openssl中的证书验证 216 第二十七章 Openssl OCSP 217 27.1 概述 217 27.2 openssl实现 217 27.3 主要函数 217 27.4编程示例 222 ...

    uCA:uCA 是一个微型 CA,它使用 OpenSSL 允许您轻松创建具有多个 SubjectAltNames 的签名证书

    加州大学uCA 是一个微型 CA,它使用 OpenSSL 允许您轻松创建具有多个 SubjectAltNames 的签名证书tl;博士很小的 CA 可以让你做算法确定的 SubjectAltNames,它在 CoreOS 上运行得很好,以防万一,我不知道,你需要...

    OPENSSL密码计算/证书操作/SSL通信-易语言

    届,包括绝大多数需要自签名证书的,都是调用openssl的命令行,全局操作,想要调用API动态申请证书,签署证书的,源码在百度上基本找不到,要翻出去找谷歌,所以我认为至少在易语言范围内,此源码属于首发 ...

    OpenSSL-1_0_0d_Win32

    OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。 7.Engine机制 Engine机制的出现是在OpenSSL的0.9.6版的事情,开始的时候是将普通版本跟支持Engine的版本...

    OpenSSL编程(三合一版).zip

    213 26.7 证书验证 216 26.7.1证书验证项 216 26.7.2 Openssl中的证书验证 216 第二十七章 Openssl OCSP 217 27.1 概述 217 27.2 openssl实现 217 27.3 主要函数 217 27.4编程示例 222 ...

    openssl:R 的 OpenSSL 绑定

    openssl 基于 OpenSSL 的加密、签名和证书工具包 绑定到 OpenSSL libssl 和 libcrypto,以及自定义 SSH 密钥解析器。 支持 RSA、DSA 和 EC 曲线 P-256、P-384、P-521 和 curve25519。 可以手动或通过 x509 证书创建...

    ssl-proxy:简单的零配置SSL反向代理,带有真实的自动生成的证书(LetsEncrypt,自签名,提供)

    用法带有自动自签名证书ssl-proxy -from 0.0.0.0:4430 -to 127.0.0.1:8000 这将立即生成自签名证书,并开始将HTTPS流量从代理到 。 无需致电openssl。 如果愿意,它将打印用于您在浏览器中执行手动证书验证的证书的...

    openssl编程.pdf

    第二章 openssl 简介................................................................................................................15 2.1 openssl 简介.....................................................

    PKCS7签名的ASN1格式

    可使用此格式,通过ASN1C生成完整的PKCS7签名C语言代码,实现诸如SM2算法数字签名及验证。 注意,CertificateSerialNumber本来在PKCS7标准ASN1结构中定义为INTEGER类型,但由于ASN1C将INTEGER类型翻译成long,不支持...

    certificate-manager:管理网络服务器(主要是 nginx)的自签名服务器和客户端证书的脚本

    生成 nginx 配置一个单独的 bash 脚本,除了 openssl 之外没有任何依赖项,非常适合 Docker 配置默认生成 RSA 2048(但可配置为任何密钥大小) 证书管理器脚本在一个命令中创建全套自签名证书和 CA 文件;...

Global site tag (gtag.js) - Google Analytics