https说明

        http是无状态的,https是在http应用层协议和tcp传输控制层之间加了一层,主要功能包括加密传输内容,校验信息是否完整,信息是否被篡改等。http的网络传输,源端应用层发送http请求,传输到源端的控制层,网络层,物理层->到对方的物理层->网络层->传输控制层->应用层,https就是在两边的控制层和应用层之间加了一层SSL/TLS协议层。发送时将http的明文加密,接收时解密,校验是否完整,是否被篡改,在正确无误的明文发送给目标端的应用层,作为http报文。

发送方:应用层http明文->SSL/TLS->秘文->控制层 接收方:控制层秘文->SSL/TLS->明文-应用层http

加密方式,分为对称加密,非对称加密;对称加密,加密强度弱,耗时短,使用相同的key加解密;非对称加密,加密强度高,耗时长,一个使用公钥,一个使用私钥。

tls握手流程:

步骤一:tls握手和密钥交换(非对称加密阶段)

1.客户端发送自己tls版本,支持的加密方式,随机数

2.服务器回复选择的加密方式,随机数和证书,证书包括认证机构,服务器地址,公钥,有效期等

3.客户端验证证书。查看证书的公钥,服务器地址,过期时间ca签名等

4.客户端生成一个用于对数据加密的对称密钥,并用服务器的公钥将这个对称密钥加密,传输给服务器

5.服务器用私钥解密,获取到对称密钥。

步骤二:数据传输,对称加密阶段

每次发送数据,使用对称密钥对数据进行加密,服务器解密后传输给应用层。再将引用层的响应信息加密发送给客户端。

java发送https请求需要怎么做

1.生产环境必须使用权威CA颁发的证书,禁止信任所有证书。

2.自签名证书仅限测试环境,生产环境使用会到安全风险。

3.导入证书到JVM信任库

通过keytool将CA证书导入JVM默认信任库cacerts:

keytool -import -alias server_cert -file server.crt -keystore $JAVA_HOME/lib/security/cacerts

输入默认密码changeit,完成后重启应用生效。

若需要隔离应用证书,可创建独立的信任库:

