一、http与https的区别
安全性:https是安全的超文本传输协议,使用了TLS/SSL加密(SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密)。
SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。
是否需要申请证书:https需要使用ca申请证书。
传输协议:https具有安全性的SSL加密传输协议;http超文本传输协议,明文传输。
连接方式与端口:http的连接简单,是无状态的,端口是 80; https 在http的基础上使用了ssl协议进行加密传输,端口是 443。
二、http的工作过程
http由请求和响应构成,是一个标准的客户端服务器模型(C/S)。http协议是客户端发起请求,服务器响应请求。
http过程如下:
1.地址解析。域名系统DNS解析域名得到主机IP地址。
2.封装http请求数据包。封装主机IP地址以及主机信息。
3.封装成TCP包,建立TCP连接(三次握手)。
4.建立连接后,客户机向服务器发送请求。
5.服务器接收请求,给予响应。
6.服务器关闭TCP连接(四次挥手)。
7.客户端解析报文,解析并渲染HTML代码。
三、https的通信过程
https通信时,首先建立ssl层的连接,客户端将ssl版本号和加密组件发到服务器端。服务器端对收到的ssl版本号和加密组件进行匹配,同时将ca证书及密钥发送给客户端。
客户端对证书进行验证,验证通过后使用非对称加密对数据通信时的密钥进行协商。协商后得到一致的加密密钥,然后使用对称加密算法进行TCP连接,后续的过程跟http一致。三次握手,数据交换,四次挥手,通信结束。
https具体过程如下:
1.客户端和服务器端通过TCP建立连接。
2.客户端向服务器发送HTTPS请求。
3.服务器响应请求,并将数字证书发送给客户端,数字证书包括公共秘钥、域名、申请证书的公司。
4.客户端收到服务器端的数字证书之后,会验证数字证书的合法性。
5.如果公钥合格,那么客户端会生成一个用于进行对称加密的密钥client key,并用服务器的公钥对客户端密钥进行非对称加密。
非对称加密:客户端和服务端均拥有一个公有密匙和一个私有密匙。公有密匙可以对外暴露,而私有密匙只有自己可见。
6.客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。
7.服务器接收到客户端发来的密文之后,会用私钥对其进行非对称解密,得到客户端秘钥。并使用客户端秘钥进行对称加密,生成密文并发送。
8.客户端收到密文,并使用客户端秘钥进行解密,渲染网页。
由于BPM系统需要调用PLM系统进行模具料号写入,这里需要调用https接口。
接口结构如下
项目中核心调用代码如下:
在代码层跳出SSL验证,防止出现SSL证书认证失败,可以参考我的这篇文章
if(errMsg.isEmpty()){
DatApplication dat = datApplicationService.getDatApplicationByName("SystemMG");
Map<String, Object> map = datDocumentService.getDocumentByField(dat.getAppId(), "SAPConfig", "SearchKey","PLM_B");
//在代码层跳出SSL验证,防止出现SSL证书认证失败
TrustManager[] trustAllCerts = {new TrustAllTrustManager()};
SSLContext sc = SSLContext.getInstance("SSL");
sc.getServerSessionContext().setSessionTimeout(0);
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){
@Override
public boolean verify(String urlHostName, SSLSession session){
return true;
}
});
//调用https接口
URL url = new URL("https://***.***.***/Windchill/servlet/RPC?CLASS=com.aac.integration");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("content-type", "text/xml");
conn.setDoOutput(true);
conn.setDoInput(true);
String key = map.get("user")+":"+map.get("passwd");
String passId = new String(Base64.getEncoder().encode(key.getBytes()));
conn.setRequestProperty("Authorization", "Basic "+passId);
conn.connect();
OutputStream os = conn.getOutputStream();
String s = "<soapenv:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:mes='http://***/***/***/message/'>"
+" <soapenv:Header/>"
+" <soapenv:Body>"
+" <mes:GetACreateMouldPart soapenv:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>"
+" <mouldNum xsi:type='xsd:string'>"+mouldNum+"</mouldNum>"
+" <partNum xsi:type='xsd:string'>"+partNum+"</partNum>"
+" <drawingType xsi:type='xsd:string'>"+drawingType+"</drawingType>"
+" <factories xsi:type='xsd:string'>"+factories+"</factories>"
+" </mes:GetACreateMouldPart>"
+" </soapenv:Body>"
+"</soapenv:Envelope>";
os.write(s.getBytes());
os.flush();
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(conn.getInputStream(),out);
Document data = DocumentHelper.parseText(out.toString());
Element rootElt = data.getRootElement();
msg = rootElt.element("Body").element("GetACreateMouldPartResponse").elementTextTrim("return");
os.close();
}else{
JSONObject json = new JSONObject();
json.put("L_FLAG", "N");
json.put("MESSAGE", errMsg.toString());
msg = json.toString();
}
参考文章:
https://blog.csdn.net/JAck_chen0309/article/details/105020259
https://blog.csdn.net/qq_35642036/article/details/82788421