Apache2 配置 HTTPS

文章目录

    • 自签名 CA 证书
    • 服务器部署 HTTPS
    • 客户端验证
      • 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    # 安装 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.crtprivate.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.crtCApath 目录是 /etc/ssl/certs

Https 原理

客户端在接受到服务端发来的 SSL 证书时,会对证书的真伪进行校验,以浏览器为例说明如下:

  1. 首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验;
  2. 浏览器开始查找操作系统中已内置的受信任的证书发布机构 CA,与服务器发来的证书中的颁发者 CA 比对,用于校验证书是否为合法机构颁发;
  3. 如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的;
  4. 如果找到,那么浏览器就会从操作系统中取出颁发者 CA 的公钥,然后对服务器发来的证书里面的签名进行解密;
  5. 浏览器使用相同的 hash 算法计算出服务器发来的证书的 hash 值,将这个计算的 hash 值与证书中签名做对比;
  6. 对比结果一致,则证明服务器发来的证书合法,没有被冒充;
  7. 此时浏览器就可以读取证书中的公钥,用于后续加密了。

常见问题

  1. 浏览器显示 Warning: Potential Security Risk Ahead

    • 点击 Advanced...Accept the Risk and Continue 按钮将证书加入到可信任的证书列表中
  2. 执行 curl 命令时报错 curl: (60) SSL certificate problem: self signed certificate

    • server.crt 的内容追加到 /etc/ssl/certs/ca-certificates.crt 后面。

参考

开启apache2的ssl访问功能
HTTPS系列干货(一):HTTPS 原理详解

欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景

你可能感兴趣的:(git,gitignore,https)