Web安全 - 01SSL、TLS、HTTPS、证书和 CA

发布时间:2026/5/25 6:59:52

Web安全 - 01SSL、TLS、HTTPS、证书和 CA 文章目录01 小白基础SSL、TLS、HTTPS、证书和 CA1. SSL、TLS、HTTPS 是什么关系1.1 SSL1.2 TLS1.3 HTTPS2. 一次 HTTPS/TLS 连接做了什么3. 证书到底是什么4. CA 和证书链怎么理解5. TrustStore 和 KeyStore 是什么区别5.1 TrustStore我信谁5.2 KeyStore我是谁6. Hostname Verification 是什么7. 密码套件是什么8. 为什么 Java 接国密不能只用默认 JDK9. 常见误区误区 1有证书就能连误区 2关闭证书校验最省事误区 3https:// 就一定是普通 TLS误区 4服务端证书和客户端证书是一回事误区 5证书链过了业务就一定成功10. 本篇小结01 小白基础SSL、TLS、HTTPS、证书和 CA这一篇不讲国密细节先把最基础的 SSL/TLS/HTTPS 讲清楚。你只有先知道普通 HTTPS 怎么工作后面理解 TLCP、国密双证书、TrustStore、KeyStore 才不会乱。1. SSL、TLS、HTTPS 是什么关系1.1 SSLSSL 是早期的安全传输协议名字。现在严格说 SSL 已经过时了但很多人仍然习惯把“HTTPS 证书”“TLS 通道”“TLCP 通道”统称成“SSL”。所以你听到“国密 SSL”不要急着按字面理解。它很可能只是业务方的习惯说法。1.2 TLSTLS 是现代互联网广泛使用的安全传输协议。普通 HTTPS 大多跑在 TLS 上。TLS 解决三个核心问题问题TLS 怎么解决我怎么知道对面真的是那个服务器证书 CA 信任链认证服务端身份网络中间人能不能看到内容握手协商出会话密钥后续数据加密数据能不能被篡改记录层带完整性保护篡改会被发现RFC 8446 对 TLS 的目标描述可以概括为在可靠、有序的传输之上为通信双方建立具备认证、保密性和完整性保护的安全通道。原文见 RFC 8446。1.3 HTTPSHTTPS HTTP TLS。HTTP 负责业务语义POST /dd-server/v1/file/upload Content-Type: multipart/form-data Content-Meta: {...}TLS 负责安全通道先握手 → 验证证书 → 协商密钥 → 加密 HTTP 请求和响应所以你在代码里看到 URL 仍然是https://xxx:xxxx/xxxx/v1/file/upload并不代表它一定是普通国际 TLS。对 TLCP 客户端来说HTTP 库仍然用https://作为“我要走安全套接字”的入口但底层SSLContext可以换成TLCPv1.1。2. 一次 HTTPS/TLS 连接做了什么把 TLS 握手简化成小白版客户端你好我支持这些协议版本、密码套件、签名算法。 服务端我选择其中一种协议和套件这是我的证书。 客户端我检查证书是不是可信、有没有过期、是不是这个域名。 双方通过非对称算法协商出一个只有双方知道的会话密钥。 双方之后的 HTTP 数据都用会话密钥加密传输。关键词解释协议版本比如 TLS 1.2、TLS 1.3、TLCPv1.1。密码套件一组算法组合告诉双方“用什么方式认证、交换密钥、加密、做完整性保护”。证书服务端拿来证明“我是谁”的文件。CA签发证书的机构。会话密钥真正用来加密大量业务数据的对称密钥。3. 证书到底是什么证书可以理解为一张“服务器身份证”。它里面通常包含字段含义Subject证书主体比如这个证书发给谁Issuer谁签发了这个证书Serial Number证书序列号Not Before / Not After生效时间和过期时间Public Key公钥Signature Algorithm证书签名算法SAN / CN域名或 IP 匹配信息服务端保存的是服务端证书 服务端私钥客户端通常只拿到CA 根证书 / 中间 CA 证书为什么客户端不应该拿服务端私钥因为私钥是身份凭据泄露就等于身份被别人冒用。4. CA 和证书链怎么理解现实世界里你不会见到某个人就认识他但你可能相信公安机关签发的身份证。证书也是类似ROOTCA根CA ↓ 签发XXXXSM2CA中间CA ↓ 签发 server.example.com服务端证书客户端如果信任ROOTCA并且能验证XXXSM2CA是ROOTCA签的、服务端证书是BeijingSM2CA签的就能建立一条信任链。本工程默认信任链是trust-certificates:-classpath:certs/ROOTCA.cer-classpath:certs/XXXXSM2CA.cerclasspath 版本会被打进 jar适合默认演示。生产环境更建议放在外部安全路径用file:/...配置。5. TrustStore 和 KeyStore 是什么区别这两个词非常容易混。5.1 TrustStore我信谁TrustStore 存的是“我信任的 CA 证书”。客户端校验服务端证书时会问这个服务端证书能不能一路链到我的TrustStore里的某个可信CA本工程的TlcpSslContextFactory会把配置里的.cer文件读出来放进一个临时的 JKS TrustStore再交给 KonaSSL 的TrustManagerFactory。5.2 KeyStore我是谁KeyStore 存的是“我自己的证书 私钥”。只有服务端要求客户端也证明身份时客户端才需要 KeyStore。也就是常说的双向认证、mTLS、客户端证书认证。本工程默认不配置客户端 KeyStoreclient-key-store:path:如果填了client-key-store:path:file:/secure/client.p12type:PKCS12password:changeitkey-password:changeit客户端握手时就可以向服务端发送自己的证书并用私钥完成证明。6. Hostname Verification 是什么证书链可信只说明证书是某个可信 CA 签的还要确认这个证书是不是发给你正在访问的主机。比如你访问https://api.example.com证书里应该包含DNS:api.example.com如果你访问https://192.168.8.101证书里最好包含IP:192.168.8.101否则 Hostname Verification 会失败。本工程默认hostname-verification-enabled:false这是为了兼容很多内网 TLCP 服务端只给 IP 访问、证书里又没配 IP SAN 的联调环境。但是生产环境建议让服务端证书 SAN 正确包含域名或 IP把hostname-verification-enabled改成true用域名访问而不是裸 IP。7. 密码套件是什么密码套件是一组算法组合。普通 TLS 里你可能见过TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256国密 TLCP 里本工程默认使用TLCP_ECC_SM4_GCM_SM3 TLCP_ECC_SM4_CBC_SM3按名字拆片段大概含义TLCP用 TLCP 协议ECC / ECDHE密钥交换/认证相关模式SM4对称加密算法GCM / CBCSM4 的工作模式SM3杂凑/完整性相关算法新手先记住客户端和服务端必须至少有一个共同支持的密码套件。没有交集握手会失败。8. 为什么 Java 接国密不能只用默认 JDK标准 JDK 的 JSSE/JCA 对普通 TLS 支持很好但 TLCP 和国密算法不是默认全覆盖。本工程用了 Tencent Kona SM SuiteKonaCrypto提供 SM2/SM3/SM4 算法KonaPKIX提供国密证书解析、KeyStore 和证书链处理KonaSSL提供 TLCP/国密 TLS 相关 SSL 能力。也就是说Java 代码里不是直接SSLContext.getInstance(TLS)而是SSLContext.getInstance(TLCPv1.1,KonaSSL)这就是国密接入和普通 HTTPS 接入最重要的差别之一。9. 常见误区误区 1有证书就能连不一定。你需要的是正确的 CA 链、正确的协议、正确的密码套件、正确的 Provider。误区 2关闭证书校验最省事短期可能“能连”长期是安全事故。联调时可以临时关闭 hostname verification但不要跳过 CA 校验更不要写“信任所有证书”的 TrustManager。本工程没有信任所有证书而是仍然要求配置trust-certificates。误区 3https://就一定是普通 TLS不是。URL scheme 只是 HTTP 客户端入口。底层用普通 TLS 还是 TLCP取决于SSLContext和 socket 工厂。误区 4服务端证书和客户端证书是一回事不是。服务端证书服务端证明自己。客户端证书客户端证明自己。CA 证书客户端或服务端用来验证对方证书链。误区 5证书链过了业务就一定成功TLS/TLCP 只保证安全通道。业务层还可能因为路径、请求头、multipart 字段名、Content-Meta、鉴权参数失败。所以排错时要分层网络能通 ↓ TLCP 握手成功 ↓ HTTP 发出去了 ↓ 业务响应成功10. 本篇小结你现在应该能解释SSL 是旧名TLS 是现代安全传输协议HTTPS 是 HTTP over TLS。TLS 主要提供认证、保密性、完整性。证书链用于证明服务端身份TrustStore 表示“我信任谁”。KeyStore 表示“我是谁”只有双向认证时客户端才需要。Hostname Verification 是检查证书主体和访问地址是否匹配。国密 TLCP 在 Java 里需要 Kona 这类 Provider不能只靠默认 JDK。下一篇进入标准背景解释国际 TLS、RFC 8998 和中国 TLCP 到底是什么关系。

相关新闻