NSURL *url = [NSURL URLWithString:@"https://localhost:8443/deploy/index.html"]; ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; [request setValidatesSecureCertificate:YES];//set to NO if you use the self-signed certificate如果这个时候你开启验证,则会返回如下错误
A connection failure occurred: SSL problem (Possible causes may include a bad/expired/self-signed certificate, clock set to wrong date)
因为我们的证书是自签名,而苹果已经明确提示,你的证书可能是自签名,所以导致失败。
SecIdentityRef identity = NULL; SecTrustRef trust = NULL; // SecCertificateRef myReturnedCertificate = NULL; NSData *PKCS12Data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"client" ofType:@"p12"]]; // NSLog(@"%@",[[NSBundle mainBundle] pathForResource:@"client" ofType:@"p12"]); [ASIHTTPRequestDemo extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data]; [request setClientCertificateIdentity:identity]; // status = SecIdentityCopyCertificate (identity,&myReturnedCertificate); // [request setClientCertificates:[NSArray arrayWithObject:(id)PKCS12Data]]; [request startSynchronous]; NSError *error = [request error]; if (!error) { //do something } ...... }
思路就是读取p12文件,然后将证书内容和证书密钥导出,然后将证书塞入request,随后startSynchronous
+ (BOOL)extractIdentity:(SecIdentityRef *)outIdentity andTrust:(SecTrustRef*)outTrust fromPKCS12Data:(NSData *)inPKCS12Data { OSStatus securityError = errSecSuccess; // NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObject:@"" forKey:(id)kSecImportExportPassphrase]; CFStringRef password = CFSTR("1234"); //证书密码 const void *keys[] = { kSecImportExportPassphrase }; const void *values[] = { password }; CFDictionaryRef optionsDictionary = CFDictionaryCreate(NULL, keys,values, 1,NULL, NULL); CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); securityError = SecPKCS12Import((CFDataRef)inPKCS12Data,(CFDictionaryRef)optionsDictionary,&items); if (securityError == 0) { CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex (items, 0); const void *tempIdentity = NULL; tempIdentity = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemIdentity); *outIdentity = (SecIdentityRef)tempIdentity; const void *tempTrust = NULL; tempTrust = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemTrust); *outTrust = (SecTrustRef)tempTrust; } else { NSLog(@"Failed with error code %d",(int)securityError); return NO; } return YES; }
四.RSA服务端加密,客户端解密
根据私钥和csr导出公钥
NSString *pkcsPath = [[NSBundle mainBundle] pathForResource:@"root" ofType:@"p12"]; // 下面的与上面的一样 // NSString *pkcsPath = [[NSBundle mainBundle] pathForResource:@"pkcs-daniate" ofType:@"pfx"]; NSString *certPath = [[NSBundle mainBundle] pathForResource:@"server_public_key" ofType:@"der"]; Security *security = [Security sharedSecurity]; OSStatus status = -1; status = [security extractEveryThingFromPKCS12File:pkcsPath passphrase:@"1234"]; NSLog(@"status = %ld", status); // 取得公钥 status = [security extractPublicKeyFromCertificateFile:certPath]; NSLog(@"status = %ld", status); // 苹果官方文档中只说了短数据加密,但也提到了长数据的分段加密 // 短数据 NSString *plainText = @"This is plain text~中华人民共和国~"; NSData *plainData = [plainText dataUsingEncoding:NSUTF8StringEncoding]; NSData *encrypted = [security encryptWithPublicKey:plainData]; NSData *decrypted = [security decryptWithPrivateKey:encrypted]; // NSString *encryptedText = [[NSString alloc] initWithData:encrypted encoding:NSUTF8StringEncoding]; NSString *decryptedText = [[NSString alloc] initWithData:decrypted encoding:NSUTF8StringEncoding]; // NSLog(@"plainData: %p", plainData); // NSLog(@"encrypted: %p", encrypted); // NSLog(@"decrypted: %p", decrypted); NSLog(@"encrypted: %@",encrypted); NSLog(@"decrypted text: %@", decryptedText);p12文件包含私密,der则是包含公钥,分别提取并且利用其加密解密,从而达到验证的目的。
相关推荐
说明tomcat如何配置https单向加密,如何使用jdk提供的keytool建立服务器证书
利用tomcat服务器配置https双向认证
Tomcat服务器配置https双向认证
tomcat配置https双向认证文档
这是我实战的笔记,全程直播。 #### Tomcat和Openssl构建HTTPS双向认证 ###### 选择HTTPS WEB服务器 Linux下安装OpenSSL 一、创建服务器证书、客户端...2、配置Tomcat支持HTTPS双向认证(服务器将认证客户端证书)
springboot内置tomcat与外部tomcat配置https访问及http自动转向https
NULL 博文链接:https://zhaoshijie.iteye.com/blog/2215393
Tocmat下的HTTPS认证,折腾了一天了,终于弄成了,记录下!
文中所有内容通过本机运行,没有详细的原理介绍,原理介绍网上很多。
Tomcat配置SSL双向认证简单实例
资源中包含了关于如何使用keytool生成证书,如何在tomcat中配置,并且在java web中如何配置
Tomcat6配置使用SSL双向认证
Tomcat配置数据库连接加密访问
tomcat 配置https 详情, tomcat 配置http 强制跳转到https
快速掌握https工作原理,掌握证书的生成及tomcat服务器详细配置。
详细讲解tomcat 连接池数据库解密加密方法以及过程。
调用一个需要双向认证接口碰到的问题,现分享给大家 文章主要描述怎么样生成机构颁发的证书根据证书生成jks文件 另外有意义的参考文章如下,主要为java程序带证书调用接口 ...
tomcat下配置ssl双向认证介绍,有具体的步骤截图。
本资源是一个 CentOS 下对 Nginx + Tomcat 配置 SSL 实现服务器 / 客户端双向认证配置示例。详细如何配置请参考博客《图文:CentOS 下对 Nginx + Tomcat 配置 SSL 实现服务器 / 客户端双向认证》,地址是:...
一个项目中 客户需求是这样的:指定的电脑可以打开。 在浏览器没安装证书的情况下 客户是无法打开我们的bs系统的。安装证书后可以打开。