Ubuntu 서버 16.04 VPS 및 Nginx가 있습니다. 지금은 HTTP1(TLS 없음, 포트 80 사용)을 구현하고 있지만 모든 (Wordpress) 사이트에 대해 "한 단계 더 나아가" HTTP2(TLS 사용, 포트 443 사용)를 사용하고 싶습니다.
내 환경을 다음과 같이 조정한다고 가정해 보겠습니다.
1. 방화벽
ufw app list # Choose Nginx HTTPS
2. 서버 블록
기본 서버 블록
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name server_domain_or_IP;
return 302 https://$server_name$request_uri;
}
server {
# SSL configuration
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
}
사이트 서버 블록당
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
root /var/www/html/example.com;
index index.php index.html index.htm index.nginx-debian.html;
example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
이제 OpenSSL 인증서를 생성하고 Let'sEncrypt를 사용하여 서명한 후 각 사이트 디렉터리와 개별적으로 연결해야 합니다.
내 질문:
터미널 내에서 가능한 한 자동으로 OSSL 인증서, LE 토큰 및 SDIR 연결을 생성하려면 어떻게 해야 합니까? 물론 내 이메일로 도메인을 확인해야 하는 부분도 있지만 그 외에 AFAIU는 모든 것이 터미널에서 이루어지므로 완전 자동화가 가능하다.
make
이를 달성하는 데 도움이 되는 Bash 스크립트 코드(또는 GNU와 같은 특정 유틸리티 활용)의 예를 공유할 수 있습니까?
노트
나는 도킹이 없는 솔루션을 겸손하게 선호합니다(나는 여기를 읽었다사실, 이는 도커를 구현하는 것처럼 보이는 업데이트와 관련이 있는데, 10개 미만의 소규모 사이트가 있는 소규모 개인 서버에 대해 최소한의 방식으로 수행할 의도는 없습니다.
나는 생성, 서명 및 사이트 디렉터리 연결에는 갱신과 다른 알고리즘이 필요하다는 것을 이해합니다. 내가 요구하는 것은 창작, 서명, 연관뿐이다.
내가 아직도 이런 질문을 하는 이유는 다음과 같습니다.
글쎄요, 저는 자체 관리형 최소 VPS(커널/셸 사용자 정의 없음, 컴파일 없음, 기여 유틸리티 없음)에서 HTTP2를 사용하고 싶습니다. 그리고 저에게는 이 알고리즘을 많은 사이트에 대해 또는 매번 수동으로 추가하는 것이 미친 것 같습니다. 새로운 사이트.
답변1
사용 dehydrated
(https://github.com/lukas2511/dehydration).
/.well-known/acme-challenge/
Let's Encrypt 서비스는 이 위치 아래의 챌린지 응답을 보고 귀하가 인증서를 요청한 사이트의 소유자인지 확인하므로 각 사이트에 대한 위치를 추가 해야 합니다 .
location /.well-known/acme-challenge/ { allow all; root /st/hosting/hamilton/htdocs; }
탈수 구성에서도 동일한 경로를 사용합니다.
egrep -v "^#|^[[:space:]]*$" config
WELLKNOWN="/st/hosting/hamilton/htdocs/.well-known/acme-challenge"
CONTACT_EMAIL=<you@email>
그런 다음 모든 도메인을 domain.txt
파일에 넣으세요. 각 줄에서 첫 번째 도메인은 CommonName
이고 다른 이름은 가 됩니다 AlternativeNames
. 예를 들면 다음과 같습니다.
head -n1 domains.txt
hamilton.rinet.ru jenkins.hamilton.rinet.ru munin.hamilton.rinet.ru
그런 다음 cron을 입력 dehydrated -c
하고 다음과 같은 스크립트를 사용하여 새로 생성된 인증서를 설치해야 합니다.
#!/bin/sh
CERTS_DIR=/usr/local/etc/dehydrated/certs
NGINX_SSL=/usr/local/etc/nginx/ssl
DOMAINS=$(awk '{ print $1 }' /usr/local/etc/dehydrated/domains.txt)
for d in $DOMAINS; do
short_d=${d%%.rinet.ru}
short_d=${short_d%%.ru}
# short_d=${short_d##www.}
cp -v ${CERTS_DIR}/$d/fullchain.pem ${NGINX_SSL}/${short_d}.crt
cp -v ${CERTS_DIR}/$d/privkey.pem ${NGINX_SSL}/${short_d}.key
done
# Also update certs for Dovecot
cp -v ${CERTS_DIR}/hamilton.rinet.ru/fullchain.pem /usr/local/etc/dovecot/certs/certs/server.crt
cp -v ${CERTS_DIR}/hamilton.rinet.ru/privkey.pem /usr/local/etc/dovecot/certs/private/server.key
답변2
먼저 몇 가지를 확인해 보겠습니다.LetsEncrypt 클라이언트. 특히 Nginx에 대해 나열된 것입니다. 처음에는 LE 서명 인증서를 사용하기를 원하기 때문에 바퀴를 재발명하기 전에 여기서부터 시작하겠습니다.
대신 OpenSSL을 사용하여 자체 서명된 인증서를 생성하려는 경우 도메인 이름 목록을 반복하고 openssl
각 도메인에 대해 다음과 유사한 명령을 실행할 수 있습니다.
openssl req -x509 -newkey rsa:2048 -keyout examplekey.pem -out examplecert.pem -nodes -days 365 -set_serial NNNNN -subj "/C=US/L=Any City/OU=FooBar Inc/CN=*.example.com"
물론, 변경하려는 각 필드에 대해 examplekey.pem
, examplecert.pem
, 및 *.example.com
. 시퀀스 번호로 대체되며 NNNNN
루프가 반복될 때마다 증가됩니다.
필요한 도메인 이름을 반복하고 다양한 Nginx 구성 파일을 업데이트하는 스크립트를 쉽게 작성할 수 있어야 합니다.
답변3
추가하겠습니다애크미 도구여기에서 클라이언트를 암호화할 때 경로를 제공하면 상황이 정말 간단해집니다. acmetool want www.site1.org
acmetool want www.site2.net
acme 요청이 올바른 위치를 가리키도록 하려면 nginx에서 location {} 블록을 사용해야 합니다. 원하는 경우 cron을 통해 업데이트를 처리할 수 있습니다.
답변4
사용하면 certbot --nginx -d your.domain.name
문제가 해결되고 certbot은 nginx 구성을 자동으로 업데이트해야 합니다.
가상 호스트 설정을 완료한 후 이를 사용할 각 도메인에 대해 ssl 명령을 실행하면 certbot --nginx -d your.domain.name
몇 가지 질문을 하고 올바른 구성 파일이 생성됩니다. 또는 certbot --nginx
호스트 이름이 이미 nginx에 있는 경우 직접 실행할 수 있습니다. nginx 구성 파일이 자동으로 포함되며 이전 구성 파일은 .old로 저장됩니다.
이 튜토리얼을 확인할 수도 있습니다.https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04 certbot --renew를 사용하여 crontab을 추가하는 것을 잊지 마세요.