文章目录
- 自签名 CA 证书
- 服务器部署 HTTPS
- 客户端验证
-
- 常见问题
- 参考
自签名 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
sudo a2enmod ssl
sudo a2ensite default-ssl.conf
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
文件是关于秘钥部分的配置:
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
默认情况下,ssl-cert
的软件包带了一份自签名证书,我们需要重新配置 SSLCertificateFile
指定证书路径和 SSLCertificateKeyFile
指定私钥路径。default-ssl.conf
修改为:
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 (
* 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 原理详解
欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)