Apache和HTTPS证书的生成与安装
摘要
介绍linux系统下使用openssl生成https证书,并将证书安装在apache服务器上,最终实现通过https访问服务器。这个过程涉及到openssl生成自签名证书(适用于测试环境),修改apache配置,开放防火墙https端口等过程。
生成自签名证书
此小节引用自 https://blog.csdn.net/charlesfromcn/article/details/108509564
-
首先使用
yum
完成openssl的安装
yum install -y mod_ssl
-
安装完成后选择合适的目录作为证书保存地,生成根证书的私钥(CA证书的RSA密钥,PEM格式),执行命令:
openssl genrsa -des3 -out server.key 2048
- 如果需要设置密码,则可以随便输入数字:1234
- 证书中的国家、省份、城市等附件信息可以自定以填写,例如国家CN、省份SC等等
-
openssl调用此文件会经常要求输入密码,如果想去除此输密码的步骤,可以执行命令:
openssl rsa -in server.key -out server.key
-
生成证书签署请求,(创建服务器证书的申请文件server.csr), 执行命令:
openssl req -new -key server.key -out server.csr
-
生成自签证书,即根证书CA(有效期为十年的),执行命令:
openssl req -new -x509 -key server.key -out ca.crt -days 3650
-
创建服务器证书(有效期十年):
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt
通过以上步骤,即可在当前工作目录生成证书相关文件
# tree
.
├── ca.crt
├── ca.srl
├── server.crt
├── server.csr
└── server.key
接下来进行证书的安装,以apache服务器为例
Apache服务器ssl证书的安装
通过修改conf配置将证书安装至apache服务器,主要为以下几步:
- 找到apache服务器自带的ssl配置conf文件,一般在以下位置
/etc/httpd/conf.d/ssl.conf
- 使用
vim
命令编辑conf文件,编辑ssl.conf 文件里的证书路径
指定.crt
和.key
文件的位置
# 将 SSLCertificateFile 指向一个 PEM 编码的证书。如果证书被加密了,那么系统会提示你输入一个密码短语。请注意,重启 httpd 服务时会再次提示输入密码。记住,如果你同时拥有 RSA 和 DSA 证书,
# 你可以同时配置它们(以便也允许使用 DSA 密码套件等)。
# 一些 ECC 密码套件(http://www.ietf.org/rfc/rfc4492.txt)需要一个 ECC 证书,这个证书也可以同时配置。
SSLCertificateFile /etc/httpd/xxx.crt
# 服务器私钥:
# 如果私钥没有与证书合并在一起,请使用此指令指向私钥文件。请记住,如果你同时拥有 RSA 和 DSA 私钥,你可以同时配置它们(以便也允许使用 DSA 密码套件等)。
# 当使用 ECC 密钥时,也可以同时配置它们。
SSLCertificateKeyFile /etc/httpd/xxx.key
配置完成后重启服务器
systemctl restart httpd
防火墙开启https端口
服务器启动后,还需开启https默认端口443
,否则服务器无法通过外部访问到URL地址
- 检查防火墙监听状态
firewall-cmd --list-all
显示以下信息
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client mdns ssh
ports: 80/tcp 443/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
注:
target: default
这指定了规则的目标行为,default通常意味着使用防火墙的默认策略。
icmp-block-inversion: no
这表示不反转ICMP阻塞规则。通常,icmp-block用于阻止ICMP(Internet Control Message Protocol)消息,而icmp-block-inversion可能用于指示是否要反转这个阻塞行为。在这里,no表示不反转,即保持默认的ICMP阻塞行为(如果有的话)。
interfaces: ens33
这指定了规则适用的网络接口,ens33是网络接口的名称。
sources:
这个字段后面没有值,通常用于指定规则的源地址或地址范围。在这里,它可能是空的,意味着规则适用于所有源地址。
services: dhcpv6-client mdns ssh
这指定了规则允许的服务,dhcpv6-client(DHCPv6客户端服务)、mdns(多播DNS,也称为mDNSResponder或Avahi,用于局域网内的服务发现)和ssh(安全外壳协议,用于远程登录)。
ports: 80/tcp 443/tcp
这指定了规则允许的TCP端口,80通常用于HTTP,443用于HTTPS。
protocols:
这个字段后面没有值,通常用于指定允许或阻止的网络协议(如TCP、UDP等)。在这里,它可能是空的,或者意味着规则适用于所有协议(但这取决于防火墙的具体实现和上下文)。
forward: yes
这表示启用端口转发。
masquerade: no
不启用某种形式的地址伪装或转换。
forward-ports:
这个字段后面没有值,通常用于指定端口转发规则。在这里,它可能是空的,意味着没有定义具体的端口转发规则。
source-ports:
这个字段后面没有值,通常用于指定规则的源端口。在这里,它可能是空的,意味着规则适用于所有源端口。
icmp-blocks:
这个字段后面没有值,通常用于指定要阻塞的ICMP消息类型。在这里,它可能是空的,意味着没有定义具体的ICMP阻塞规则。
rich rules:
这个字段后面没有值,但在Firewalld中,rich rules允许定义复杂的规则,这些规则可以包含多个条件和动作。它们通常用于实现更精细的控制,比如基于源/目标地址、端口、协议、时间等的规则。在这里,字段是空的,意味着没有定义具体的rich rules。
- 如果
443
端口没有开放,则需要通过以下命令开放端口
firewall-cmd --add-port 443/tcp --permanent
firewall-cmd --reload
通过以上步骤,则完成了https防火墙的开放
小结
启动服务器后,使用https访问 https://xxx.xxx.xxx.xxx,如果成功,则说明配置正确,如果失败,则查询服务器日志/var/log/httpd
和防火墙日志/var/log/firewalld