HTTP和HTTPS

来源:互联网 发布:基金止盈软件 编辑:程序博客网 时间:2024/05/17 07:56

HTTP和HTTPS的区别

HTTPS(Secure Hypertext TransferProtocol)安全超文本传输协议 
它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。 
它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的安全全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。 
HTTPS和HTTP的区别: 
https协议需要到ca申请证书,一般免费证书很少,需要交费。 
http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议 
http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。 
http的连接很简单,是无状态的 
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议要比http协议安全 
HTTPS解决的问题: 
1 . 信任主机的问题. 采用https 的server 必须从CA 申请一个用于证明服务器用途类型的证书.改证书只有用于对应的server 的时候,客户度才信任次主机. 所以目前所有的银行系统网站,关键部分应用都是https 的.客户通过信任该证书,从而信任了该主机. 其实这样做效率很低,但是银行更侧重安全. 这一点对我们没有任何意义,我们的server,采用的证书不管自己issue 还是从公众的地方issue,客户端都是自己人,所以我们也就肯定信任该server. 
2 . 通讯过程中的数据的泄密和被窜改 
1. 一般意义上的https, 就是 server 有一个证书. 
a) 主要目的是保证server 就是他声称的server.这个跟第一点一样. 
b) 服务端和客户端之间的所有通讯,都是加密的. 
i. 具体讲,是客户端产生一个对称的密钥,通过server 的证书来交换密钥.一般意义上的握手过程. 
ii. 加下来所有的信息往来就都是加密的. 第三方即使截获,也没有任何意义.因为他没有密钥.当然窜改也就没有什么意义了. 
2. 少许对客户端有要求的情况下,会要求客户端也必须有一个证书. 
a) 这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码, 还有一个CA 认证过的身份.应为个人证书一般来说上别人无法模拟的,所有这样能够更深的确认自己的身份. 
b)目前少数个人银行的专业版是这种做法,具体证书可能是拿U盘作为一个备份的载体. 
HTTPS 一定是繁琐的. 
a) 本来简单的http协议,一个get一个response. 由于https 要还密钥和确认加密算法的需要.单握手就需要6/7个往返. 
i. 任何应用中,过多的round trip 肯定影响性能. 
b) 接下来才是具体的http协议,每一次响应或者请求,都要求客户端和服务端对会话的内容做加密/解密. 
i. 尽管对称加密/解密效率比较高,可是仍然要消耗过多的CPU,为此有专门的SSL 芯片. 如果CPU信能比较低的话,肯定会降低性能,从而不能serve 更多的请求. 
ii. 加密后数据量的影响. 所以,才会出现那么多的安全认证提示


个人理解:以前使用过IE7浏览器,据微软宣称,在安全性能上叫IE6上有了很大的提高,提高的原因也许就在于https协议的使用,经常会遇到浏览器提醒证书过期之类的东西,同样使用之后,也发现浏览器速度下降的现象,原来是由于握手的次数增加,看来,一般的机器还是最好不要使用IE7了



ios中http和https 协议的访问


最近做个项目,开始采用的是HTTP协议实现客户端和服务器端的交互,后来需要改成HTTPS协议。在修改的过程中发现了一些问题,解决方案如下:

 

HTTP:

    NSString *urlString=[NSStringstringWithFormat:@"https://127.0.0.1/default.aspx?USER=%@",@"111"];

    

    NSMutableURLRequest*request = [[[NSMutableURLRequest alloc] init] autorelease];

    [request setURL:[NSURLURLWithString:urlString]];

    [requestsetHTTPMethod:@"GET"];

    

    NSHTTPURLResponse*urlResponse = nil;

    NSError *error = [[NSErroralloc] init];

    NSData *responseData =[NSURLConnection sendSynchronousRequest:requestreturningResponse:&urlResponse error:&error];

    NSMutableString *result =[[NSMutableString alloc] initWithData:responseDataencoding:NSUTF8StringEncoding];

    

    NSLog(@"The result stringis :%@",result);   

 

 HTTPS

