HTTPS原理详解、安装与使用、JAVA代码实现 In 公会战报 @2025-11-15 11:06:16

文章目录

HTTPS 详解一、HTTPS的核心目标二、SSL/TLS协议三、HTTPS实现原理1. 建立TCP连接2. TLS握手过程3. 加密数据传输

四、工作流程五、关键技术细节1. 混合加密机制2. 数字证书与CA3. 前向保密(Forward Secrecy)4. 会话恢复

六、TLS 1.3优化七、性能与安全性平衡1. 性能优化

八、实际应用九、使用流程十、HTTPS与HTTP的区别十一、总结

安装与使用1. 准备工作安装OpenSSL工具下载OpenSSL安装OpenSSL

2. 生成服务端证书在Win下生成证书

3. 自建CA对证书进行签名1.创建CA私钥2.生成CA待签名证书3.生成CA根证书4.对服务器证书签名

4. Nginx配置添加信任

JAVA实现案例1. 依赖2. 示例代码服务器端代码(SSLSERVER.java)客户端代码(SSLCLIENT.java)

3. 示例说明4. 如何运行生成证书运行服务器运行客户端

5. 注意事项

个人主页:道友老李 欢迎加入社区:道友老李的学习社区

HTTPS 详解

HTTPS(HyperText Transfer Protocol Secure)是在HTTP基础上通过SSL/TLS协议提供加密、身份验证和数据完整性保护的安全通信协议。

一、HTTPS的核心目标

加密传输:防止数据被窃听。身份认证:确保客户端与目标服务器通信,防止中间人攻击。数据完整性:防止数据在传输中被篡改。

二、SSL/TLS协议

HTTPS的安全基础是SSL(Secure Sockets Layer)及其继任者TLS(Transport Layer Security)。TLS协议位于应用层(如HTTP)和传输层(TCP)之间,分为握手协议和记录协议:

握手协议:协商加密算法、验证身份、生成共享密钥。记录协议:使用共享密钥加密传输数据。

三、HTTPS实现原理

1. 建立TCP连接

客户端通过TCP的443端口与服务器建立连接。

2. TLS握手过程

(1)ClientHello 客户端发送请求,包含:

支持的TLS版本。支持的加密套件(Cipher Suites)。随机数(Client Random)。

(2)ServerHello 服务器回应,包含:

选择的TLS版本和加密套件。随机数(Server Random)。数字证书(含服务器公钥和CA信息)。

(3)证书验证 客户端验证证书:

证书链的可信性(是否由受信任的CA签发)。域名匹配性。有效期和吊销状态(通过OCSP或CRL)。

(4)密钥交换 客户端生成预主密钥(Pre-Master Secret),用服务器公钥加密后发送。 (或使用DH算法):如ECDHE,双方交换临时公钥参数,生成预主密钥。

(5)生成会话密钥 客户端和服务器通过Client Random、Server Random和预主密钥生成会话密钥(Master Secret),用于后续对称加密。

(6)完成握手 双方验证加密通信就绪,握手结束。

3. 加密数据传输

使用对称加密(如AES)和会话密钥加密HTTP数据,确保高效性和安全性。

四、工作流程

五、关键技术细节

1. 混合加密机制

非对称加密(如RSA、ECC):用于握手阶段交换密钥。对称加密(如AES、ChaCha20):用于加密实际传输数据,效率更高。

2. 数字证书与CA

证书内容:服务器公钥、域名、有效期、签发者(CA)等(X.509标准)。CA作用:作为可信第三方,用私钥对证书签名,客户端通过预置的CA根证书验证签名。

3. 前向保密(Forward Secrecy)

通过ECDHE等算法,每次会话使用临时密钥,即使服务器私钥泄露,历史会话仍安全。

4. 会话恢复

Session ID:服务器保存会话状态,客户端重连时复用。Session Ticket:客户端存储加密的会话信息,减少握手开销。

六、TLS 1.3优化

简化握手:减少往返次数,提升速度。禁用不安全算法:仅保留前向保密的加密套件(如ECDHE)。0-RTT模式:允许客户端在首次握手时发送加密数据。

七、性能与安全性平衡

加密计算开销:现代硬件优化(如AES-NI指令集)降低性能损耗。证书管理:Let’s Encrypt等提供免费证书,推动HTTPS普及。

1. 性能优化

八、实际应用

浏览器行为:地址栏显示锁形图标,标识HTTPS连接。强制跳转:服务器配置HSTS(HTTP Strict Transport Security),强制使用HTTPS。

九、使用流程

十、HTTPS与HTTP的区别

十一、总结

HTTPS通过SSL/TLS协议,结合非对称加密、对称加密、数字证书等技术,实现了安全通信。其核心在于密钥交换、身份认证和数据加密,确保互联网数据传输的机密性、完整性和可信性。随着TLS 1.3的普及和硬件加速,HTTPS已成为现代Web安全的基石。

安装与使用

SSL/TLS

TLS(Transport Layer Security) 是 SSL(Secure Socket Layer) 的后续版本

1. 准备工作

