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
分享到:
相关推荐
https目前广泛流行,现提供openssl自签名证书的命令和基本验证命令。
用openssl命令制作生成证书和自签名
1.go生成rsa证书 自签名证书 2.go生成ecc证书 自签名证书 3.go生成公钥私钥 4.对自已生成的公钥私钥进行签名,得到签名证书crt 5.通过设置云dns账号直接生成freessl证书 6.openssl一些惯用方法介绍 7.如生成pfx格式的...
OpenSSL 1.1.1 新特性: 全面支持国密SM2/SM3/SM4加密算法,最近的项目涉及到国密,又局限于资源有限,只能只能上了。
越来越多的应用需要我们使用USB接口数字证书进行PKCS#7数字签名。本文分别介绍了使用微软CryptoAPI方式和OpenSSL Engine方式进行数字签名。特别地,提出了OpenSSL Engine简化方式,这种方式更为灵活方便易行。
实现数字签名和密钥交换,公钥加密没有实现。全部源代码,需要Openssl库支持,VC工程。 KDF使用标准HASH算法,没有使用SM3。 可参考作者的SM3算法实现KDF。 ECC曲线使用SM2算法建议曲线,内含SM2建议曲线测试。 仅...
一旦您的浏览器拥有自签名证书的合法副本,您就可以通过加密的 TLS 连接安全地访问该网站。 由于政府控制根证书颁发机构,一些人甚至认为安全分发的自签名证书。 至少,自签名证书成功地避免了以明文形式发送密码。...
OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。 7.Engine机制 Engine机制的出现是在OpenSSL的0.9.6版的事情,开始的时候是将普通版本跟支持Engine的版本...
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 ...
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 是一个微型 CA,它使用 OpenSSL 允许您轻松创建具有多个 SubjectAltNames 的签名证书tl;博士很小的 CA 可以让你做算法确定的 SubjectAltNames,它在 CoreOS 上运行得很好,以防万一,我不知道,你需要...
届,包括绝大多数需要自签名证书的,都是调用openssl的命令行,全局操作,想要调用API动态申请证书,签署证书的,源码在百度上基本找不到,要翻出去找谷歌,所以我认为至少在易语言范围内,此源码属于首发 ...
OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。 7.Engine机制 Engine机制的出现是在OpenSSL的0.9.6版的事情,开始的时候是将普通版本跟支持Engine的版本...
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 基于 OpenSSL 的加密、签名和证书工具包 绑定到 OpenSSL libssl 和 libcrypto,以及自定义 SSH 密钥解析器。 支持 RSA、DSA 和 EC 曲线 P-256、P-384、P-521 和 curve25519。 可以手动或通过 x509 证书创建...
用法带有自动自签名证书ssl-proxy -from 0.0.0.0:4430 -to 127.0.0.1:8000 这将立即生成自签名证书,并开始将HTTPS流量从代理到 。 无需致电openssl。 如果愿意,它将打印用于您在浏览器中执行手动证书验证的证书的...
第二章 openssl 简介................................................................................................................15 2.1 openssl 简介.....................................................
可使用此格式,通过ASN1C生成完整的PKCS7签名C语言代码,实现诸如SM2算法数字签名及验证。 注意,CertificateSerialNumber本来在PKCS7标准ASN1结构中定义为INTEGER类型,但由于ASN1C将INTEGER类型翻译成long,不支持...
生成 nginx 配置一个单独的 bash 脚本,除了 openssl 之外没有任何依赖项,非常适合 Docker 配置默认生成 RSA 2048(但可配置为任何密钥大小) 证书管理器脚本在一个命令中创建全套自签名证书和 CA 文件;...