WordPress 사이트를 Let’s Encrypt로 SSL화해 본다.
SSL화된 사이트 구성
-CentOS 6.9
-Nginx 1.12.0
-php-fpm 5.4.36
-WordPress 4.7.5
원래 사이트의 Nginx 설정
원래 사이트는 VirtualHost에서 공개하고 있으므로 Nginx의 설정은 이런 느낌.
※blog.sample.local은 실제 사이트의 URL로 읽어 주세요.
blog.sample.local.confserver {
listen 80;
server_name blog.sample.local;
root /virtual/public/blog.sample.local;
index index.php index.html index.htm;
access_log /var/log/nginx/blog.sample.local/access.log main;
error_log /var/log/nginx/blog.sample.local/error.log warn;
include wordpress.conf;
}
wordpress.conf try_files $uri $uri/ /index.php?q=$uri&$args;
location ~* \.(gif|jpg|png|ico|css|js)$ {
access_log off;
}
location ~ /wp-admin {
access_log off;
include php_exec;
}
location ~ /wp-content {
access_log off;
include php_exec;
}
location ~ /wp-includes {
access_log off;
include php_exec;
}
location ~ /wp-cron.php {
access_log off;
include php_exec;
}
location ~ /wp-login.php {
access_log off;
include php_exec;
}
location ~ /wp-comments {
access_log off;
include php_exec;
}
include php_exec;
php_exec.location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
fastcgi_params.fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param REDIRECT_STATUS 200;
SSL화할 변경 정책
다음과 같은 정책으로 SSL화합니다.
원래 사이트는 VirtualHost에서 공개하고 있으므로 Nginx의 설정은 이런 느낌.
※blog.sample.local은 실제 사이트의 URL로 읽어 주세요.
blog.sample.local.conf
server {
listen 80;
server_name blog.sample.local;
root /virtual/public/blog.sample.local;
index index.php index.html index.htm;
access_log /var/log/nginx/blog.sample.local/access.log main;
error_log /var/log/nginx/blog.sample.local/error.log warn;
include wordpress.conf;
}
wordpress.conf
try_files $uri $uri/ /index.php?q=$uri&$args;
location ~* \.(gif|jpg|png|ico|css|js)$ {
access_log off;
}
location ~ /wp-admin {
access_log off;
include php_exec;
}
location ~ /wp-content {
access_log off;
include php_exec;
}
location ~ /wp-includes {
access_log off;
include php_exec;
}
location ~ /wp-cron.php {
access_log off;
include php_exec;
}
location ~ /wp-login.php {
access_log off;
include php_exec;
}
location ~ /wp-comments {
access_log off;
include php_exec;
}
include php_exec;
php_exec.
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
fastcgi_params.
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param REDIRECT_STATUS 200;
SSL화할 변경 정책
다음과 같은 정책으로 SSL화합니다.
Let's Encrypt 인증서를 받을 때 인증 디렉터리 만들기
mkdir -p /var/www/ssl-proof/rancher/.well-known/
Nginx 설정 변경
blog.sample.local.confupstream wordpress_sample {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
listen 8080;
root /virtual/public/blog.sample.local;
index index.php index.html index.htm;
access_log /var/log/nginx/blog.sample.local/access.log main;
error_log /var/log/nginx/blog.sample.local/error.log warn;
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
include wordpress.conf;
}
server {
listen 80;
listen [::]:80;
server_name blog.sample.local;
return 301 https://$server_name$request_uri;
}
server {
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
listen 443 ssl;
listen [::]:443 ssl;
server_name blog.sample.local;
root /var/www/rancher-certbot-webroot;
ssl on;
ssl_certificate /etc/letsencrypt/live/blog.sample.local/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blog.sample.local/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED';
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
location /.well-known {
root /var/www/ssl-proof/rancher/;
}
location / {
proxy_redirect off;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_intercept_errors on;
proxy_pass http://wordpress_sample;
proxy_redirect http:// https://;
}
}
WordPress의 server 설정에
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
를 추가하지 않으면 access.log,error.log에 기록되는 IP 주소가 127.0.0.1이 되어 버리므로 잊지 않고 추가합시다.
wp-config.php 수정
위의 설정만으로 리디렉션 루프가 발생하기 때문에 wp-config.php에 아래 내용을 추가합니다.
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
&& $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https") {
$_SERVER['HTTPS'] = 'on';
}
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
Let's Encrypt 인증서 얻기
certbot-auto 얻기
cd /tmp
wget https://dl.eff.org/certbot-auto
mv certbot-auto /usr/bin
chmod a+x /usr/bin/certbot-auto
인증서 얻기
certbot-auto certonly --webroot -w /var/www/ssl-proof/rancher/ -d blog.sample.local
인증서 정기 업데이트
Let's Encrypt 인증서의 유효 기간은 90일이므로 정기적으로 갱신해야 합니다.
매월 12일 아침 5시에 업데이트하도록 cron을 설정합니다.
갱신 일시는 기호로.
00 05 12 * * certbot-auto certonly --force-renewal --webroot -w /var/www/ssl-proof/rancher/ -d blog.sample.local && service nginx restart
SSL화 후의 「Qualys SSL Labs」로의 평가
SSL이 유효한 서버를 해석해, 적절한 설정이 되어 있는지를 평가하는 「 Qualys SSL Labs SSL Server Test 」로 설정 내용을 체크해 보았습니다.
"A+"의 평가를 획득할 수 있었습니다.
참고로 한 사이트
mkdir -p /var/www/ssl-proof/rancher/.well-known/
blog.sample.local.conf
upstream wordpress_sample {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
listen 8080;
root /virtual/public/blog.sample.local;
index index.php index.html index.htm;
access_log /var/log/nginx/blog.sample.local/access.log main;
error_log /var/log/nginx/blog.sample.local/error.log warn;
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
include wordpress.conf;
}
server {
listen 80;
listen [::]:80;
server_name blog.sample.local;
return 301 https://$server_name$request_uri;
}
server {
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
listen 443 ssl;
listen [::]:443 ssl;
server_name blog.sample.local;
root /var/www/rancher-certbot-webroot;
ssl on;
ssl_certificate /etc/letsencrypt/live/blog.sample.local/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blog.sample.local/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED';
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
location /.well-known {
root /var/www/ssl-proof/rancher/;
}
location / {
proxy_redirect off;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_intercept_errors on;
proxy_pass http://wordpress_sample;
proxy_redirect http:// https://;
}
}
WordPress의 server 설정에
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
를 추가하지 않으면 access.log,error.log에 기록되는 IP 주소가 127.0.0.1이 되어 버리므로 잊지 않고 추가합시다.
wp-config.php 수정
위의 설정만으로 리디렉션 루프가 발생하기 때문에 wp-config.php에 아래 내용을 추가합니다.
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
&& $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https") {
$_SERVER['HTTPS'] = 'on';
}
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
Let's Encrypt 인증서 얻기
certbot-auto 얻기
cd /tmp
wget https://dl.eff.org/certbot-auto
mv certbot-auto /usr/bin
chmod a+x /usr/bin/certbot-auto
인증서 얻기
certbot-auto certonly --webroot -w /var/www/ssl-proof/rancher/ -d blog.sample.local
인증서 정기 업데이트
Let's Encrypt 인증서의 유효 기간은 90일이므로 정기적으로 갱신해야 합니다.
매월 12일 아침 5시에 업데이트하도록 cron을 설정합니다.
갱신 일시는 기호로.
00 05 12 * * certbot-auto certonly --force-renewal --webroot -w /var/www/ssl-proof/rancher/ -d blog.sample.local && service nginx restart
SSL화 후의 「Qualys SSL Labs」로의 평가
SSL이 유효한 서버를 해석해, 적절한 설정이 되어 있는지를 평가하는 「 Qualys SSL Labs SSL Server Test 」로 설정 내용을 체크해 보았습니다.
"A+"의 평가를 획득할 수 있었습니다.
참고로 한 사이트
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
&& $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https") {
$_SERVER['HTTPS'] = 'on';
}
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
certbot-auto 얻기
cd /tmp
wget https://dl.eff.org/certbot-auto
mv certbot-auto /usr/bin
chmod a+x /usr/bin/certbot-auto
인증서 얻기
certbot-auto certonly --webroot -w /var/www/ssl-proof/rancher/ -d blog.sample.local
인증서 정기 업데이트
Let's Encrypt 인증서의 유효 기간은 90일이므로 정기적으로 갱신해야 합니다.
매월 12일 아침 5시에 업데이트하도록 cron을 설정합니다.
갱신 일시는 기호로.
00 05 12 * * certbot-auto certonly --force-renewal --webroot -w /var/www/ssl-proof/rancher/ -d blog.sample.local && service nginx restart
SSL화 후의 「Qualys SSL Labs」로의 평가
SSL이 유효한 서버를 해석해, 적절한 설정이 되어 있는지를 평가하는 「 Qualys SSL Labs SSL Server Test 」로 설정 내용을 체크해 보았습니다.
"A+"의 평가를 획득할 수 있었습니다.
참고로 한 사이트
Reference
이 문제에 관하여(WordPress 사이트를 Let’s Encrypt로 SSL화해 본다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/chanken/items/b6dc4a896f8cc1615f34텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)