部署https

想起之前跟踪Vault 8蜂巢Hive框架的时候,做了一个关于可信https的实验,记录一下。

理论知识

  1. 数字证书是一种网络上证明持有者身份的文件,同时还包含有公钥。证书的真伪需要一个验证方式,而验证方需要认同这种验证方式,以完成证书的颁发过程。一个https的站点需要和一个证书绑定,客户端通过维护一个“根受信任机构列表”完成站点的可信识别过程,而客户端是否信任这个站点的证书取决于客户端程序是否导入了证书颁发者的根证书。
  2. 以下证书生成过程基于openssl,它是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。我们应用它构造密钥并进行X.509证书伪造。
  3. X.509证书是一种通用的证书格式,符合ITU-T X.509国际标准,它主要包含三个文件:key,csr,crt。
    key是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密;
    csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名;
    crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息。
  4. 了解linux中Apache服务的相关知识,对其配置文件:/etc/apache2/sites-
    available/default-ssl.conf有基础的了解;了解linux下提供dns服务器的bind9服务相关配置。

实验过程

浏览器/服务器环境
服务器配置:apache2+bind9+openssl
证书颁发过程如下:concept

  1. 开启Apache2的SSL模块,详见/etc/apache2/sites-available/default-ssl.conf:
    1
    2
    # 开启SSL模块
    SSLEngine on

这段配置代码的作用是将我们生成的证书导入到网站中从而实现https安全访问。

  1. 首先生成一个私钥,用于对通信过程中数据的加解密;生成私钥后,创建证书签名请求并发送给证书颁发机构;证书颁发机构验证请求者的身份之后,出具签名证书。本实验通过openssl实现证书颁发过程。
    • 生成RSA密钥文件KEY。用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密。
    • 生成证书请求文件CSR,用于提交给证书颁发机构(CA)对证书签名。
    • 生成CA证书。前面提过X.509证书的认证者总是CA或由CA指定的人,所以得先生成CA的证书。
    • 生成自颁证书。用上一步生成的CA证书给自己颁发证书
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # 生成rsa私钥、2048位强度、密钥文件名server.key
      openssl genrsa -out server.key 2048
      # 生成请求文件。依次输入国家,地区,城市,组织,组织单位,Common Name和Email。
      # Common Name应该与域名保持一致,否则会引起浏览器警告。
      openssl req -new -key server.key -out server.csr
      # 生成CA证书 ca.crt是根证书
      openssl req -new -x509 -key server.key -out ca.crt -days 3650
      # 自颁证书。server.crt有证书持有人信息,持有人公钥以及签署者的签名等信息
      openssl x509 -req -days 3650 -in server.csr \
      -CA ca.crt -CAkey server.key \
      -CAcreateserial -out server.crt

至此,证书生成过程完成。分别生成如下文件

server.key 私钥
server.csr 证书请求文件
ca.crt CA证书
server.crt 自颁发的证书
最后,将生成的用于加解密的密钥和签署的自颁证书文件导入到Apache服务器配置文件/etc/apache2/sites-available/default-ssl.conf中

1
2
3
4
# 存放签署过的证书
SSLCertificateFile /etc/ssl/certs/server.crt
# 存放签署过的私钥
SSLCertificateKeyFile /etc/ssl/private/server.key
客户端

在浏览器“受信任的根证书颁发机构”中导入根证书文件ca.crt,实现https安全访问网站。
result