在客户端(Windows)生成证书,然后安装到服务端(Linux)。

安装OpenSSL工具

OpenSSL中包含生成证书的工具和各类加密算法。

下载OpenSSL

Windows:http://slproweb.com/products/Win32OpenSSL.html

Linux:https://www.openssl.org/source/

安装OpenSSL

Windows安装:

双击运行,安装到指定目录即可。

Linux安装(从1.0.x升级):

1.查看版本命令

openssl version

openssl version -a

2.下载指定版本的 openssl 软件,两种方式

https://www.openssl.org/source/

wget https://www.openssl.org/source/openssl-1.1.1o.tar.gz

3.解压压缩包

tar -zxvf openssl-1.1.1o.tar.gz

4.进入解压后的文件夹执行以下命令编译安装

./config shared zlib

make && make install

5.备份原来的软链接

mv /usr/bin/openssl /usr/bin/openssl.bak

mv /usr/include/openssl /usr/include/openssl.bak

find / -name openssl

6.重新建立软链接

ln -s /usr/local/bin/openssl /usr/bin/openssl

ln -s /usr/local/include/openssl /usr/include/openssl

echo "/usr/local/lib64/" >> /etc/ld.so.conf

ldconfig

// 验证安装

openssl version -a

2. 生成服务端证书

在Windows系统中生成服务端证书,然后再把相关文件上传到服务器。

查看Win系统已存证书

certmgr.msc

证书中的信息

Country Name (2 letter code) [XX]:CN #请求签署人的信息State or Province Name (full name) []: #请求签署人的省份名字Locality Name (eg, city) [Default City]:# 请求签署人的城市名字Organization Name (eg, company) [Default Company Ltd]:#请求签署人的公司名字Organizational Unit Name (eg, section) []:#请求签署人的部门名字Common Name (eg, your name or your server’s hostname) []:#这里一般填写请求人的服务器域名

key:私钥

csr:证书签名请求文件,即待签名证书

crt:证书

在Win下生成证书

1.生成私钥:.key

找到OpenSSL安装目录下的/bin目录中的OpenSSL.exe

执行命令(注意目录的访问权限,下同)

openssl genrsa -des3 -out c:/dev/server.key

生成私钥,需要提供一个至少4位,最多1023位的密码

2.由私钥创建待签名证书:.csr

openssl.exe req -new -key c:/dev/server.key -out c:/dev/pub.csr

需要依次输入国家,地区,城市,组织,组织单位,Common Name和Email。其中Common Name,可以写自己的名字或者域名,如果要支持https,Common Name应该与域名保持一致,否则会引起浏览器警告。

3.查看证书中的内容

openssl.exe req -text -in c:/dev/pub.csr -noout

生成内容清单:

server.key:服务器私钥

pub.csr:服务器待签名证书

3. 自建CA对证书进行签名

我们用的操作系统(windows, linux, unix ,android, ios等)都预置了很多信任的根证书,比如我的windows中就包含VeriSign的根证书,那么浏览器访问服务器比如支付宝www.alipay.com时,SSL协议握手时服务器就会把它的服务器证书发给用户浏览器,而这本服务器证书又是比如VeriSign颁发的,自然就验证通过了。

由于费用的原因,我们需要自建CA机构,来给我们自己的证书进行签名。所谓“CA机构”的本质,其实也是一套证书,只不过这套证书具有“公信力”,可以用来给别人签名。

1.创建CA私钥

openssl.exe genrsa -out c:/dev/myca.key 2048

2.生成CA待签名证书

openssl.exe req -new -key c:/dev/myca.key -out c:/dev/myca.csr

3.生成CA根证书

openssl.exe x509 -req -in c:/dev/myca.csr -extensions v3_ca -signkey c:/dev/myca.key -out c:/dev/myca.crt

4.对服务器证书签名

对上一个环节生成的服务端 待签名证书(.csr) 进行签名,需要用到本CA机构的 私钥(.key) 和证书(.crt) 作为参数:

openssl x509 -days 365 -req -in c:/dev/pub.csr -extensions v3_req -CAkey c:/dev/myca.key -CA c:/dev/myca.crt -CAcreateserial -out c:/dev/server.crt

生成内容清单:

myca.key:ca机构私钥

myca.csr:ca机构待签名证书

myca.crt:ca机构证书,即根证书

server.crt:服务器证书,被ca机构签名过的证书

4. Nginx配置

将生成好的服务端证书上传到服务器指定目录,并在Nignx中进行配置

server {

listen 443 ssl;

server_name aa.abc.com;

ssl_certificate /data/cert/server.crt;

ssl_certificate_key /data/cert/server.key;

}

添加信任

在当前系统中安装证书

JAVA实现案例

1. 依赖

请确保你的项目中包含了javax.net.ssl包相关的类。

2. 示例代码

服务器端代码(SSLSERVER.java)

import java.security.KeyManagementException;

import java.security.NoSuchAlgorithmException;

import java.security.cert.CertificateException;

import java.util.Scanner;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLServerSocket;

