https是什么
https (全称:hypertext transfer protocol secure),是以安全为目标的 http 通道,在http的基础上通过传输加密和身份认证保证了传输过程的安全性 。https 在http 的基础下加入ssl,https 的安全基础是 ssl,因此加密的详细内容就需要 ssl。 https 存在不同于 http 的默认端口及一个加密/身份验证层(在 http与 tcp 之间)。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯,例如交易支付等方面 。
https不是协议,而是通过ssl/tls协议 提供的安全连接进行的http通信。最初,它被用于安全很重要的通信,例如在互联网上传输个人信息和电子支付。 随后,由于公共无线局域网的普及、prism的大规模窃 听以及中间人攻击的风险增加, 用https取代单纯的http通信越来越多。
与以纯文本形式发送和接收消息的标准 http 不同,https 使用ssl/tls等协议对服务器进行身份验证、加密通信内容和检测篡改。 这样可以防止欺骗、中间人攻击和窃 听等攻击。
ssl证书是什么
ssl证书是数字证书的一种,类似于驾驶 证、护照和营业执照的电子副本。因为配置在服务器上,也称为ssl服务器证书。
ssl 证书 就是遵守 ssl协议,由受信任的数字证书颁发机构ca,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。
ssl证书通过在客户端浏览器和web服务器之间建立一条ssl安全通道(secure socket layerssl)安全协议是由netscape communication公司设计开发。该安全协议主要用来提供对用户和服务器的认证;对传送的数据进行加密和隐藏;确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准。由于ssl技术已建立到所有主要的浏览器和web服务器程序中,因此,仅需安装服务器证书就可以激活该功能了,即通过它可以激活ssl协议,实现数据信息在客户端和服务器之间的加密传输,可以防止数据信息的泄露,保证了双方传递信息的安全性,而且用户可以通过服务器证书验证他所访问的网站是否是真实可靠。数字签名又名数字标识、签章 (即 digital certificate,digital id ),提供了一种在网上进行身份验证的方法,是用来标志和证明网络通信双方身份的数字信息文件。
java调用https接口有两种方式:
方法一:禁用证书认证,绕过ssl证书调用https接口
完整代码如下:
import java.io.*; import java.net.url; import javax.net.ssl.httpsurlconnection; import javax.net.ssl.sslcontext; import javax.net.ssl.trustmanager; import javax.net.ssl.x509trustmanager; public class httpclientexample { public static void main(string[] args) { try { // 禁用ssl证书验证(仅测试环境使用) trustmanager[] trustallcerts = new trustmanager[]{ new x509trustmanager() { public java.security.cert.x509certificate[] getacceptedissuers() { return null; } public void checkclienttrusted(java.security.cert.x509certificate[] certs, string authtype) {} public void checkservertrusted(java.security.cert.x509certificate[] certs, string authtype) {} } }; sslcontext sc = sslcontext.getinstance("ssl"); sc.init(null, trustallcerts, new java.security.securerandom()); httpsurlconnection.setdefaultsslsocketfactory(sc.getsocketfactory()); // 创建连接 url url = new url("https://......"); httpsurlconnection connection = (httpsurlconnection) url.openconnection(); // 设置请求头 connection.setrequestmethod("post"); connection.setrequestproperty("authorization", ""); system.out.println("request headers:"); connection.getrequestproperties().foreach((k,v) -> system.out.println(k + "=" + v)); connection.setrequestproperty("content-type", "application/json"); connection.setdooutput(true); // 发送请求体 string jsoninputstring = ""; try(outputstream os = connection.getoutputstream()) { byte[] input = jsoninputstring.getbytes("utf-8"); os.write(input, 0, input.length); system.out.println("request body sent: " + jsoninputstring); } // 处理响应 int statuscode = connection.getresponsecode(); system.out.println("response code: " + statuscode); try(bufferedreader br = new bufferedreader( new inputstreamreader(connection.getinputstream(), "utf-8"))) { stringbuilder response = new stringbuilder(); string responseline; while ((responseline = br.readline()) != null) { response.append(responseline.trim()); } system.out.println("response body: " + response.tostring()); } } catch (exception e) { e.printstacktrace(); } } }
这种方式不安全。而且如果接口配置了必须使用证书,则无法调用成功,所以不推荐这种方式。
方法二:安装ssl证书,使用ssl认证调用https接口
具体步骤:
1 下载证书
使用浏览器打开接口地址,例如:https://www.baidu.com/,点击地址左侧的锁,点击正式-》详细信息-》导出baidu.crt
2 安装证书
windows安装证书(jdk路径替换为自己的)命令:
keytool -import -alias zhengzhoubus -keystore "d:\pro\jdk1.8.0_181\jre\lib\security\cacerts" -file e:\cert\zhengzhoubus.crt -storepass changeit
linux安装证书(jdk路径替换为自己的)命令:
sudo keytool -import -alias zhengzhoubus -keystore /usr/java/jdk1.8.0_301/jre/lib/security/cacerts -file /opt/certs/zhengzhoubus.crt -storepass changeit
查看证书(jdk路径替换为自己的):
keytool -list -keystore "d:\pro\jdk1.8.0_181\jre\lib\security\cacerts" -storepass changeit
3 调用接口
证书安装完成之后,即可正常调用https接口,完整代码如下:
import java.io.*; import java.net.url; import javax.net.ssl.httpsurlconnection; import javax.net.ssl.sslcontext; //import javax.net.ssl.trustmanager; //import javax.net.ssl.x509trustmanager; public class httpclientexample { public static void main(string[] args) { try { // 删除自定义ssl验证配置 // 恢复默认证书验证机制 // 创建连接 url url = new url("https://..."); httpsurlconnection connection = (httpsurlconnection) url.openconnection(); // 创建ssl上下文使用默认信任管理器 sslcontext sslcontext = sslcontext.getinstance("tls"); sslcontext.init(null, null, null); connection.setsslsocketfactory(sslcontext.getsocketfactory()); // 设置请求头 connection.setrequestmethod("post"); connection.setrequestproperty("authorization", ""); system.out.println("request headers:"); connection.getrequestproperties().foreach((k,v) -> system.out.println(k + "=" + v)); connection.setrequestproperty("content-type", "application/json"); connection.setdooutput(true); // 发送请求体 string jsoninputstring = ""; try(outputstream os = connection.getoutputstream()) { byte[] input = jsoninputstring.getbytes("utf-8"); os.write(input, 0, input.length); system.out.println("request body sent: " + jsoninputstring); } // 处理响应 int statuscode = connection.getresponsecode(); system.out.println("response code: " + statuscode); try(bufferedreader br = new bufferedreader( new inputstreamreader(connection.getinputstream(), "utf-8"))) { stringbuilder response = new stringbuilder(); string responseline; while ((responseline = br.readline()) != null) { response.append(responseline.trim()); } system.out.println("response body: " + response.tostring()); } } catch (javax.net.ssl.sslhandshakeexception e) { system.err.println("ssl验证失败: " + e.getmessage()); if(e.getcause() != null) { system.err.println("根因: " + e.getcause().getmessage()); } } catch (exception e) { e.printstacktrace(); } } }
到此这篇关于java调用https接口的两种方式及完整代码的文章就介绍到这了,更多相关java调用https接口内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论