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