import javax.net.ssl.SSLSocket;

public class SSLSERVER {

private static final String HTTPS_HOST = "localhost";

private static final int HTTPS_PORT = 8443;

public static void main(String[] args) {

try {

// 创建 SSL 上下文

SSLContext sslContext = SSLContext.getInstance("TLS");

// 加载密钥管理器

char[] passphrase = "password".toCharArray();

MyKeyManager keyManager = new MyKeyManager("server.keystore", passphrase);

sslContext.init(keyManager.getKeyManagers());

// 获取 SSL 套接字工厂并绑定端口

SSLSocketFactory factory = sslContext.getSocketFactory();

SSLServerSocket serverSocket = (SSLServerSocket) factory.createServerSocket(HTTPS_PORT, 10, null);

System.out.println("服务器已启动,监听 HTTPS 请求...");

while (true) {

SSLSocket socket = (SSLSocket) serverSocket.accept();

System.out.println("有新连接到达!");

new Thread(new SSLServerHandler(socket)).start();

}

} catch (NoSuchAlgorithmException | KeyManagementException e) {

e.printStackTrace();

}

}

private static class MyKeyManager extends javax.net.ssl.KeyManager {

// 实现你的密钥管理逻辑

public java.security.KeyManager[] getKeyManagers() throws NoSuchAlgorithmException {

return new java.security.KeyManager[0];

}

public String getAlgorithm() {

return null;

}

}

private static class SSLServerHandler implements Runnable {

private SSLSocket socket;

public SSLServerHandler(SSLSocket socket) {

this.socket = socket;

}

@Override

public void run() {

try {

// 处理请求

Scanner in = new Scanner(socket.getInputStream());

String request = in.nextLine();

System.out.println("接收到请求: " + request);

// 发送响应

socket.getOutputStream().write("HTTP/1.0 200 OK\r\n\r\nHello HTTPS World!".getBytes());

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

客户端代码(SSLCLIENT.java)

import java.io.IOException;

import java.security.KeyManagementException;

import java.security.NoSuchAlgorithmException;

import java.security.cert.CertificateException;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLSocket;

import javax.net.ssl.SSLSocketFactory;

public class SSLCLIENT {

private static final String HTTPS_HOST = "localhost";

private static final int HTTPS_PORT = 8443;

public static void main(String[] args) {

try {

// 创建 SSL 上下文

SSLContext sslContext = SSLContext.getInstance("TLS");

// 加载信任管理器

MyTrustManager trustManager = new MyTrustManager("ca-cert.pem");

sslContext.init(null, trustManager.getTrustManagers(), null);

SSLSocketFactory factory = sslContext.getSocketFactory();

SSLSocket socket = (SSLSocket) factory.createSocket(HTTPS_HOST, HTTPS_PORT);

// 发送请求

String request = "GET / HTTP/1.0\r\nUser-Agent: Java SSLClient\r\n\r\n";

socket.getOutputStream().write(request.getBytes());

System.out.println("发送请求完成...");

// 读取响应

StringBuilder response = new StringBuilder();

byte[] buffer = new byte[1024];

int bytes;

while ((bytes = socket.getInputStream().read(buffer)) != -1) {

response.append(new String(buffer, 0, bytes));

}

System.out.println("接收到的响应:\n" + response.toString());

} catch (NoSuchAlgorithmException | KeyManagementException | IOException e) {

e.printStackTrace();

}

}

private static class MyTrustManager extends javax.net.ssl.TrustManager {

// 实现你的信任管理逻辑

public java.security.cert.CertStore[] getCertStores() throws CertificateException {

return new CertStore[0];

}

public MyTrustManager(String truststorePath) throws NoSuchAlgorithmException, CertificateException {

// 初始化信任管理器

}

}

}

3. 示例说明

SSLSERVER.java:

创建了一个 SSL 上下文并配置了密钥管理器。监听 HTTPS 请求并处理客户端的请求。 SSLCLIENT.java:

创建了一个 SSL 上下文并配置了信任管理器。连接到服务器并发送 HTTP 请求,读取服务器的响应。

4. 如何运行

生成证书

在运行示例之前,请确保你已经生成了所需的 SSL 证书。可以使用 keytool 工具来生成密钥库和证书:

# 创建密钥库(Keystore)

keytool -genkeypair -alias server -keyalg RSA -keysize 2048 -validity 365 \

-keystore server.keystore -storepass password -dname "CN=localhost, OU=Example"

# 导出证书

keytool -exportcert -alias server -file ca-cert.pem -keystore server.keystore -storepass password

运行服务器

java SSLSERVER

运行客户端

java SSLCLIENT

5. 注意事项

确保你的 JVM 支持 TLS 协议。在实际应用中,建议使用更严格的 SSL/TLS 配置和认证流程。处理证书时,请确保 certificate path 和 password 正确配置。

这个示例展示了如何在 Java 中使用 SSL 进行 HTTPS 通信。你可以根据实际需求进行扩展和调整。

世界杯的意义和精神 世界杯的价值是什么
如何监控路由器流量▷➡️