使用HttpsURLConnection发送POST请求

重写X509TrustManager

复制代码
 1 private static TrustManager myX509TrustManager = new X509TrustManager() { 
 2 
 3     @Override 
 4     public X509Certificate[] getAcceptedIssuers() { 
 5         return null; 
 6     } 
 7 
 8     @Override 
 9     public void checkServerTrusted(X509Certificate[] chain, String authType) 
10     throws CertificateException { 
11     } 
12 
13     @Override 
14     public void checkClientTrusted(X509Certificate[] chain, String authType) 
15     throws CertificateException { 
16     } 
17 };
复制代码
复制代码
 1 static public String SendHttpsPOST(String url, List<NameValuePair> param, String data) 
 2 { 
 3         String result = null; 
 4         
 5 
 6         //使用此工具可以将键值对编码成"Key=Value&Key2=Value2&Key3=Value3”形式的请求参数 
 7         String requestParam = URLEncodedUtils.format(param, "UTF-8"); 
 8         try { 
 9             //设置SSLContext 
10             SSLContext sslcontext = SSLContext.getInstance("TLS"); 
11             sslcontext.init(null, new TrustManager[]{myX509TrustManager}, null);
12 
13             //打开连接
14         //要发送的POST请求url?Key=Value&Key2=Value2&Key3=Value3的形式 
15            URL requestUrl = new URL(url + "?" + requestParam); 
16            HttpsURLConnection httpsConn = (HttpsURLConnection)requestUrl.openConnection();
17 
18             //设置套接工厂 
19             httpsConn.setSSLSocketFactory(sslcontext.getSocketFactory());
20 
21             //加入数据 
22             httpsConn.setRequestMethod("POST"); 
23             httpsConn.setDoOutput(true); 
24             DataOutputStream out = new DataOutputStream( 
25                     httpsConn.getOutputStream()); 
26             if (data != null) 
27                 out.writeBytes(data); 
28             
29             out.flush(); 
30             out.close();
31 
32             //获取输入流 
33             BufferedReader in = new BufferedReader(new InputStreamReader(httpsConn.getInputStream())); 
34             int code = httpsConn.getResponseCode(); 
35             if (HttpsURLConnection.HTTP_OK == code){ 
36                 String temp = in.readLine(); 
37                 /*连接成一个字符串*/ 
38                 while (temp != null) { 
39                     if (result != null) 
40                         result += temp; 
41                     else 
42                         result = temp; 
43                     temp = in.readLine(); 
44                 } 
45             } 
46         } catch (KeyManagementException e) { 
47             e.printStackTrace(); 
48         } catch (NoSuchAlgorithmException e) { 
49             e.printStackTrace(); 
50         } catch (MalformedURLException e) { 
51             e.printStackTrace(); 
52         } catch (ProtocolException e) { 
53             e.printStackTrace(); 
54         } catch (IOException e) { 
55             e.printStackTrace(); 
56         }
57 
58         return result; 
59 }
复制代码
### Java HTTPS POST 请求使用 `cert.crt` 签名文件和 `client.key` 客户端密钥 为了实现基于证书的 HTTPS POST 请求,在 Java 中需要加载客户端的 `.crt` 文件(即公钥证书)以及对应的私钥文件(`.key`),并通过 SSL/TLS 双向认证来建立安全连接。以下是完整的解决方案: --- #### 准备工作 1. 将 `.crt` 和 `.key` 转换为 PKCS#12 格式的 keystore 文件。这可以通过 OpenSSL 工具完成。 2. 加载该 keystore 并配置 SSLContext 来支持带签名的 HTTPS 请求。 --- #### 步骤说明 ##### 1. 使用 OpenSSL 创建 PKCS#12 Keystore 通过以下命令将 `.crt` 和 `.key` 合并成一个 PKCS#12 格式的文件: ```bash openssl pkcs12 -export -in cert.crt -inkey client.key -out client.p12 -name myalias -password pass:mypassword ``` - `-in`: 输入证书文件路径。 - `-inkey`: 私钥文件路径。 - `-out`: 输出的 PKCS#12 文件路径。 - `-name`: 别名,用于标识此条目。 - `-password`: 设置密码保护。 --- ##### 2. 配置 Java 的 SSLContext 在 Java 中,可以利用 `SSLContext` 和 `KeyManagerFactory` 实现自定义的信任管理器和密钥管理器。 下面是具体的代码示例,展示如何发送带有 JSON 数据体的 HTTPS POST 请求: ```java import javax.net.ssl.*; import java.io.OutputStream; import java.security.KeyStore; import org.json.JSONObject; // 如果未导入JSON库,请先添加依赖 public class HttpsPostClientWithCert { public static void main(String[] args) throws Exception { String keyStorePath = "path/to/client.p12"; // 替换为实际路径 char[] keyStorePassword = "mypassword".toCharArray(); // 替换为实际密码 // 加载PKCS#12格式的keystore KeyStore keyStore = KeyStore.getInstance("PKCS12"); try (var fis = new FileInputStream(keyStorePath)) { keyStore.load(fis, keyStorePassword); } // 初始化KeyManagerFactory KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, keyStorePassword); // 初始化TrustManagerFactory,默认信任所有服务器证书 TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init((KeyStore) null); // 不验证服务器证书 // 配置SSLContext SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); // 创建HTTPS连接 URL url = new URL("https://example.com/api/resource"); // 替换为目标URL HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); connection.setSSLSocketFactory(sslContext.getSocketFactory()); // 设置POST请求参数 connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); connection.setDoOutput(true); JSONObject jsonBody = new JSONObject(); jsonBody.put("key1", "value1"); jsonBody.put("key2", "value2"); try (OutputStream os = connection.getOutputStream()) { byte[] input = jsonBody.toString().getBytes("UTF-8"); os.write(input, 0, input.length); } int responseCode = connection.getResponseCode(); System.out.println("Response Code: " + responseCode); // 关闭连接 connection.disconnect(); } } ``` --- #### 解析与注意事项 1. **Keystore 类型**: 上述代码中使用的 `PKCS12` 是一种常见的密钥存储格式[^1]。 2. **KeyManagerFactory**: 提供了客户端的身份证明机制,允许服务端验证客户端身份。 3. **TrustManagerFactory**: 默认情况下未设置任何可信 CA 证书,因此不会验证服务端证书的有效性。如果需要严格验证,则需提供包含受信 CA 的 keystore 或 truststore[^2]。 4. **异常处理**: 生产环境中应增加详细的错误捕获逻辑以应对可能发生的 I/O 错误或其他问题。 5. **JSON 库**: 示例中使用了 `org.json` 库生成 JSON 数据体。如果没有引入该库,也可以手动拼接字符串替代。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值