自签名 CA 证书
-
生成密钥
使用 128 位的 RSA 算法生成的密钥,4096 是密钥的长度,建议使用 4096 或以上的值且必须是 2 的整数次方。
openssl genrsa -out private.key 4096
-
生成 RSA 证书
openssl req -new -key private.key -out server.csr
在提示
Common Name
时,输入与通过浏览器访问您网站的 URL 完全相同的地址,如域名地址www.example.com
或者 IP 地址10.133.5.170
,如果服务器证书的Common Name
与站点名字不匹配的话,客户端的浏览器就会怀疑您的证书的真实性,而出现报错情况:Common Name (e.g. server FQDN or YOUR name) []:10.133.5.170
其余提示可以全部保留默认,直接回车即可。
-
签发证书
openssl req -x509 -days 365 -key private.key -in server.csr -out server.crt
-
查看证书详细信息
openssl x509 -noout -text -in server.crt
服务器部署 HTTPS
步骤:
- 安装 Apache2
- 开启 SSL 模块
- 配置 CA 证书路径
- 重启 Apache2 服务生效
sudo apt install -y apache2 ssl-cert # 安装 apache2, ssl-cert
sudo a2enmod ssl # 开启 ssl 模块
sudo a2ensite default-ssl.conf # 开启 default-ssl 站点
sudo systemctl restart apache2.service # 重启服务
完成这些步骤之后,可以在浏览器上输入 https://localhost 进行验证;也可以通过 netstat
命令查看是否已经开启了 https(443)
端口:
$ netstat -antulp | grep 443
...
tcp6 0 0 :::443 :::* LISTEN -
...
如果可以看到以上信息说明已经正确启用了 SSL 模块。
在 /etc/apache2/sites-enabled/default-ssl.conf
文件是关于秘钥部分的配置:
# A self-signed (snakeoil) certificate can be created by installing
# the ssl-cert package. See
# /usr/share/doc/apache2/README.Debian.gz for more info.
# If both key and certificate are stored in the same file, only the
# SSLCertificateFile directive is needed.
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
默认情况下,ssl-cert
的软件包带了一份自签名证书,我们需要重新配置 SSLCertificateFile
指定证书路径和 SSLCertificateKeyFile
指定私钥路径。default-ssl.conf
修改为:
# A self-signed (snakeoil) certificate can be created by installing
# the ssl-cert package. See
# /usr/share/doc/apache2/README.Debian.gz for more info.
# If both key and certificate are stored in the same file, only the
# SSLCertificateFile directive is needed.
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/private.key
在此之前需要将 server.crt
和 private.key
放入规定的位置,可以使用命令:
sudo cp server.crt /etc/ssl/certs
sudo cp private.key /etc/ssl/private
重新启动 Apache2 服务器让配置生效:
sudo systemctl restart apache2.service
客户端验证
-
将
server.crt
的内容追加到/etc/ssl/certs/ca-certificates.crt
后面; -
使用
curl
进行验证:curl -v https://10.133.5.170
-
正常情况下能够显示接收到的 html 内容,加入
-v
用于查看详细的过程信息:* Trying 10.133.5.170:443... * TCP_NODELAY set * Connected to 10.133.5.170 (10.133.5.170) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/certs/ca-certificates.crt CApath: /etc/ssl/certs * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * ALPN, server accepted to use http/1.1 * Server certificate: * subject: C=AU; ST=Some-State; O=Internet Widgits Pty Ltd; CN=10.133.5.170 * start date: Mar 29 08:12:13 2022 GMT * expire date: Mar 29 08:12:13 2023 GMT * common name: 10.133.5.170 (matched) * issuer: C=AU; ST=Some-State; O=Internet Widgits Pty Ltd; CN=10.133.5.170 * SSL certificate verify ok. > GET / HTTP/1.1 > Host: 10.133.5.170 > User-Agent: curl/7.68.0 > Accept: */*
可以看到 CAfile 签名证书是
/etc/ssl/certs/ca-certificates.crt
,CApath 目录是/etc/ssl/certs
。
Https 原理
客户端在接受到服务端发来的 SSL 证书时,会对证书的真伪进行校验,以浏览器为例说明如下:
- 首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验;
- 浏览器开始查找操作系统中已内置的受信任的证书发布机构 CA,与服务器发来的证书中的颁发者 CA 比对,用于校验证书是否为合法机构颁发;
- 如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的;
- 如果找到,那么浏览器就会从操作系统中取出颁发者 CA 的公钥,然后对服务器发来的证书里面的签名进行解密;
- 浏览器使用相同的 hash 算法计算出服务器发来的证书的 hash 值,将这个计算的 hash 值与证书中签名做对比;
- 对比结果一致,则证明服务器发来的证书合法,没有被冒充;
- 此时浏览器就可以读取证书中的公钥,用于后续加密了。
常见问题
-
浏览器显示
Warning: Potential Security Risk Ahead
- 点击
Advanced...
与Accept the Risk and Continue
按钮将证书加入到可信任的证书列表中
- 点击
-
执行
curl
命令时报错curl: (60) SSL certificate problem: self signed certificate
- 将
server.crt
的内容追加到/etc/ssl/certs/ca-certificates.crt
后面。
- 将
参考
开启apache2的ssl访问功能
HTTPS系列干货(一):HTTPS 原理详解
欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景