在Linux系统中,HTTPS与CA(Certificate Authority,证书颁发机构)密切相关,主要涉及到以下几个方面:
-
HTTPS简介:
- HTTPS(HyperText Transfer Protocol Secure)是HTTP的安全版本,通过使用SSL/TLS协议进行加密通信,确保数据在传输过程中的保密性和完整性。HTTPS协议使用SSL/TLS证书来验证服务器的身份和加密通信内容。
-
SSL/TLS证书:
- SSL/TLS证书由证书颁发机构(CA)颁发,用于验证服务器的身份。每个证书包含服务器的公钥,并包含了证书颁发机构的数字签名,以确保证书的真实性和有效性。证书通常包含服务器的主机名(域名),以及其他关键信息。
-
证书颁发机构(CA):
- 证书颁发机构是受信任的第三方机构,负责验证服务器的身份并颁发SSL/TLS证书。常见的公共CA包括Symantec(现为DigiCert)、GlobalSign、Let's Encrypt等。Linux系统中通常会预安装一些公共CA的根证书,以便系统和应用程序可以验证这些颁发机构签发的证书。
-
在Linux中配置HTTPS服务:
- 如果你在Linux服务器上配置HTTPS服务,通常需要进行以下步骤:
- 获取SSL/TLS证书:可以自签名证书或购买公共CA颁发的证书。
- 配置Web服务器(如Apache或Nginx):编辑相应的配置文件,指定SSL证书的路径和其他参数。
- 启用SSL模块:确保服务器已启用SSL/TLS支持的模块。
- 配置虚拟主机:确保每个HTTPS站点都有正确的SSL配置。
- 如果你在Linux服务器上配置HTTPS服务,通常需要进行以下步骤:
-
证书管理工具:
- 在Linux系统中,常用的证书管理工具包括
openssl
命令行工具。openssl
可以用于生成自签名证书、请求证书签名、查看和验证证书、配置SSL参数等。
- 在Linux系统中,常用的证书管理工具包括
通过了解这些基础概念和步骤,你可以在Linux环境下有效地配置和管理HTTPS服务,确保安全地传输数据和保护用户隐私。
openssl
是一个强大的开源命令行工具,用于执行各种与SSL/TLS和加密相关的操作。在Linux系统中,它通常预装并广泛用于生成证书、管理密钥、进行加密解密操作以及测试SSL/TLS连接。以下是一些常见的openssl
命令和用途:
1、生成自签名证书:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
// 这个命令生成一个自签名的SSL/TLS证书,包括私钥(server.key)和公钥证书(server.crt)。
2、生成证书签名请求(CSR):
openssl req -out server.csr -new -newkey rsa:2048 -nodes -keyout server.key
// 生成一个证书签名请求(CSR),用于向证书颁发机构(CA)请求签发证书。
3、查看证书信息:
openssl x509 -in server.crt -text -noout
// 查看证书文件(server.crt)的详细信息,包括颁发者、有效期、公钥等。
4、生成RSA密钥对:
openssl genpkey -algorithm RSA -out private.key -aes256
// 生成一个RSA密钥对,私钥保存在private.key文件中,并使用AES256进行加密。
5、加密和解密文件:
openssl enc -aes-256-cbc -salt -in file.txt -out file.enc
openssl enc -d -aes-256-cbc -in file.enc -out file.txt
// 使用AES-256-CBC算法加密和解密文件。
6、测试SSL/TLS连接:
openssl s_client -connect example.com:443
// 连接到指定的HTTPS服务器(example.com),显示服务器证书和SSL/TLS握手信息。
7、验证证书链:
openssl verify -CAfile ca-certificates.crt server.crt
// 验证服务器证书(server.crt)是否由指定的根证书(ca-certificates.crt)链中的任何一个签名。
8、生成DH参数:
openssl dhparam -out dhparam.pem 2048
// 生成Diffie-Hellman(DH)参数,用于在SSL/TLS握手中进行密钥交换。
openssl
命令有很多功能和选项,可以执行更复杂的操作,如创建PKCS#12文件、生成各种加密散列、签名和验证数据等。在使用openssl
时,要确保理解命令的含义和参数选项,以免造成意外的安全风险或错误操作。
1、实验准备:两台linux虚拟机,一台用作web主机,另一台用作ca签发服务器
注:未部署DNS服务器,就把两台主机的/etc/hosts记录修改一下
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.30 web
192.168.100.40 ca
保存退出后测试两台主机是否能够ping通
[root@web ~]# ping ca
PING ca (192.168.100.40) 56(84) bytes of data.
64 bytes from ca (192.168.100.40): icmp_seq=1 ttl=64 time=0.160 ms
64 bytes from ca (192.168.100.40): icmp_seq=2 ttl=64 time=0.172 ms
[root@ca ~]# ping web
PING web (192.168.100.30) 56(84) bytes of data.
64 bytes from web (192.168.100.30): icmp_seq=1 ttl=64 time=0.136 ms
64 bytes from web (192.168.100.30): icmp_seq=2 ttl=64 time=0.266 ms
2、正式开始前两台主机均需做一下时钟同步!!!
[root@web ~]# yum -y install chrony
[root@ca ~]# systemctl restart chronyd
[root@ca ~]# systemctl enable chronyd
[root@ca ~]# hwclock -w
[root@ca ~]# timedatectl
Local time: Mon 2024-08-05 11:38:47 CST
Universal time: Mon 2024-08-05 03:38:47 UTC
RTC time: Mon 2024-08-05 03:38:46
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes // 此处如为no则需重复上述操作,直到此处为yes
NTP service: active
RTC in local TZ: no
3、检查ca端是否已安装openssl
[root@ca ~]# rpm -q openssl
openssl-3.0.7-27.el9.x86_64
// 如未安装,输入yum -y install openssl安装一遍
4、编辑查看openssl加密协议配置文件
[root@ca ~]# cd /etc/pki/
[root@ca pki]# ls
ca-trust java rpm-gpg rsyslog tls
[root@ca pki]# cd tls/
[root@ca tls]# ls
cert.pem certs ct_log_list.cnf fips_local.cnf misc openssl.cnf openssl.d private
[root@ca tls]# vim openssl.cnf // 配置文件
[ CA_default ]
dir = /etc/pki/CA // CA服务工作目录
certs = $dir/certs // 存放证书目录
crl_dir = $dir/crl // 存放证书吊销列表(CRL)的目录
database = $dir/index.txt // CA服务的数据库文件
new_certs_dir = $dir/newcerts // 存放新颁发证书的目录
certificate = $dir/cacert.pem // CA的根证书文件路径
serial = $dir/serial // 存放证书序列号的文件路径
crlnumber = $dir/crlnumber // 存放CRL序列号的文件路径,
crl = $dir/crl.pem // 生成的CRL文件路径
private_key = $dir/private/cakey.pem // CA的私钥文件路径
x509_extensions = usr_cert // 指定颁发用户证书的X.509扩展
name_opt = ca_default // 默认的名称选项
cert_opt = ca_default // 默认的证书选项
5、查看配置文件所指向目录的路径,如无此目录或文件则需自行创建
[root@ca pki]# mkdir CA
[root@ca pki]# ls
CA ca-trust java rpm-gpg rsyslog tls
[root@ca pki]# cd CA/
[root@ca CA]# mkdir certs
[root@ca CA]# mkdir crl
[root@ca CA]# touch index.txt
[root@ca CA]# mkdir newcerts
[root@ca CA]# touch serial
[root@ca CA]# mkdir private
[root@ca CA]# ls
certs crl index.txt newcerts private serial
6、在主机CA上为主机CA生成私钥
[root@ca CA]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem)
[root@ca CA]# cd /etc/pki/CA/private/
[root@ca private]# ls
cakey.pem
7、在主机CA上为主机CA生成自签名证书
[root@ca private]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
openssl: openssl工具的命令行接口。
req: 表示执行证书请求操作。
-new: 表示生成一个新的证书请求或证书。
-x509: 表示生成自签名的 X.509 证书。
-key: 指定用于生成证书的私钥文件的路径
-out: 指定生成的证书文件的输出路径和文件名
-days: 指定证书的有效期,这里是 365 天。
Country Name (2 letter code) [XX] : CN
State or Province Name (full name) [] : BEIJING
Locality Name (eg, city) [Default City] : BEIJING
Organization Name (eg, company) [Default Company Ltd] : TXKJ
Organizational Unit Name (eg, section) [] : INFORMATION
Common Name (eg, your name or your server's hostname) []:ca. example. com
Email Address []: root@example.com
-----------------------------------------------------------------------------------------
Country Name (2 letter code) [XX]: 国家或地区代码,一般使用 ISO 3166-1 规定的两个字母代码表示
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) []: 通用名称,一般用于标识证书的实体,可以是个人名字或者服务器的主机名。
Email Address []: 电子邮件地址。
8、导入初始序列号
[ root@ca CA]# echo 01 > serial
[ root@ca CA]# cat serial
01
9、在主机WEB上为主机WEB生成私钥,并将私钥存放在/etc/httpd/ssl目录中
[root@web httpd]# mkdir ssl
[root@web httpd]# (umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key)
[root@web httpd]# cd ssl/
[root@web ssl]# ls
httpd.key
10、在主机WEB上为web.example.com站点生成签署请求文件
openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
Country Name (2 letter code) [XX] : CN
State or Province Name (full name) [] :BEIJING
Locality Name (eg, city) [Default City] :BEIJING
Organization Name (eg, company) [Default Company Ltd]:TXKJ
Organizational Unit Name (eg, section) [ ] : INFORMATION
Common Name (eg, your name or your server's hostname) []:web. example. com
Email Address [] : root@example. com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
11、在主机web上将签署请求文件通过可靠方式发送给CA服务器
scp httpd.csr root@ca.example.com:/etc/pki/CA/
12、在主机CA上对签署请求进行数字签名,并指明所生成的Web证书的存放路径
13、在主机WEB上将CA主机上已经数字签名后的Web证书下载下来
scp root@ca.example.com:/etc/pki/CA/certs/httpd.crt /etc/httpd/ssl/
14、在主机WEB上安装apche http扩展模块mod_ssl
yum -y install mod_ssl
15、修改主配置文件vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
16、部署https站点
vim /etc/httpd/conf.d/httpd-vhosts.conf
<VirtualHost 192.168.100.30:443>
DocumentRoot "/var/www/html"
ServerName web.example.com
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
</VirtualHost>
17、重启httpd服务
[root@web ~]# systemctl restart httpd
[root@web ~]# systemctl enable httpd
[root@web ~]# cd /var/www/html/
[root@web html]# ls
[root@web html ]# echo 123 > index.html
[root@web html ]# cat index.html
123
[root@web html]#
18、到图形化页面验证,时钟同步
19、将DNS指向web服务器IP地址,并尝试能否Ping通CA服务器
20、在客户端上去下载CA服务器上的根证书
21、在浏览器中找到设置选项,将证书导入
验证
访问成功