一、OpenSSL
1.1、OpenSSL 是什么
OpenSSL 是一个开源的安全套接层(SSL)和传输层安全(TLS)实现的软件库。它提供了各种加密算法、数字证书管理功能,以及用于安全通信的协议。OpenSSL 支持多种加密算法,包括对称加密(如 AES、DES)和非对称加密(如 RSA、DSA),以及哈希函数(如 SHA-256)。HTTPS 协议依赖于 SSL/TLS 加密来确保数据传输的安全性
1.2、Centos7 系统安装 OpenSSL
首先参考这里 更新yum源 。然后如下面所示, 安装 OpenSSL。
## 使用 yum方式安装OpenSSL
[root@keycloak2 ~]# yum install openssl -y
二、自签名证书
2.1、自签名证书是什么
自签名证书是指由自己签发的证书,而不是由受信任的证书颁发机构(CA)签发的。自签名证书通常用于测试环境,因为它们不需要花费,但在生产环境中可能会引起浏览器警告,因为它们没有被广泛信任。使用 OpenSSL 可以轻松生成自签名证书,通过以下三步实现:
1、生成私钥:使用 openssl genrsa 命令生成一个私钥文件。2、生成证书请求(CSR):使用 openssl req 命令生成一个证书请求文件。3、生成自签名证书:使用 openssl x509 命令将证书请求签名为自签名证书
2.2、工作原理
当客户端向服务器发起连接请求,并请求建立安全连接时,服务器会返回一个数字证书。客户端收到服务器的数字证书后验证证书的合法性,包括是否由CA签发、是否过期、证书的主题名称是否与访问的网站域名匹配等。如果数字证书被验证为有效,客户端和服务器之间就可以建立安全连接,开始在加密的通道上发送和接收数据,否则显示告警。
2.3、生成私钥和自签名证书
## 使用下面命令,生成私钥 (server.key) 和一个自签名证书 (server.crt)
## 使用时,将“你的应用名称”部分字样,替换成你希望的名字即可。
## 其中 365是证书有效期, /etc/pki/tls/private/ 和 /etc/pki/tls/certs/ 是推荐的存储路径
## 其他参数的含义见上面三个步骤中的说明## 生成RSA 私钥。在生成过程中需要你输入省份、城市、公司等一系列信息,可以一直回车不输入也可以根据实际情况输入即可。时刻谨记你是在生成“自签名”证书即可。
[root@keycloak2 ~]# openssl genrsa -out 你的应用名称.key 2048## 通过私钥生成证书签名请求(CSR文件)
[root@keycloak2 ~]# openssl req -new -key 你的应用名称.key -out 你的应用名称.csr## 使用CSR生成自签名证书
[root@keycloak2 ~]# openssl req -x509 -days 365 -newkey rsa:4096 -keyout /etc/pki/tls/private/你的应用名称.key -out /etc/pki/tls/certs/你的应用名称.crt -nodes -subj "/C=CN/ST=Beijing/L=Beijing/O=Example/CN=你的应用名称.example.com"
三、TLS证书
采用X.509标准的数字证书,用于在传输层建立加密通信通道。包含服务器公钥、主体标识信息和CA签名,支持ECDSA、RSA等加密算法
四、三者与Https 的关系
4.1、OpenSSL 与Https的关系
HTTPS 协议依赖于 SSL/TLS 协议来加密数据并确保数据传输的安全性,这意味着任何使用 HTTPS 的服务器都需要一个 SSL/TLS 证书来建立安全连接。
4.2、自签名证书与Https的关系
虽然自签名证书可以用于 HTTPS,但由于它们不被浏览器默认信任,因此会导致浏览器显示安全警告。同时使用自签名证书的 HTTPS 服务器可以加密数据,但用户需要手动信任该证书才能避免浏览器警告。
五、用法
简单的举两个例子
5.1、在NGINX 上的用法
## Nginx 配置文件
server {listen 443 ssl;server_name example.com;ssl_certificate /etc/pki/tls/certs/你的应用名称.crt;ssl_certificate_key /etc/pki/tls/private/你的应用名称.key;
}
5.2、在 SpringBoot 上的用法
通常,私钥或证书会放在 SpringBoot 项目的 src/main/resources/ 下
## SpringBoot 2.7.x以后,可以直接使用 pemg格式的私钥
## 在 application.yml 或 application.properties 上配置
server.port=8443
server.ssl.enabled=true
server.ssl.certificate=classpath:你的应用名称.crt
server.ssl.certificate-private-key=classpath:你的应用名称.key
## 但是在 SpringBoot 2.7.x之前的版本需要将 OpenSSL 工具生成的私钥转为 JKS或PKCS12格式 使用
## 转换PKCS12格式的方法如下,其中, --passout 参数是指定你的密码。如果不带这个参数,需要在命令执行过程中手动指定[root@keycloak2 ~]# openssl pkcs12 -inkey 你的应用名称.key -in 你的应用名称.crt -export -out 你的应用名称.p12 -passout pass:YourPassword## 然后在 application.yml 或者 application.properties 文件上配置
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:你的应用名称.p12
server.ssl.key-store-password=password
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=tomcat
5.3、在Tomcat 上的用法
通常,私钥或证书会放在 Tomcat 的 tomcat/conf/ 下。这里出现的password 就是在生成 p12格式文件过程中指定的密码。密码指定方法见上面 SpringBoot 的2.7.x 以前版本的那一步的说明。
## Tomcat 与 SpringBoot 2.7.x 之前版本的用法一样,要先将 秘钥转换为 PKCS12 格式后使用
## server.xml 中的配置
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"maxThreads="150" scheme="https" secure="true"keystoreFile="/usr/local/tomcat/conf/你的应用名称.p12" keystorePass="password"clientAuth="false" sslProtocol="TLS" />
六、几种格式证书的区别联系
6.1、.jks与 .p12格式对比
有的地方会让你在生成密钥时创建 keystore 格式文件(如jks文件)。这东西是Java特有的格式,主要用于存储私钥、证书和其他加密对象。它与PKCS12(即p12 文件) 的用法近似,后者是一种标准化的文件格式,用于存储私钥、证书和其他加密对象,它更中立,能被包括java、C++在内更多的语言支持,普适性更广泛。
而且jdk9之后,PKCS12成为Java的默认keystore格式,取代了JKS。因此本文使用的是 p12文件,而没有举 jks 文件的例子。
6.2、.crt、.key 与 .pem 以及 .p12 格式文件的区别联系
CRT文件:通常指证书文件,其扩展名可以是 .crt 也可以是 .pem。主要用于存储 SSL/TLS 证书。
KEY文件:通常指私钥文件,其扩展名可以是 .key 也可以是 .pem。主要用于与证书配对使用,用于加密和解密数据。
PEM文件:严格来说它与CRT、KEY文件不是同一维度的概念,它只是一种文本格式,使用 Base64 编码存储加密数据,其扩展名为 .pem。常用于 SSL/TLS 证书、SSH 密钥和 S/MIME 邮件加密。
.p12文件:也是一种二进制格式,用于存储证书、私钥和中间证书。其特点在于它更多用于 Windows 和 macOS 操作系统中。