https的使用注意事项


编	写:袁	亮
时	间:2015-11-20
说	明:https的使用注意事项

一、全部https的优缺点以及选择
	1、优点
		1.1 安全性高
	2、缺点
		2.2 用户访问会变慢,特别是第一次访问(需要下载证书)
		2.2 开发成本较高,https页面的所有资源都必须是https资源
		2.3 统计代码不能使用,大部分统计代码都不提供https版本
		2.4 服务器端的负载也会变高
	3、其他网站参考
		3.1 百度、淘宝等很多二级域名也不是https
		3.2 京东大部分都不是https
	4、结论
		只针对安全级别高的几个页面采用https即可,不需要整个域名都使用https
		
二、开发过程注意事项
	1、静态资源都必须是https
		1.1 js等请求,浏览器直接会阻止http的请求
		1.2 图片请求,http的不阻止,但是会报warning错误
		1.3 为兼容http和https同时访问,可以写//***.ci123.com/****,会自动根据当前的访问协议加上http或者https
	2、ajax请求
		2.1 ajax请求也必须是同协议的,否则将跨域,不能访问
		2.2 jsonp可以解决这个问题,但最好不要这么做
	3、核心cookie可以设置为仅https访问
		3.1 淘宝中的skt,对应的应该是一个sessionId,就是仅https的
		3.2 这个设置要小心,因为该cookie在http中是访问不到的
		3.3 可以防止cookie被劫持,一般用与session
		3.4 用的不多
	4、关键地方,只配置https,不允许http访问
		4.1 防止用户被引导到http请求中,然后输入了敏感信息
		
三、安全问题
	1、证书伪造:浏览器有提示
	2、引导到http请求,然后盗取

四、其他
	1、https请求可以被缓存
	
附录:
1、HTTPS连接的前几毫秒发生了什么
	http://blog.jobbole.com/48369/ 
2、与HTTP有什么区别?HTTPS的七个误解
	http://www.chinaz.com/web/2015/0320/391752.shtml
3、HTTPS那些事(一)HTTPS原理
	http://www.guokr.com/post/114121/
	日志转载:HTTPS那些事(二)SSL证书
	http://www.guokr.com/post/116169/
	HTTPS那些事(三)攻击实例与防御
	http://www.guokr.com/blog/148613/
		


openssl第一篇:简单了解


编	写:袁	亮
时	间:2015-07-20 
说	明:openssl第一篇:简单了解

一、什么是openssl
	1、一个强大的安全套接字层密码库
	2、套接字:源ip,目的ip,协议,源端口,目的端口组成,通信的一种约定,想了解更多,请自行google
	3、建立在可靠的传输层协议TCP上
	4、主要功能:
		4.1 加密、解密在网络传输中的数据包,包含这些数据不被篡改和伪造(在网络传输数据前加密,收到数据,先解密再往上传)
		4.2 验证客户端和服务端的身份,只跟符合要求的另一方进行通信(正常的网络请求是没有验证的)
	
二、哪些地方使用到了
	1、绝大部分的https服务器
	2、支持https的浏览器(客户端)
	3、各种支付功能:比如支付宝、银联支付、微信支付等,都需要openssl支持
	4、对安全要求比较高的话,比如防止数据被伪造获取,传输内容被看到,都可以考虑使用
	
三、工作原理(摘自参考文章,大概了解即可)
	1、client送给server它自己本身使用的ssl的version(ssl一共有三个version),加密算法的一些配置
		和一些随机产生的数据,以及其他在SSL协议中需要用到的信息
	2、server送给client它自己的SSL的version,加密算法的配置,随机产生的数据,还会用自己的私有密钥加密SERVER-HELLO信息
		Server还同时把自己的证书文件给送过去。同时有个可选的项目,就是server可以要求需要客户的certificate
	3、client就用server送过来的certificate来验证server的身份。如果server身份验证没通过,本次通信结束。
		通过证书验证之后,得到server的公共密钥,解开server送来的被其用私有密钥加密过的SERVER-HELLO信息,看看对头与否
		(可理解为签名的过程,用来验证服务器身份)。
		如果不对,说明对方只有该server的公共密钥而没有私有密钥,必是假的。通信告吹。 
	4、client使用产生了的随机数据(sharedsecret),并且把这个随机数据用server发送过来的的公共密钥加密,
		此次加密过程产生本次握手中的premastersecret(这个步骤是有可能有server的参与的,由他们使用的加密算法决定)
		然后将它(premastersecret)送回给server,如果server要求需要验证client,那么client也需要自己把自己的证书送过去
		同时送一些自己签过名的数据过去。
	5、Server验证完client的身份之后,然后用自己的私有密钥解密得到premastersecret然后双方利用这个premastersecret来共同协商
		得到mastersecret(可理解为premastersecret为双方协商的暗号,然后使用这个暗号再协商一个mastersecret用来
		产生真正的会话密钥用来传输数据)以此来保证数据的决对安全。
    6、双方用mastersecret一起产生真正的sessionkey,然后就是他们在剩下的过程中的对称加密的key了。
		这个key还可以用来验证数据完整性。双方再交换结束信息。握手结束。
	