keytool -import -alias my_ca -file ca.crt -keystore /path/to/my_truststore.jks
​
#启动时指定JVM参数:
-Djavax.net.ssl.trustStore=/path/to/my_truststore.jks -Djavax.net.ssl.trustStorePassword=your_password
```[6,8](@ref)
https请求实现方式:

1.使用JAVA标准库

import javax.net.ssl.HttpsURLConnection;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
​
public class HttpsExample {public static void main(String[] args) throws Exception {URL url = new URL("https://api.example.com/data");HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setRequestMethod("GET");
​// 验证响应try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {String line;while ((line = in.readLine()) != null) {System.out.println(line);}}}
}

2.使用Apache HttpClient(推荐)

#maven依赖
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version>
</dependency>
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.util.EntityUtils;
​
public class HttpClientExample {public static void main(String[] args) throws Exception {// 加载信任库(可选,默认使用JVM信任库)SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, (chain, authType) -> true) // 生产环境需替换为证书验证逻辑.build();
​try (CloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build()) {HttpGet httpGet = new HttpGet("https://api.example.com/data");HttpResponse response = httpClient.execute(httpGet);String result = EntityUtils.toString(response.getEntity());System.out.println(result);}}
}

3.使用OkHttp(高性能首选)

<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.11.0</version>
</dependency>
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
​
public class OkHttpExample {public static void main(String[] args) throws Exception {OkHttpClient client = new OkHttpClient.Builder().sslSocketFactory(sslContext.getSocketFactory(), trustManager) // 生产环境需配置真实TrustManager.build();
​Request request = new Request.Builder().url("https://api.example.com/data").build();
​try (Response response = client.newCall(request).execute()) {System.out.println(response.body().string());}}
}
为什么客户端需要安装CA证书?

1.验证服务器身份(核心作用)

  • 服务器证书的合法性验证:当客户端(java程序)访问HTTPS服务器时,服务器会返回它的数字证书,客户端需要使用CA证书验证服务器证书是否由可信结构签发,是否被篡改,域名是否匹配等。

2.信任链的建立

  • 证书链验证:服务器证书通常由中间CA签发,而中间CA的合法性需由根CA证书验证。java默认信任库(cacerts)内置了权威CA的根证书,用于逐级验证整个证书链。

  • 未安装CA证书的后果:若服务器证书的签发CA不在客户端信任库中,Java会抛出异常,拒接链接。

开发环境与生产环境为什么不同?

1.开发环境:开发测试时使用自签名证书(非CA签发),浏览器或Java默认不信任此类证书。

验证方式:

1.忽略验证(仅限测试):通过自定义TrustManager跳过证书检查(高风险,生产禁用)

2.手动导入信任库:将自签名证书导入JVM的cacerts文件,使java临时信任该证书。

keytool -import -alias dev_cert -file dev.crt -keystore $JAVA_HOME/lib/security/cacerts

目的:快速测试HTTPS功能,避免频繁申请CA证书的成本。

2.生产环境:必须使用权威CA(如Let's Encrypt,DigiCert)签发的证书,确保全局可信

验证机制:

1.自动信任链验证:依赖JVM内置的cacerts信任库(含主流CA根证书),无需额外配置。

2.证书生命周期管理:需监控有效期,及时续期,避免服务中断

生产环境代码应该如何修改?

####

//替换开发代码中的跳过验证部分.loadTrustMaterial(null,(chain,authType)->true)
KeyStore trustStore = KeyStore.getInstance("JKS");
try (InputStream is = new FileInputStream("truststore.jks")) {trustStore.load(is, "truststore_password".toCharArray());
}
​
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore, null) // 启用信任库验证.build();
双向验证:

若需客户端证书认证(如银行接口):

KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream("client.p12"), "client_pass".toCharArray());
​
SSLContext sslContext = SSLContexts.custom().loadKeyMaterial(keyStore, "client_pass".toCharArray()) // 加载客户端证书.loadTrustMaterial(trustStore, null) // 加载信任库.build();
生产环境完整代码示例:
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
import java.io.FileInputStream;
import java.security.KeyStore;public class ProductionHttpsClient {public static void main(String[] args) throws Exception {// 1. 加载信任库(生产环境使用CA证书)KeyStore trustStore = KeyStore.getInstance("JKS");try (InputStream is = new FileInputStream("/path/to/truststore.jks")) {trustStore.load(is, "truststore_pass".toCharArray());}// 2. 初始化SSLContext(启用完整证书验证)SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore, null) // 关键修改:启用CA验证.build();// 3. 创建HttpClient(使用默认域名校验)try (CloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build()) {// 4. 发送请求HttpGet httpGet = new HttpGet("https://api.example.com/data");try (CloseableHttpResponse response = httpClient.execute(httpGet)) {String result = EntityUtils.toString(response.getEntity());System.out.println(result);}}}
}
生产环境注意事项

1.证书管理

  • 监控CA证书有效期,提前续期(如Let's Encrypt证书90天有效期)

  • 定期更新JVM信任库(cacerts),确保包含最新根证书。

2.协议与加密套件

  • 强制使用TLSv1.2+,禁用弱算法(如SSLv3,TLSv1.0)

SSLContext sslContext = SSLContext.getInstance("TLSv1.3");

3.异常处理

  • 捕获SSLHandshakeExceptioni并记录详细日志,快速定位证书问题

4.性能开销

  • 复用CloseableHttpClient实例,减少SSL握手开销

为什么开发环境不能共用生产的根证书

1.安全漏洞放大
  • 开发环境常使用自签名证书,若将其导入生产信任库,攻击者可通过伪造相同域名的自签名证书劫持通信

  • 生产根证书被用于开发环境时,测试证书的泄露可能危及生产系统信任链

2.证书管理混乱
  • 开发证书频繁变更:测试需快速迭代,证书常重置或替换,若共用会导致生产信任库频繁更新,引发服务中断

3.验证策略冲突
  • 开发环境往往需跳过严格验证(如 NoopHostnameVerifier),而生产环境必须启用完整验证(域名匹配、证书链校验

  • 共用配置会强制生产环境降低安全标准,或让开发环境无法调试

4.合规与审计风险
  • 行业标准(如 PCI DSS)要求生产环境证书必须由公共 CA 签发并独立管理,共用会导致审计失败

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实时操作系统(FreeRTOS、RT-Thread)RISC-V

FreeRTOS&#xff1a;FreeRTOS™ - FreeRTOS™ RT-Thread&#xff1a;rt-thread.org VxWorks&#xff1a; QNX Neutrino RTOS&#xff1a; RT-Linux&#xff1a; 一、 实时操作系统介绍 实时操作系统&#xff08;Real Time Operating System&#xff0c;简称RTOS&#xff…

Python3除标准库外更全面的XML解析方案

一、扩展解析库方案 lxml高性能解析 from lxml import etree doc etree.parse(data.xml) # XPath 2.0增强查询 nodes doc.xpath(//student[score>90]/name/text())优势&#xff1a;支持XPath 2.0语法和XSLT转换&#xff0c;比标准库快5-10倍 BeautifulSoup混合解析 fr…

同时装两个MySQL, 我在MySQL5的基础上, 安装MySQL8

目录 1. 前言 2. 下载MySQL 3. 安装MySQL 3.1 第一步:选择MySQL ​编辑 3.2 第二步:存储地址 3.3 第三步 3.4 第四步:完成基础配置 3.5 第五步 3.6 第六步:数据库密码 3.7 第七部:服务名 4. 环境变量 4.1 复制MySQL的bin地址 4.2 进入高级系统设置 4.3 PATH 4.4 更改…

Visual Studio 2022打包程序流程

Visual Studio 2022打包程序流程 打开管理拓展 安装Microsoft Visual Studio Installer Projects 关闭软件才能继续安装 安装完成后点击&#xff0c;解决方案&#xff0c;创建新项目 添加&#xff1a;setup project 打开软件的路径 复制路径 添加文件 粘贴刚才复制的路径&…

web3方法详解

web3.py 是一个功能强大的 Python 库,用于与以太坊区块链交互。它提供了多种模块和功能,涵盖账户管理、智能合约交互、交易发送、区块链数据查询等。以下是 web3.py 的主要功能模块及其用途: 1. Web3 核心模块 功能:提供基础连接、工具函数和核心功能。 常用方法: Web3(…

HTML5+JS实现一个简单的SVG 贝塞尔曲线可视化设计器,通过几个点移动位置,控制曲线的方向

三次贝塞尔曲线,二次贝塞尔曲线有什么区别 https://blog.csdn.net/xiaoyao961/article/details/148678265 SVG 贝塞尔曲线可视化设计器 下面是一个简单的贝塞尔曲线可视化设计器&#xff0c;使用 HTML5 和 JavaScript 实现。这个设计器允许你通过拖动控制点来实时调整贝塞尔曲…

Pytorch框架——自动微分和反向传播

一、自动微分概念 自动微分&#xff08;Automatic Differentiation&#xff0c;AD&#xff09;是一种利用计算机程序自动计算函数导数的技术&#xff0c;它是机器学习和优化算法中的核心工具&#xff08;如神经网络的梯度下降&#xff09;&#xff0c;通过反向传播计算并更新梯…

【Linux手册】进程的状态:从创建到消亡的“生命百态”

目录 前言 操作系统进程状态 运行状态 阻塞状态 挂起状态 Linux中具体的进程状态 R(running)运行状态 S(sleeping)阻塞状态 D(disk sleep)磁盘休眠状态 T(stopped)和t(tracing stop) X(dead)终止状态 Z(zombie)僵尸状态 僵尸进程的危害 前言 我们在运行可执行程序…

李沐--动手学深度学习 LSTM

1.从零开始实现LSTM #从零开始实现长短期记忆网络 import torch from torch import nn from d2l import torch as d2l#加载时光机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps)#1.定义和初始化模型参数&#xff…

面经的疑难杂症

1.介绍一下虚拟地址&#xff0c;虚拟地址是怎么映射到物理地址的&#xff1f; 虚拟地址是指在采用虚拟存储管理的操作系统中&#xff0c;进程访问内存时所使用的地址。每个进程都有独立的虚拟地址空间&#xff0c;虚拟地址通过操作系统和硬件&#xff08;如MMU&#xff0c;内存…

去噪扩散概率模型(DDPM)全解:从数学基础到实现细节

一、 概述 在这篇博客文章中&#xff0c;我们将深入探讨去噪扩散概率模型&#xff08;也被称为 DDPMs&#xff0c;扩散模型&#xff0c;基于得分的生成模型&#xff0c;或简称为自动编码器&#xff09;&#xff0c;这可以说是AIGC最近几年飞速发展的基石&#xff0c;如果你想做…

【系统分析师】2011年真题:案例分析-答案及详解

文章目录 试题1【问题 1】【问题 2】【问题 3】 试题2【问题 1】【问题 2】【问题 3】 试题3【问题 1】【问题 2】【问题 3】 试题4【问题 1】【问题 2】【问题 3】 试题5【问题 1】【问题 2】【问题 3】 试题1 随着宽带应用快速发展&#xff0c;用户要求系统服务提供商提供基…

【unitrix】 1.7 规范化常量类型结构(standardization.rs)

一、源码 这段代码实现了一个二进制数字标准化系统&#xff0c;用于将二进制数字类型&#xff08;B0/B1&#xff09;转换为更简洁的表示形式。 //! 二进制数字标准化模块 / Binary Number Normalization Module //! //! 提供将二进制数字(B0/B1)标准化为更简洁表示形式的功能…

NJet Portal 应用门户管理介绍

nginx向云原生演进&#xff0c;All in OpenNJet&#xff01; 1. 应用门户简介 NJet 应用引擎是基于 Nginx 的面向互联网和云原生应用提供的运行时组态服务程序&#xff0c;作为底层引擎&#xff0c;NJet 实现了NGINX 云原生功能增强、安全加固和代码重构&#xff0c;利用动态加…

uni-app学习笔记三十六--分段式选项卡组件的使用

先来看效果&#xff1a; 上图有3个选项卡&#xff08;PS:uniapp官方称之为分段器&#xff0c;我还是习惯叫选项卡&#xff09;&#xff0c;需要实现点击不同的选项卡时下方切换显示对应的数据。 下面介绍下实现的过程。 1.在uniapp官方文档下载并安装该扩展组件&#xff1a;u…

Qt:Qt桌面程序正常退出注意事项

一般情况下&#xff0c;Qt窗体的创建和显示命令如下&#xff1a; Main_window main_window; main_window.show(); 主窗体中设置属性Qt::WA_DeleteOnClose setAttribute(Qt::WA_DeleteOnClose); 则在main.cpp中可以将窗体创建为指针&#xff0c;这样在退出时可以正确释放指针…

【arXiv2024】时间序列|TimesFM-ICF:即插即用!时间序列预测新王者!吊打微调!

论文地址&#xff1a;https://arxiv.org/pdf/2410.24087 代码地址&#xff1a;https://github.com/uctb/TSFM 为了更好地理解时间序列模型的理论与实现&#xff0c;推荐参考UP “ThePPP时间序列” 的教学视频。该系列内容系统介绍了时间序列相关知识&#xff0c;并提供配套的论…

从0开始学习语言模型--Day02-如何最大化利用硬件

如何利用硬件 这个单元分为内核、并行处理和推理。 内核&#xff08;Kernels&#xff09; 我们说的内核一般指的就是GPU&#xff0c;这是我们用于计算的地方&#xff0c;一般说的计算资源就指的是GPU的大小。我们模型所用的数据和参数一般存储在内存里&#xff0c;假设把内存…

ElasticSearch配置详解:设置内存锁定的好处

什么是内存锁定 "bootstrap": {"memory_lock": "true" }内存锁定是指将Elasticsearch的JVM堆内存锁定在物理内存中&#xff0c;防止操作系统将其交换&#xff08;swap&#xff09;到磁盘。 内存交换是操作系统的虚拟内存管理机制&#xff0c;当…

成功解决 ValueError: Unable to find resource t64.exe in package pip._vendor.distlib

解决问题 我们在本地的命令行中运行指令"python -m pip install --upgrade pip"的时候&#xff0c;报了如下的错误&#xff1a; 解决思路 我们需要重新安装一下pip。 解决方法 步骤1&#xff1a; 通过执行下面的指令删除本地的pip: python -m pip uninstall pip…