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博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ssxueyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值