# 相关命令
# 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 客户端。
用户需要证明自己对域名拥有控制权,该过程称为 challenge ,主要有两种方式:
- HTTP :将域名绑定到一个网站,监听 80 端口,并在 URL
/.well-known/acme-challenge/
下提供一个指定文件。 - DNS :添加一个 TXT 类型的 DNS 记录,将子域名
_acme-challenge.<domain>
解析到指定字符串。- 使用 DNS 插件时,会调用 DNS 服务器的 API ,从而自动进行验证。
- 通配符域名只能通过 DNS 方式申请证书。
- HTTP :将域名绑定到一个网站,监听 80 端口,并在 URL
证书的有效期默认为 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 # 删除本机存放的证书
例:
- 使用 Nginx 部署网站,在配置文件中加入一个路由:
location /.well-known/acme-challenge/ { root /certbot/www; }
- 运行 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
- 申请的证书会保存在配置目录下。
- 修改 Nginx 配置,使用证书,提供 HTTPS 服务:
server { listen 443 ssl; ssl_certificate /certbot/etc/fullchain.pem; ssl_certificate_key /certbot/etc/privkey.pem; }
- 增加一个 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 文件
- 使用 Nginx 部署网站,在配置文件中加入一个路由:
# 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 申请证书
- 到阿里云插件 API 密钥,声明为环境变量:
export Ali_Key="******" export Ali_Secret="******"
- 申请证书:
docker run -it --rm \ -v $PWD/acme:/acme \ neilpang/acme.sh:3.0.1 \ --issue --dns dns_ali -d test.com -d *.test.com
- 到阿里云插件 API 密钥,声明为环境变量: