SSL证书
发布于2024-11-09 19:20:07,更新于2024-11-17 22:15:22,标签:java 文章会持续修订,转载请注明来源地址:https://meethigher.top/blog之前写的HTTP反向代理工具,在实际使用时,碰到反代失败的问题。跟踪了一下,才发现是由于对方使用了自签名SSL证书,导致发起HTTP请求时,验证失败。因此简单记录一下。
针对该问题的复现,从两个方面来展开
- 理解SSL
- 忽略SSL
一、理解SSL
1.1 HTTPS与SSL
SSL是用于加密传输的协议,也是最初的加密标准,目前已被TLS取代,但由于历史原因,大家还是会称为SSL。
HTTPS是HTTP上实现加密传输的协议,依赖SSL/TLS来确保安全性。
从不求甚解的角度来理解,HTTPS=HTTP+SSL/TLS
1.2 证书分类
SSL常见的证书分类有两种
- CA证书
- 自签名证书
这两者的区别如下
特性 | 自签名证书 | CA证书 |
---|---|---|
签发机构 | 由证书持有者自己签发 | 由受信任的证书颁发机构(CA)签发 |
信任级别 | 默认不被浏览器或操作系统信任,需手动安装信任 | 被大多数浏览器和操作系统默认信任 |
身份验证 | 无身份验证,持有者自行生成证书 | CA会对证书持有者进行身份验证 |
安全性 | 安全性较低,可能被伪造或滥用 | 高安全性,通过身份验证保障证书真实性 |
应用场景 | 适用于开发、测试和内部网络 | 适用于生产环境和面向互联网的服务 |
成本 | 免费 | 需要付费,费用根据证书类型和CA机构不同而异 |
浏览器警告 | 会弹出“不安全连接”警告 | 不会弹出警告,用户信任度高 |
管理复杂度 | 管理简单,但不适合公开环境 | 管理较复杂,需要向CA申请和续期 |
互联网服务使用的一般都是CA证书,由于操作系统已经内置了一系列根证书,当访问一个使用CA签发证书的HTTPS网站时,就不会出现“不安全连接”的警告。
而自签名证书,由于操作系统缺少对其的信任,访问就会被拦截了。此时服务提供方,需要给调用方提供自签名证书,以便调用方可以信任该连接。
1.3 OpenSSL生成自签名证书
1.3.1 扩展名说明
像我购买的CA证书,部署到Nginx时,一般都是.pem
和.key
文件。但在自己生成证书的过程中,发现还有.crt
文件。直观的感受是,这些扩展名特别的混乱。经过查阅资料,下面简单记录这些扩展名的区别。
- crt: 存储证书(公钥)。该证书可提供给第三方使用,比如HTTPS客户端
- key: 私钥。该私钥文件只应给服务提供者使用。
- csr: 向证书颁发机构申请签署密钥的请求,不包含密钥本身。
- pem: 基于Base64编码的文本格式。它可以是上述任何文件。
- der: 基于二进制编码的文本格式。它可以是上述任何文件。
参考
ssl - Difference between pem, crt, key files - Stack Overflow
Difference between .pem and .crt and how to use them - Help - Let’s Encrypt Community Support
1.3.2 自签名证书
下面使用OpenSSL生成自签名的公钥和私钥证书。
1 | # 生成一个2048位的RSA私钥,并保存到private.key文件中 |
二、忽略SSL
2.1 服务端部署证书
2.1.1 Nginx
以Nginx为例,部署证书
1 | worker_processes 1; |
2.1.2 Vertx
使用Java中的Vertx 4.5.10版本开启HTTPServer
1 | PemKeyCertOptions pemKeyCertOptions = new PemKeyCertOptions()//使用自签名证书开启ssl |
2.2 客户端忽略校验
2.2.1 CURL
curl忽略ssl校验比较简单,添加-k
参数即可。
1 | curl -k "https://10.0.0.10:443" |
2.2.2 Apache HttpPClient and OkHttpClient
设置忽略SSL的核心逻辑如下,具体的写法还需根据框架而定。
1 | /** |