首页 > 系统 > iOS > 正文

HTTPS在SSL/TLS上的使用和配置(IIS8和iOS客户端)

2019-11-09 15:43:39
字体:
来源:转载
供稿:网友

HTTPS在SSL/TLS上的使用和配置(IIS8和iOS客户端)

CA证书

1.域名型SSL证书(DV SSL):信任等级普通,只需验证网站的真实性便可颁发证书保护网站;一般是免费的

2.企业型SSL证书(OV SSL):信任等级强,须要验证企业的身份,审核严格,安全性更高;收费的

3.增强型SSL证书(EV SSL):信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高,同时可以激活绿色网址栏。收费的,比OV证书贵一些

4.自签名证书(SelfSigned Cert) :创建的工具有很多。如Mac中的钥匙串可以创建,IIS的服务器证书可以创建

https://help.aliyun.com/knowledge_detail/42216.html

公钥(Public Key)与私钥(PRivate Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分,私钥则是非公开的部分。公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。通过这种算法得到的密钥对能保证在世界范围内是唯一的。使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。

x509是数字证书的规范,P7和P12是两种封装形式。比如说同样的电影,有的是avi格式,有的是mpg。

SSL/TLS/HTTPS的区别

SSL (Secure Socket Layer) 安全套接层  目前有三个版本1.0, 2.0, 3.0

TLS (Transport Layer Security) 传输层安全协议   是SSL的标准化后的产物,目前有1.0, 1.1, 1.2三个版本

HTTPS (Hyper Text Transfer Protocol over Secure Socket Layer) 也就是HTTP 加上 SSL/TLS

用于网站HTTPS化的SSL数字证书,当前主要分为DV SSL、OV SSL、EV SSL三种类型的证书。

symantec证书检测

https://cryptoreport.websecurity.symantec.com/checker/views/certCheck.jsp

当你的网站配置了https后,如果在IE浏览器提示证书配置错误,Chrome浏览器提示不安全的连接,那就是因为IIS默认没有开启TLS,所以我们需要手动开启SSL/TLS,具体步骤如下链接

https://social.technet.microsoft.com/Forums/forefront/en-US/ec033ff6-091d-441d-8ad3-7ea411100009/ssl-with-256bit-strength

这篇链接中最重要的步骤就是

In order to get IIS7 to do 256 bit encryption, we have to ensure the cipher suit that is listed first is the following: TLS_RSA_WITH_AES_256_CBC_SHA

 

In order to change the Cipher Suite order we can do the following:

- Run gpedit.msc from the command line

- within the Group Policy Object Editor, expand Computer Configuration, Administrative Templates, Network.

- Under Network, select SSL Configuration and then double click on SSL Cipher Suite Order

- By Default the SSL Cipher Suite Order is set to "Not Configured"

- To enable 256-bit encryption, select the "enabled" radio button

- Within the SSL Cipher Suites text box, remove TLS_RSA_WITH_AES_128_CBC_SHA or at least place it behind TLS_RSA_WITH_AES_256_CBC_SHA.

 

TLS_RSA_WITH_AES_256_CBC_SHA has to be the first cpiher suite listed in order for us to connect with 256-bith encryption.

 

Once the steps above have been completed, restart the server for the changes to take effect. Now we can browse a page served on the IIS7 server and confirm it is using 256 bit encryption. To do this, right click on the page, select properties and you should see the following:

TLS 1.0, AES with 256 bit encryption (High); RSA with 1024 bit exchange

自签名证书的创建流程

1. KeyChain:KeyChain access --> Certificate Assistant --> Create a Certificate --> 输入一个名字和选择证书类型 --> Create  --> 会生成一个自签名证书,并且自动加入到了KeyChain

IIS创建自签名证书,看这里http://jingyan.baidu.com/article/48206aeaa60a65216bd6b353.html

其他的创建方式

1.Free https://letsencrypt.org

2.XCA介绍  http://xca.hohnstaedt.de/    

   下载地址  https://sourceforge.net/projects/xca/files/?source=navbar

3.在www.net.cn申请DV(domain verified)证书

好了,上面的证书搞完了,下面接着iOS客户端的使用和配置

1.Info.plist的配置如下,此步骤根据情况来定,如果你的项目所有的请求都是HTTPS, 则这个配置不需要,如果你的项目有一些请求是HTTP,则把HTTP请求的域名配置在这里,可以有很多个域名

2.重点看下面,Objective-C代码

  方法- (void)URLsession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler

   当服务器端配置的是单项认证,则客户端不需要实现此方法,仅当服务器使用双向认证时,才需要

#import "ViewController.h"@interface ViewController ()<NSURLSessionDelegate>@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];        NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]];        NSURL *url = [NSURL URLWithString:@"https://www.domain.com/Home/LoginWithPass"];    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];    [request setHTTPMethod:@"POST"];        NSURLSessionDataTask *data = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {                NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;        NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];        NSLog(@"%@ %ld",  str, (long)httpResponse.statusCode);            }];        [data resume];}/*  摘要:适用于自签名证书,DV,OV,EV类型的证书   作用:1.单向认证(One-way Authentication)        此delegate方法会有一次调用,是NSURLAuthenticationMethodServerTrust      2.双向认证(Bidirectional Authentication,或者Mutual Authentication,也有Two-way Authentication)        此delegate方法会有两次调用,分别是NSURLAuthenticationMethodServerTrust和NSURLAuthenticationMethodClientCertificate */- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{    //证书的处理方式    NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;        NSURLCredential *credential = nil;        //判断服务器返回的证书是否是服务器信任的    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { //受信任的                //获取服务器返回的证书        credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];                if (credential) {            disposition = NSURLSessionAuthChallengeUseCredential;        } else {            disposition = NSURLSessionAuthChallengePerformDefaultHandling;        }            } else {            //读取证书的私钥        NSString *thePath = [[NSBundle mainBundle] pathForResource:@"webtest_ssl_Certificates" ofType:@"p12"];        NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath];        CFDataRef inPKCS12Data = (CFDataRef)CFBridgingRetain(PKCS12Data);        SecIdentityRef identity = nil;                //读取p12证书的私钥内容        OSStatus result = [self extractP12Data:inPKCS12Data toIdentity:&identity];        if(result != errSecSuccess){            completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);            return;        }                SecCertificateRef certificate = NULL;        SecIdentityCopyCertificate(identity, &certificate);                const void *certs[] = {certificate};        CFArrayRef certArray = CFArrayCreate(kCFAllocatorDefault, certs, 1, NULL);                credential = [NSURLCredential credentialWithIdentity:identity certificates:(NSArray*)CFBridgingRelease(certArray) persistence:NSURLCredentialPersistencePermanent];                disposition = NSURLSessionAuthChallengeUseCredential;    }        //安装证书(即导入到iPhone的KeyChain)    if (completionHandler) {        completionHandler(disposition, credential);    }}- (OSStatus)extractP12Data:(CFDataRef)inP12Data toIdentity:(SecIdentityRef *)identity {        OSStatus securityError = errSecSuccess;        CFStringRef passWord = CFSTR("Your cert password");    const void *keys[] = { kSecImportExportPassphrase };    const void *values[] = { password };        CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);        CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);    securityError = SecPKCS12Import(inP12Data, options, &items);        if (securityError == errSecSuccess) {        CFDictionaryRef ident = CFArrayGetValueAtIndex(items, 0);        const void *tempIdentity = NULL;        tempIdentity = CFDictionaryGetValue(ident, kSecImportItemIdentity);        *identity = (SecIdentityRef)tempIdentity;    }        if (options) CFRelease(options);    if (password) CFRelease(password);        return securityError;}@end
<script src="https://gist.github.com/VictorZhang2014/1d4903b1c5f260d9cae6a007fb53bebe.js"></script>

好了,就是这么简单,如果读者有什么疑问,欢迎评论里回复。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表