Https 公钥、私钥、证书

1、https的握手协议: http://blog.csdn.net/clh604/article/details/22179907
二、证书的概念:http://blog.csdn.net/sealyao/article/details/5761747
三、详细解释证书:http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html#!comments
数字证书则是由证书认证机构(CA)对证书申请者真实身份验证以后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(至关于加盖发证书机 构的公章)后造成的一个数字文件。CA完成签发证书后,会将证书发布在CA的证书库(目录服务器)中,任何人均可以查询和下载,所以数字证书和公钥同样是公开的。实际上,数字证书就是通过CA认证过的公钥。

 

通常的数字证书产品的主题一般含有以下字段:
公用名称 (Common Name) 简称:CN 字段,对于 SSL 证书,通常为网站域名;而对于代码签名证书则为申请单位名称;而对于客户端证书则为证书申请者的姓名; 
单位名称 (Organization Name) :简称:O 字段,对于 SSL 证书,通常为网站域名;而对于代码签名证书则为申请单位名称;而对于客户端单位证书则为证书申请者所在单位名称; 
证书申请单位所在地: 
所在城市 (Locality) 简称:L 字段 
所在省份 (State/Provice) 简称:S 字段 
所在国家 (Country) 简称:C 字段,只能是国家字母缩写,如中国:CN 
其余一些字段:
电子邮件 (Email) 简称:E 字段 
多个姓名字段 简称:G 字段 
介绍:Description 字段 
电话号码:Phone 字段,格式要求 + 国家区号 城市区号 电话号码,如: +86 732 88888888 
地址:STREET  字段 
邮政编码:PostalCode 字段 
显示其余内容 简称:OU 字段

 

android 上进行 https开发:
一、首先须要服务器提供x509格式的server.crt证书文件。
二、下载一个bcprov-ext-jdk15on-152.jar 下载地址http://www.bouncycastle.org/latest_releases.html
三、将该jar放置到C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext地址
四、keytool -import -alias serverkey -file server.crt -keystore tclient.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
将crt 转换为 bks文件(android环境必须的)
参考连接:http://frank-zhu.github.io/android/2014/12/26/android-https-ssl/



 

 
 
private static final String KEY_STORE_TYPE_BKS = "bks";//证书类型 固定值
private static final String KEY_STORE_TRUST_PASSWORD = "123456";//客户端证书库密码

private
static SSLContext getSSLContext(Context context) { try { // 客户端信任的服务器端证书 KeyStore trustStore = KeyStore.getInstance(KEY_STORE_TYPE_BKS); InputStream tsIn = context.getResources().openRawResource(R.raw.tclient); try { trustStore.load(tsIn, KEY_STORE_TRUST_PASSWORD.toCharArray()); } catch (Exception e) { e.printStackTrace(); } finally { try { tsIn.close(); } catch (Exception ignore) { } } SSLContext sslContext = SSLContext.getInstance("TLS"); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trustStore); sslContext.init(null, trustManagerFactory.getTrustManagers(), null); return sslContext; } catch (Exception e) { Log.e("tag", e.getMessage(), e); } return null; }

SSLContext sslContext = getSSLContext(Env.getContext());
conn = (HttpsURLConnection) url.openConnection();
((HttpsURLConnection)conn).setSSLSocketFactory(sslContext.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new TrustAllHostnameVerifier());
 

 

数字证书包含的内容:一、证书颁发机构;二、使用机构;三、公钥;四、有效期;五、签名算法;六、签名hash算法;七、指纹算法;八、指纹A、证书生成过程:  证书的生成原理:公司ABC 本身生成一对公钥、私钥以及对应的加密算法,还有公司相关信息,提供给证书颁发机构CA。CA根据提供的信息生成证书(或者本身生成,这里不是重点)  指纹算法:  使用指纹算法(sha1或者是md5)对证书全文提取指纹(简单点就是计算对应的hash值)。PS:指纹的目的是校验证书是否被修改,但指纹自己也能够被修改;例如,修改证书以后,用对应的指纹算法从新提取指纹。签名Hash算法:  为了解决上述问题,CA机构用本身的私钥,使用证书中指定的签名Hash算法,对指纹进行加密。PS:这样其余人由于不知道,CA机构的私钥,就没法对修改后证书的指纹进行再次签名B、证书的验证过程一、提取证书发布机构;PS:这个是微软、gongle集成在系统中的,他们选择的一些公信力高的机构的证书集成到系统中。二、从系统中查找该CA机构的证书,而且提取公钥,使用公钥对指纹进行解密,对应的签名算法从ABC公司的证书中提取;三、从ABC公司的证书中提取指纹算法,重新对证书进行指纹提取,而后和上一步提取的指纹进行对比,若是相同表示没有被修改。客户端拿到证书以后,签名算法:  客户端从服务器获取公司ABC的签名证书以后,从中提取公钥和签名算法,对须要发送的明文,使用公钥和签名算法进行加密;  服务器端接收到密文后,使用私钥对密文解密;  服务器发送的消息,使用私钥加密,不能保证不可见性,因此后续会和客户端协商选择一个对称加密算法来加密数据传输。证书链:  公司ABC的证书须要CA机构的证书进行验证,CA机构的证书是收到微软信任的,能够不用验证。可是其中可能存在多级验证好比,ABC的证书须要CA验证,CA须要BA验证,AA才是微软信任的,无需验证的证书。这样就造成了一个信任链条  另外经常使用的RSA为非对称加密算法,而且公钥、私钥均可以用来加密、解密