四、关键名称
	1、加密算法
		1.1 对称加密算法(加密和解密用的秘钥一致)
			一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4
			7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5
			des比较常用
		1.2 非对称加密算法(加密和解密用的秘钥不一致)
			包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)
			rsa和dsa是最流行的数字签名技术
	2、公钥、密钥
		2.1 公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥)
		2.2 公钥是密钥对中公开的部分,私钥则是非公开的部分
		2.3 使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密
			比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功
	3、数字证书
		3.1 由权威机构(CA)颁发
		3.2 包含公钥所有者信息、公钥内容以及证书授权中心的数字签名所组成的文件
		3.3 有效期内才有用
		3.4 证书格式
			cer:公钥证书格式
			pfx:私钥证书格式
	4、证书授权中心 CA (Certificate Authority)
		4.1 各家浏览器支持的ca机构也不尽相当,特别是对一些小的ca机构
		4.2 比较著名的ca机构:
			VeriSign:最大的认证机构,赛门铁克的子公司,管理世界13台根服务器中的2台,顶级域名中的.com和.net等,百度在用
			中国金融认证中心:http://cs.cfca.com.cn 银联证书就是使用的这个
			google internet authority g2:谷歌家的
			geotrust ssl ca g2:微信在使用
			StartCom 使用的也比较多
		4.3 出名的ca机构,证书比较贵,还有一些小的ca机构,虽然便宜,但是有些浏览器不认可,会提示不受信任,体验较差	
		4.4 火狐支持的ca机构:
			http://curl.haxx.se/ca/cacert.pem
附录:
	http://blog.itechol.com/space-33-do-blog-id-5158.html
	http://baike.baidu.com/link?url=q3wLEKuHy59qDRfIUMYnG0SnofPY0sI32c6N2-3u-zcf7qKB3vRu3v9Jlke0BkiwzcO9sEXDVln-ImZWhauVna
	http://my.oschina.net/0757/blog/207487

curl:抓取https数据


编	写:袁	亮
时	间:2015-07-15
说	明:使用curl抓取https数据

一、为什么需要?
	未了安全考虑,很多网站使用了https域名
	https需要客户端和服务端都做openssl的验证
	
二、抓取设置
	1、方法一,设置为不验证证书【直接用这个,除非安全性要求特别高】
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
		ps:抓百度的时候需要注意,referer设置为百度本身的返回会又问题,可以自己尝试看看
	
	2、设置一个正确的证书验证
		2.1 下载最新的证书到本地
			wget http://curl.haxx.se/ca/cacert.pem
		2.2 设置使用证书
			curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true); ;
			curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem');
			
三、一些错误情况(出错的情况下,开启curl_error($ch)查看)
	1、centos系统,如果不知道证书地址,则使用系统证书
		/etc/pki/tls/certs/ca-bundle.crt
	2、如果系统证书过期,或者错误,则会显示签名出错
		通过wget http://curl.haxx.se/ca/cacert.pem 来更新最新的证书
	3、显示“段错误”,有可能是libcurl和php版本不一致导致
		线上centos 6.2和php 5.2.17,出现过该问题
	4、当不能确定是否是某台服务器出问题的时候,写个简单的demo,分别在几台服务器运行看下是否有问题
	
四、尚未解决
	1、采用浏览器下载或者导出的证书,在程序中一直未能使用成功