路线53让acme.sh加密通配符证书
如何使用acme.sh和AWS Route53从Lets Encrypt获取通配符TLS/SSL证书?
如何为Nginx或者Apache设置通配符以使用AWS Route53加密SSL?
对于通配符TLS/SSL证书,"让加密"接受的唯一质询方法是DNS质询以验证域所有权。
因此,我们需要Route53 AWS DNS API为我们的域添加/修改DNS。
本教程说明了如何使用在Linux或者类Unix系统上运行的Lets Encrypt客户端acme.sh生成通配符TLS/SSL证书。
设置Route 53的前提条件是使用acme.sh加密通配符证书
确保Nginx服务器已安装并正在运行。
例如:
$ sudo apt install nginx $ sudo yum install nginx
Apache用户可以运行以下命令:
$ sudo apt install apache2 $ sudo yum install httpd
步骤1创建一个新的AWS用户并获取Route 53的API访问密钥
您可以使用控制台添加用户并为Route53创建策略。
在此示例中,我将为我的AWS账户创建一个新的IAM用户,使用aws cli追加并分配策略。
获取与当前AWS账户关联的托管区域
首先,我们需要找出DNS区域ID。
如下运行aws命令以列出托管区域:
$ aws route53 list-hosted-zones
记下您的托管区域ID。
例如:
{ "HostedZones": [ { "Id": "/hostedzone/RANDOM_ID_HERE_1", "Name": "theitroad.org.", "CallerReference": "RISWorkflow-RD:473d5c18-2ca9-421b-b217-c40f9d90b976", "Config": { "Comment": "HostedZone created by Route53 Registrar", "PrivateZone": false }, "ResourceRecordSetCount": 2 }, { "Id": "/hostedzone/RANDOM_ID_HERE_2", "Name": "theitroad.com.", "CallerReference": "2BC89E0B-FB84-7FA0-8EA6-5A2D46189415", "Config": { "Comment": "theitroad forum DNS", "PrivateZone": false }, "ResourceRecordSetCount": 16 } ] }
创建一个名为route53.txt的新客户托管策略文件
使用您喜欢的文本编辑器(例如vim)创建严格的策略来更新Route53 DNS区域:
$ vim route53.txt
根据您的设置,将以下文本替换为" RANDOM_ID_HERE_2":
{ "Version": "2012-10-17", "Statement": [ { "Sid": "vim0", "Effect": "Allow", "Action": [ "route53:GetHostedZone", "route53:ChangeResourceRecordSets", "route53:ListResourceRecordSets" ], "Resource": "arn:aws:route53:::hostedzone/RANDOM_ID_HERE_2" }, { "Sid": "vim1", "Effect": "Allow", "Action": "route53:ListHostedZones", "Resource": "*" } ] }
在AWS中创建警察
文件route53.txt是当前文件夹(或者/path/to/route53.txt)中的JSON文档,该文件授予对名为" RANDOM_ID_HERE_2"的Amazon Route 53 DNS ID中的DNS区域的只读/写访问权限:
$ aws iam create-policy --policy-name le-route53-wildcard-dns-verification --policy-document file:///path/to/route53.txt
{ "Policy": { "PolicyName": "le-route53-wildcard-dns-verification", "PolicyId": "AQPAZ4PKKZL7RYIBYM6YI", "Arn": "arn:aws:iam::791914887124:policy/le-route53-wildcard-dns-verification", "Path": "/", "DefaultVersionId": "v1", "AttachmentCount": 0, "PermissionsBoundaryUsageCount": 0, "IsAttachable": true, "CreateDate": "2020-08-03T08:14:25+00:00", "UpdateDate": "2020-08-03T08:14:25+00:00" } }
请记下Arn。
创建一个名为route53-dns-verification的AWS IAM帐户
执行:
$ aws iam create-user --user-name route53-dns-verification
将名为arn:aws:iam :: 791914887124:policy/le-route53-wildcard-dns-verification的AWS策略分配给route53-dns-verification用户帐户
运行:
$ aws iam attach-user-policy \ --policy-arn 'arn:aws:iam::791914887124:policy/le-route53-wildcard-dns-verification' \ --user-name route53-dns-verification
为名为route53-dns-verification的IAM用户创建访问密钥
执行以下命令后,您需要记下AccessKeyId和SecretAccessKey。
为了确保您的AWS账户的安全性,秘密访问密钥仅在密钥和用户创建期间才可访问。
如果要再次访问它,必须保存该密钥。
如果密钥丢失,则可以删除关联用户的访问密钥,然后创建新密钥。
因此,将它们保存到文本文件中:
$ aws iam create-access-key --user-name route53-dns-verification
{ "AccessKey": { "UserName": "route53-dns-verification", "AccessKeyId": "AKIZY3PTTYXXXXXXXXXX", "Status": "Active", "SecretAccessKey": "58XYYYYYYYYYYYYYYYYYYYYYYYYgmdS", "CreateDate": "2020-08-03T08:47:29+00:00" } }
步骤2安装acme.sh客户端
获取Route53 API密钥后,现在设置acme.sh客户端。
因此,使用git命令克隆acme.sh存储库,然后使用su命令/sudo命令安装客户端。
$ cd /tmp/ $ git clone https://github.com/Neilpang/acme.sh.git $ sudo -i # touch /root/.bashrc # cd /tmp/acme.sh/ # acme.sh --install --accountemail your-email-id@domain-here
步骤3使用Route53 DNS为域请求新的通配符TLS证书
到目前为止,我们已经设置了Nginx/Apache,获得了Route54 API /访问密钥,现在是时候使用acme.sh来获取theitroad.com域的通配符证书了。
首先,使用export命令设置AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY,如下所示:
# export AWS_ACCESS_KEY_ID="AKIZY3PTTYXXXXXXXXXX" # export AWS_SECRET_ACCESS_KEY="58XYYYYYYYYYYYYYYYYYYYYYYYYgmdS"
最后,使用Route53 dns作为您的域的验证器,请求基于通配符的TLS/SSL证书。
确保使用域名替换theitroad.com:
# acme.sh --issue --dns dns_aws --ocsp-must-staple --keylength 4096 -d theitroad.com -d '*.theitroad.com'
抓取椭圆曲线加密(ECC/ECDSA)代替RSA证书:
# acme.sh --issue --dns dns_aws --ocsp-must-staple --keylength ec-384 -d theitroad.com -d '*.theitroad.com'
其中:
--issue
:颁发证书--dns dns_aws
:使用dns模式。在这种情况下,请使用AWS dns api。- -ocsp-must-staple:生成ocsp必须装订扩展。
- --keylength ec-384:将ECC/ECDSA的域密钥长度设置为ec-384。请注意,ec-521目前由Lets Encrypt公司提供。
- --keylength 4096:设置RSA的域密钥长度。
-d theitroad.com -d'* .theitroad.com'
:您要发行,续订或者吊销证书的域名。
您的Route 53 DNS API /访问密钥存储在/root/.acme.sh/account.conf文件中,我们可以使用cat命令或者grep命令查看它:
# cat /root/.acme.sh/account.conf # grep '_AWS_' /root/.acme.sh/account.conf
因此,请勿与任何人共享/root/.acme.sh/account.conf
文件。
步骤4配置Nginx HTTPS
确保使用openssl命令按如下所示创建Diffie-Hellman密钥交换文件:
# DOMAIN="www.theitroad.com" # mkdir -pv /etc/nginx/letsencrypt/${DOMAIN}/ # cd /etc/nginx/letsencrypt/${DOMAIN}/ # openssl dhparam -out dhparams.pem -dsaparam 4096
然后编辑您的Nginx配置文件或者虚拟域文件:
# vi /etc/nginx/vhosts.d/www.theitroad.com.conf
更新/编辑文件,如下所示:
# Port 80 config server { listen 80 default_server; # IPv4 listen [::]:80 default_server; # IPv6 server_name www.theitroad.com; access_log off; error_log off; root /var/www/html; return 301 https://$host$request_uri; } # Port 443 config server { listen 443 ssl http2; # IPv4 listen [::]:443 ssl http2; # HTTP/2 TLS IPv6 server_name www.theitroad.com; # domain name root /var/www/html; index index.html; # Set access and error log for this vhos access_log /var/log/nginx/www.theitroad.com_access.log; error_log /var/log/nginx/www.theitroad.com_error.log; # TLS/SSL CONFIG ssl_certificate /etc/nginx/ssl/letsencrypt/www.theitroad.com/www.theitroad.com.fullchain.cer; ssl_certificate_key /etc/nginx/ssl/letsencrypt/www.theitroad.com/www.theitroad.com.key; # ECC/ECDSA certificates (dual config) #ssl_certificate /etc/nginx/ssl/letsencrypt/www.theitroad.com/www.theitroad.com.fullchain.cer.ecc; #ssl_certificate_key /etc/nginx/ssl/letsencrypt/www.theitroad.com/www.theitroad.com.key.ecc; ssl_dhparam /etc/nginx/ssl/letsencrypt/www.theitroad.com/dhparams.pem; # A little bit of optimization ssl_session_timeout 1d; ssl_session_cache shared:theitroadSSL:10m; # TLS version 1.2 and 1.3 only ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # HSTS (ngx_http_headers_module is required) # ************************************************************************* # WARNING - Wrong headers can create serious problems. Read docs otherwise # all 3rd party scripts/ads won't load and in some case # browser won't work. Read docs @ https://developer.mozilla.org # ************************************************************************* add_header Strict-Transport-Security "max-age=63072000" always; add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Xss-Protection "1; mode=block" always; add_header Referrer-Policy strict-origin-when-cross-origin always; add_header Feature-policy "accelerometer 'none'; camera 'none'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; payment 'none'; usb 'none'" always; # *************************************************************************************************** # WARNING: The HTTP Content-Security-Policy response header allows sysadmin/developers # to control resources the user agent is allowed to load for a given page. # Wrong config can create problems for third party scripts/ad networks. Hence read the following url: # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy # **************************************************************************************************** add_header content-security-policy "default-src https://www.theitroad.com:443" always; # OCSP stapling # Verify chain of trust of OCSP response using Root CA and Intermediate certs ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/nginx/ssl/letsencrypt/www.theitroad.com/www.theitroad.com.fullchain.cer; # Replace with the IP address of your resolver resolver 8.8.8.8; }
步骤5安装证书
根据您的设置将颁发的证书安装到apache/nginx或者任何其他服务器。
确保按照您的Linux/Unix发行版替换/bin/systemctl reload nginx
:
# DOMAIN="www.theitroad.com" # CONFIG_ROOT="/etc/nginx/ssl/letsencrypt/$DOMAIN" # acme.sh -d "$DOMAIN" \ --install-cert \ --reloadcmd "/bin/systemctl reload nginx" \ --fullchain-file "${CONFIG_ROOT}/$DOMAIN.fullchain.cer" \ --key-file "${CONFIG_ROOT}/$DOMAIN.key" \ --cert-file "${CONFIG_ROOT}/$DOMAIN.cer"
如果还使用ECC证书,请安装它们:
# acme.sh -d "$DOMAIN" \ --ecc \ --install-cert \ --reloadcmd "/bin/systemctl reload nginx" \ --fullchain-file "${CONFIG_ROOT}/$DOMAIN.fullchain.cer.ecc" \ --key-file "${CONFIG_ROOT}/$DOMAIN.key.ecc" \ --cert-file "${CONFIG_ROOT}/$DOMAIN.cer.ecc"
步骤6测试您的Nginx设置
如果尚未打开Nginx服务器tcp端口443,请确保已打开。
例如,这是我们在Ubuntu或者Debian Linux上打开它的方法:
$ sudo ufw allow https comment 'Open all to access Nginx port 443'
打开浏览器并输入网址:
https://www.theitroad.com/
当然,我们可以访问SSL实验室来测试我们的TLS/SSL配置页面。
另一个选择是运行testssl.sh命令,如下所示:
$ testssl.sh --fast --parallel https://www.theitroad.com/
Lets Encrypt使用acme.sh和Route53 DNS发布的通配符SSL证书。