WordPress 사이트를 Let’s Encrypt로 SSL화해 본다.

Let's Encrypt를 사용하여 WordPress 사이트를 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.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화합니다.
  • http(포트 80)로 액세스가 왔을 때는 https(포트 443)에 전송한다.
  • SSL은 역방향 프록시로 풀린다.
  • WordPress는 http (포트 8080)에서 운영한다.
  • Let's Encrypt의 증명서는 webroot 모드로 취득·갱신한다.

  • Let's Encrypt 인증서를 받을 때 인증 디렉터리 만들기


    mkdir -p /var/www/ssl-proof/rancher/.well-known/
    

    Nginx 설정 변경



    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+"의 평가를 획득할 수 있었습니다.


    참고로 한 사이트


  • Qiita
  • htps : // / rt 보트 t. 엣 f. rg/
  • 헤오를 rld. jp. 뿌리 t
  • 아빠 블로그
  • Lancork
  • 환상 블로그
  • 좋은 웹페이지 즐겨찾기