事件触发 

    NSString *urlString=[NSStringstringWithFormat:@"https://127.0.0.1/default.aspx?USER=%@",@"111"];

   NSMutableURLRequest *request =[[NSMutableURLRequest alloc] initWithURL:[NSURLURLWithString:urlString]      cachePolicy:NSURLRequestReloadIgnoringLocalCacheDatatimeoutInterval:5];

    //设置请求方式为get

    [requestsetHTTPMethod:@"GET"];

    //添加用户会话id

    [requestaddValue:@"text/html" forHTTPHeaderField:@"Content-Type"];

    //连接发送请求

    finished = false;

    NSURLConnection *conn =[[NSURLConnection alloc] initWithRequest:requestdelegate:self];

//堵塞线程,等待结束

while(!finished) {

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopModebeforeDate:[NSDate distantFuture]];

}

 

- (void)connection:(NSURLConnection *)connectiondidReceiveResponse:(NSURLResponse*)response 

{}

 

- (void)connectionDidFinishLoading:(NSURLConnection*)connection 

{

    //[_waitingDialogdismissWithClickeonIndex:0 animated:NO];

    [connection release];

}

-(void)connection:(NSURLConnection *)connectiondidFailWithError:(NSError *)error

}

- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection*)connection{

    return NO;

}

//下面两段是重点,要服务器端单项HTTPS 验证,iOS 客户端忽略证书验证。

- (BOOL)connection:(NSURLConnection *)connectioncanAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace*)protectionSpace {

    return[protectionSpace.authenticationMethodisEqualToString:NSURLAuthenticationMethodServerTrust];

- (void)connection:(NSURLConnection *)connectiondidReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge*)challenge {    

   NSLog(@"didReceiveAuthenticationChallenge %@ %zd", [[challengeprotectionSpace] authenticationMethod], (ssize_t) [challengepreviousFailureCount]);

    

    if([challenge.protectionSpace.authenticationMethodisEqualToString:NSURLAuthenticationMethodServerTrust]){

       [[challenge sender] useCredential:[NSURLCredentialcredentialForTrust:challenge.protectionSpace.serverTrust]forAuthenticationChallenge:challenge];

       [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge];

    }

    NSLog(@"get the wholeresponse");

    //[receivedDatasetLength:0];

}

//处理数据 

- (void)connection:(NSURLConnection *)connectiondidReceiveData:(NSData *)data

 

大家也可以参考下面一篇文章

关于在UIwebView中访问HTTPS站点的几种方法



四谈iOS抓包:Mac下好用的HTTP/HTTPS抓包工具Charles


在Mac下做开发,用Fiddler抓包由于离不开Windows比较痛苦,还好有Charles,到官网http://www.charlesproxy.com/可下载到最新版本(若不支持rMBP可拖到Retinizer中把文字变清晰)

HTTP抓包

  1. 打开Charles程序
  2. 查看Mac电脑的IP地址,如192.168.1.7
  3. 打开iOS设置,进入当前wifi连接,设置HTTP代理Group,将服务器填为上一步中获得的IP,即192.168.1.7,端口填8888
  4. iOS设备打开你要抓包的app进行网络操作
  5. Charles弹出确认框,点击Allow按钮即可

HTTPS抓包

  1. 下载Charles证书http://www.charlesproxy.com/ssl.zip,解压后导入到iOS设备中(将crt文件作为邮件附件发给自己,再在iOS设备中点击附件即可安装;也可上传至dropbox之类的网盘,通过safari下载安装)
  2. 在Charles的工具栏上点击设置按钮,选择Proxy Settings…
  3. 切换到SSL选项卡,选中Enable SSL Proxying,别急,选完先别关掉,还有下一步
  4. 这一步跟Fiddler不同,Fiddler安装证书后就可以抓HTTPS网址的包了,Charles则麻烦一些,需要在上一步的SSL选项卡的Locations表单填写要抓包的域名和端口,点击Add按钮,在弹出的表单中Host填写域名,比如填api.instagram.com,Port填443

接下来就跟HTTP抓包一样了

0 0