一、HTTPS通信原理
Https是基于安全目的的Http信道,其安全基础由SSL层保证。
最初由Netscape公司开发,主要提供了通信双方的认证和加密通信方法。
二. SSL协议通信流程
1 .客户端浏览器向服务器发送连接请求,服务器向客户端返回其证书(包括服务器公钥S_PuKey )、对称加密算法的类型和其它相关信息
2 .客户端浏览器检查服务器发送的CA证书是否由受信任的CA中心发布,如果发布,请执行步骤4。 否则,警告客户是否继续访问
3 .客户端浏览器将证书信息(如证书有效期、服务器域名和公钥S_PuKey )与服务器返回的信息是否匹配,如果匹配,浏览器将完成服务器认证。
4 .服务器必须向客户端发送包含客户端公钥C_PuKey的客户端证书、支持的对称加密方案和其他相关信息。 收到后,服务器进行相同的认证,如果认证失败,则拒绝连接
5 .服务器根据客户端浏览器要发送的密码的类型来选择加密程度最高的方案,用客户端公钥C_PuKey进行加密,然后通知客户端浏览器
6 .客户端浏览器用私钥C_PrKey解密后,知道服务器选择的加密方式,选择通话密钥Key,用服务器公钥S_PuKey加密后发送到服务器
7 .从服务器接收到的浏览器发送的消息用秘密密钥S_PrKey进行解密,获取通话密钥key
8 .以下数据传输使用此对称密钥key进行加密:
以上是双向认证SSL协议的具体通信过程,服务器和用户都必须有证书。 因此,SSL协议通过非对称密钥机制保证双方的认证,建立连接,在实际数据通信时通过对称密钥机制保证数据的安全性
三、SSL协议基础
SSL协议位于TCP/IP协议和各种APP应用层之间,其本身分为两层:
SSL日志记录协议: (SSL记录协议)构建在TCP )上,为上层协议提供数据、封装、压缩、加密等基本功能。
SSL握手协议(SSL Handshake Protocol,SSL握手协议)是基于SSL日志记录协议,在用于实际数据传输之前,通信双方进行认证、协商加密算法、交换加密密钥等
四. HTTPS和HTTP有什么区别?
协议基础差异: HTTPS在HTTP中添加了SSL层
通信方式不同。 HTTPS必须在数据通信之前由客户端、服务器进行握手(认证),建立连接后传输数据必须加密,通信端口必须为443
五.安卓配置
1 .证书需要验证
a .导出公钥。 在浏览器中通过https访问tomcat,检查证书,然后将其保存为X.509格式。 xxxx.cer
b .引入公钥。 将xxxx.cer放在Android的assets文件夹中,以便在运行时从代码中读取此证书
以下是为了方便大家的复印。
assetmanageram=context.get assets (;
inputstream ins=am.open (' robu soft.cer ' );
try{
//读取证书
certificatefactorycerfactory=certificate factory.getinstance (x.509 ); 听//1
certificate cer=cer factory.generate certificate (ins;
//创建证书存储区并将证书导入证书存储区
keystore keystore=keystore.getinstance (' pkcs12 ',' BC ' ); //问题2
kystore.load(null,null );
ey store.setcertificateentry (' trust ',cer );
返回密钥;
}finally{
ins.close (;
}
//将我们的证书库作为受信任的证书库
slsocketfactorysocketfactory=newsslsocketfactory (keystore );
方案sch=new方案(' https ',socketFactory,443 );
//完成
httpclientmhttpclient=newdefaulthttpclient (;
mttpclient.getconnection manager (.getschemeregistry ) (.register ) ) sch;
2 .无需验证证书
容易复制:
公共类演示扩展a
ctivity {/** Called when the activity is first created. */
private TextView text;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (TextView)findViewById(R.id.text);
GetHttps();
}
private void GetHttps(){
String https = " https://800wen.com/";
try{
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{new MyTrustManager()}, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new MyHostnameVerifier());
HttpsURLConnection conn = (HttpsURLConnection)new URL(https).openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null)
sb.append(line);
text.setText(sb.toString());
}catch(Exception e){
Log.e(this.getClass().getName(), e.getMessage());
}
}
private class MyHostnameVerifier implements HostnameVerifier{
@Override
public boolean verify(String hostname, SSLSession session) {
// TODO Auto-generated method stub
return true;
}
}
private class MyTrustManager implements X509TrustManager{
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
}
}
HTTP与HTTPS区别及Android证书配置区别
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
HTTPS 工作原理、工作流程
1. 客户端发起请求
2. 服务端配置公钥私钥。如果是使用购买的证书,把公钥告诉客户端。
3. 服务端把当前此次请求的证书(公钥)传送过来
image.png
4. 客户端进行证书解析
客户端会验证公钥是否有效。如果没有问题,就回生成一个随机值,并对其进行加密,(这个随机值其实就是对称加密的私钥)
5. 将加密后的随机值等加密信息传给服务端
6.服务端解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容进行对称加密。
7. 通信。因为客户端跟服务端都有对称加密的秘钥。所以ok了。
加密过程中的对称加密非对称加密
首先用的是非对称加密。把公钥给客户端,私钥在服务端。客户端用公钥验证通过后,会生成私钥进行对称加密。然后传给后台。
为什么这么做呢。
Android证书配置。结合流程看一下
/** * 使用购买的证书 */ public static SSLSocketFactory getDefSSLSocketFactory() { try { //初始化SSLContext SSLContext sslContext = SSLContext.getInstance(PROTOCOL_TYPE); final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } //验证服务端证书的公钥 @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { if (chain == null) { throw new IllegalArgumentException("checkServerTrusted:x509Certificate array isnull"); } if (!(chain.length > 0)) { throw new IllegalArgumentException("checkServerTrusted: X509Certificate is empty"); } if (!(!TextUtils.isEmpty(authType) && authType.toUpperCase().contains("RSA"))) { throw new CertificateException("checkServerTrusted: AuthType is not RSA"); } // Hack ahead: BigInteger and toString(). We know a DER encoded Public Key begins // with 0×30 (ASN.1 SEQUENCE and CONSTRUCTED), so there is no leading 0×00 to drop. RSAPublicKey pubkey = (RSAPublicKey) chain[0].getPublicKey(); /* signum:1表示是正数;radix:16表示字节数组转16进制 */ String encoded = new BigInteger(1 /* positive */, pubkey.getEncoded()).toString(16); final boolean expected = PUB_KEY.equalsIgnoreCase(encoded); //验证服务端证书的公钥 if (!expected) { throw new CertificateException("checkServerTrusted: got error public key:" + encoded); } } @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[0]; } }}; //将随机数等加密之后传给服务端。 sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); return sslContext.getSocketFactory(); } //省略各种异常处理,请自行添加 catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } return null; }图中的方法是验证服务端购买的证书。如果是信任所有证书的。这三个重写的方法不需要做操作。直接用默认即可。