# 相关命令

# htpasswd

:Apache 提供的一个命令行工具,用于生成密码的哈希值。

  • 安装:yum install httpd-tools
  • 用法:
    htpasswd [username] [password]
            # 关于哈希算法
            -d              # 采用 CRYPT 算法
            -B              # 采用 BCRYPT 算法。推荐采用该算法,更安全
            -m              # 采用 MD5 算法(默认)
            -s              # 采用 SHA-1 算法
            -2              # 采用 SHA-256 算法
            -5              # 采用 SHA-512 算法
    
            # 关于输入
            -b <password>   # 通过命令参数输入密码。否则默认通过终端提示输入密码
            -i              # 从 stdin 读取密码
    
            # 关于输出
            -c <file>       # 创建密码文件,如果该文件已存在则会被覆盖
            -D <username>   # 从文件中删除一个用户
            -v <username>   # 验证一个用户的密码
            -n              # 将加密结果输出到 stdout ,而不是文件
    
  • 例:
    [root@CentOS ~]# htpasswd -Bbn root 123456          # 生成密码的哈希值
    root:$2y$05$8kv1HZMemYkavceQmrRC5umW6YJJokbixvgQn2sBsb.zrGBnxKs8O
    
    [root@CentOS ~]# htpasswd -Bbc passwd root 123456   # 创建密码文件 passwd ,添加一个用户及密码的哈希值
    Adding password for user root
    [root@CentOS ~]# htpasswd -Bb  passwd admin 123456  # 再添加一个用户。如果该用户名已存在,则会覆盖其密码的哈希值
    Updating password for user admin
    [root@CentOS ~]# htpasswd -B   passwd admin         # 再添加一个用户,默认通过终端提示输入密码
    New password:
    Re-type new password:
    Adding password for user admin
    [root@CentOS ~]# cat passwd                         # 查看密码文件
    root:$2y$05$DqIV6YHZ9Sw/UkpNFPTXFOW.DB2NmpEdhdzZO2GJkZ5FpEt.h7k3W
    admin:$2y$05$F9euMbpa.FNwOIJUcitzRu2k7oBv.3gmWG.eDmusFpsfskTe7Vj2i
    [root@CentOS ~]# htpasswd -D passwd admin           # 删除一个用户
    Deleting password for user admin
    

# OpenSSL

:一个关于 SSL 的开源工具包。

  • 常用于生成 SSL 证书,或被客户端、服务器用于 SSL 握手。
  • 例:生成 SSL 私钥和自签名证书
    openssl
            req -x509           # 生成自签名的数字证书,采用 X.509 标准
            -days 365           # 证书的有效期
            -newkey rsa:2048    # 使用新生成的密钥
            -nodes              # no DES ,生成 key 文件时不加密
            -keyout cert.key    # 保存私钥到指定文件
            -out cert.crt       # 保存证书到指定文件
    
    • 浏览器通常不会承认自签名证书,会警告该网站不安全。

# ACME

  • letsencrypt.org :一个 CA 网站,可以免费申请数字证书。
  • ACME(Automatic Certificate Management Environment):一个网络协议,用于向 CA 申请、续订、撤销证书。
    • 最初是为 letsencrypt.org 设计的,后来也支持其它 CA 。
    • 2016 年发布 API v1 。
    • 2018 年发布 API v2 ,支持通配符域名。

# Certbot

:一个命令行工具,作为 ACME 客户端。

  • GitHub (opens new window)

  • 用户需要证明自己对域名拥有控制权,该过程称为 challenge ,主要有两种方式:

    • HTTP :将域名绑定到一个网站,监听 80 端口,并在 URL /.well-known/acme-challenge/ 下提供一个指定文件。
    • DNS :添加一个 TXT 类型的 DNS 记录,将子域名 _acme-challenge.<domain> 解析到指定字符串。
      • 使用 DNS 插件时,会调用 DNS 服务器的 API ,从而自动进行验证。
      • 通配符域名只能通过 DNS 方式申请证书。
  • 证书的有效期默认为 90 天。

    • 为了刷新有效期,可以重新创建证书,或续订。
    • 通过 --manual 方式申请的证书,不能自动续订,需要重新申请。
  • 命令:

    certbot
            # 申请证书
            run                 # 默认执行该操作,会自动申请证书并安装
            certonly            # 只是获取证书,保存到本机,不会安装
            -d <domain>         # 指定要申请证书的域名。可以多次使用该选项,指定多个域名
            --email <xx>        # 填写申请人的 email
    
            # 证明域名控制权的几种方式
            --nginx             # 发现本机的 Nginx 服务器,自动修改配置文件,进行验证
            --standalone        # 运行一个简单的 HTTP 服务器。这需要暂时停止原网站
            --webroot -w /www/  # 指定网站的静态目录,自动创建验证文件
            --manual --preferred-challenges=dns  # 手动添加 DNS 记录
            --dns-goole         # 调用 Goole 云平台的 DNS 插件
    
            # 关于 certbot 的配置
            --dry-run           # 向 CA 测试服务器发出请求,从而模拟执行命令
            --config-dir  /etc/letsencrypt
    
            # 其它操作
            certificates        # 列出本机存放的证书
            renew               # 续订有效期不足 30 天的所有证书
            revoke              # 撤销证书
            delete              # 删除本机存放的证书
    
  • 例:

    1. 使用 Nginx 部署网站,在配置文件中加入一个路由:
      location /.well-known/acme-challenge/ {
          root  /certbot/www;
      }
      
    2. 运行 Certbot 的 Docker 镜像:
      docker run -it --rm \
          -v $PWD/certbot/www:/www \
          -v $PWD/certbot/etc:/etc/letsencrypt \
          certbot/certbot:v1.20.0 \
          certonly --webroot -w /www -d test.com --email xxx
      
      • 申请的证书会保存在配置目录下。
    3. 修改 Nginx 配置,使用证书,提供 HTTPS 服务:
      server {
          listen    443  ssl;
          ssl_certificate /certbot/etc/fullchain.pem;
          ssl_certificate_key /certbot/etc/privkey.pem;
      }
      
    4. 增加一个 crontab 定时任务,定期续订证书:
      0 1 * * 1  docker run -i --rm -v /data/certbot/www:/www -v /data/certbot/etc:/etc/letsencrypt certbot/certbot:v1.20.0 renew &>> /var/log/cron
      0 2 * * 1  docker exec -i nginx nginx -s reload &>> /var/log/cron       # 让 Nginx 重新读取 ssl 文件
      

# acme.sh

:一个 shell 脚本,作为 ACME 客户端,与 Certbot 类似。

  • GitHub (opens new window)
  • 为很多种 DNS 服务商提供了对接插件。
  • 例:通过 HTTP 方式申请证书
    docker run -it --rm \
        -v $PWD/acme:/acme \
        neilpang/acme.sh:3.0.1 \
        --issue -d test.com --webroot /www/
    
  • 例:通过阿里云 DNS 申请证书
    1. 到阿里云插件 API 密钥,声明为环境变量:
      export Ali_Key="******"
      export Ali_Secret="******"
      
    2. 申请证书:
      docker run -it --rm \
          -v $PWD/acme:/acme \
          neilpang/acme.sh:3.0.1 \
          --issue --dns dns_ali -d test.com -d *.test.com