> 技术文档 > java调用https接口的两种方式及完整代码

java调用https接口的两种方式及完整代码

目录

HTTPS是什么

SSL证书是什么

方法一:禁用证书认证,绕过SSL证书调用https接口

方法二:安装ssl证书,使用ssl认证调用https接口

1 下载证书

2 安装证书

3 调用接口


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(); } }}

附:win7、win10系统JDK环境变量配置_windows 7 jdk环境变量配置文件保存在哪里-CSDN博客