Skonfiguruj https i http na wordpress nginx

0
[root@serv01 nginx]# cat nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log;
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;

pid        /run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    index   index.php index.html index.htm;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        server_name  localhost;
        root         /var/www/wordpress;

        #charset koi8-r;

        #access_log  /var/log/nginx/host.access.log  main;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            try_files $uri $uri/ =404;
        }     

        # redirect server error pages to the static page /40x.html
        #
        error_page  404              /404.html;
        location = /40x.html {
        }

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        }
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }

    server {
        listen 443;
        server_name home.local;
        ssl on;
        ssl_certificate /etc/nginx/ssl/server.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;
        root /var/www/wordpress;
        index index.php index.htm index.html
    }
}

próbuję użyć https dla mojego wordpress, http działa dobrze, ale kiedy próbuję dodać blok serwera httpd, nginx się nie uruchomi, zgaduję, że jest w złym miejscu. Każda pomoc byłaby bardzo mile widziana.

użytkownik3594093
źródło
Czy masz odpowiedni certyfikat i klucz?
Romeo Ninov
Jakie komunikaty o błędach nginxdają? (sprawdź pliki dziennika) Ponadto może brakować średnika na końcu indexwiersza w części https.
wurtel 30.04.15

Odpowiedzi:

1

Nie wiesz, że to dobrze, aby odpowiedzieć na to prawdopodobnie „Do piachu” pytanie, ale jedziemy ...

Podstawowa konfiguracja (tj. Bezpieczeństwo meh )

  1. Wygeneruj swój klucz prywatny (> = 2048 bitów) i certyfikat. Zakładam, że już je masz, w przeciwnym razie zajrzyj na letsencrypt.org . Upewnij się, że certyfikat obejmuje pełny łańcuch certyfikatów (zwykle certyfikaty pośrednie / jednostkowe ). Jeśli chodzi o parametry Diffie-Hellmana, możesz je wygenerować, uruchamiając openssl dhparam -out /path/to/dhparam.pem 2048.
  2. Ustaw ustawienia SSL zgodnie z generatorem konfiguracji Mozilla SSL ( ustawienia pośrednie , od 30.06.2016):

    server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name localhost;
        root /var/www/wordpress;
    
        ### SSL/TLS SETTINGS ###
        # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
        ssl_certificate /path/to/signed_cert_plus_intermediates;
        ssl_certificate_key /path/to/private_key;
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;
    
        # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
        ssl_dhparam /path/to/dhparam.pem;
    
        # intermediate configuration. tweak to your needs.
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
        ssl_prefer_server_ciphers on;
    
    
        ### OCSP Stapling ###
        # fetch OCSP records from URL in ssl_certificate and cache them
        ssl_stapling on;
        ssl_stapling_verify on;
    
        # verify chain of trust of OCSP response using Root CA and Intermediate certs
        ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;
    
        resolver <IP DNS resolver>;
    
        include /etc/nginx/default.d/*.conf;
    
        location / {
            try_files $uri $uri/ =404;
        }
    
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
    

Zaawansowana konfiguracja (tj. Chodź do mnie, NSA! (No nie, ale ...) )

Weź powyższą konfigurację podstawową i popraw ją w następujący sposób:

  1. Wybierz (przynajmniej) 3072 bity podczas generowania certyfikatu i parametrów Diffie-Hellmana (tak, to zajmie trochę czasu, ale warto).
  2. Używaj tylko TLS1.2: ssl_protocols TLSv1.2;
  3. Użyj bezpiecznej krzywej: ssl_ecdh_curve secp384r1;
  4. Użyj „nowoczesnych” zestawów szyfrów (stan na 30.06.2016): ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
  5. Egzekwuj HTTPS dla wszystkich:

    • Przepisz swój serverblok „HTTP” w następujący sposób:

      server {
          listen 80;
          listen [::]:80;
          server_name mySuperServer;
          return 301 https://$server_name$request_uri;
      }
      
    • Użyj nagłówka HSTS, aby zmusić nawigatora użytkownika do korzystania wyłącznie z HTTPS: add_header Strict-Transport-Security 'max-age=31536000; includeSubdomains; preload';

  6. Serwer może również chronić swoją witrynę (do pewnego stopnia), konfigurując te nagłówki:

    add_header X-Frame-Options DENY;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options nosniff;
    add_header Content-Security-Policy "default-src 'none';
    
  7. Ogólna dobra praktyka tutaj: nigdy nie używaj rootdo modyfikowania plików. Użyj sudozamiast tego.

Premia

  1. Jeśli serwer jest uruchomiony nginx> 1.9.5, można użyć HTTP / 2 poprzez dodanie http2w listendyrektywie.
  2. Twój serwer ma adres IPv6 (i obsługuje HTTP / 2)? Dobry ! Dodaj listen [::]:443 ssl http2;poniżej pierwszą listendyrektywę.
  3. Czy planujesz używać swojego serwera w kilku domenach? Następnie należy ustawić access_logi error_logdla każdego serverbloku.
  4. Kopiowanie / wklejanie rzadko wywołuje ... Możesz przenieść ### SSL/TLS SETTINGS ###blok w pliku tekstowym i dołączyć go do konfiguracji. To samo dotyczy Twojego połączenia CGI z PHP.
  5. Można przyspieszyć komunikację między nginx i Twojego PHP tłumacza nieco za pomocą gniazda UNIX zamiast słuchać ty interfejsu pętli zwrotnej: fastcgi_pass unix:/var/run/php5-fpm.sock;.

W rezultacie twój serverblok powinien wyglądać mniej więcej tak:

#HTTP server
server {
    listen 80;
    listen [::]:80;
    server_name mySuperServer;
    return 301 https://$server_name$request_uri;
}

# HTTPS server
server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2;
    server_name mySuperServer;

    index index.php index.html index.htm;
    root /path/to/your/files/mySuperServer;

    access_log /var/log/nginx/mySuperServer/access.log;
    error_log /var/log/nginx/mySuperServer/error.log;

    ### SSL/TLS SETTINGS ###
    ssl on;
    ssl_certificate /path/to/your/cert.pem;
    ssl_certificate_key /path/to/your/privkey.pem;
    ssl_dhparam /path/to/your/dh_parameters.pem;

    include securityrules.inc;

    include fastcgi.inc;
}

Treść securityrules.inc:

ssl_protocols TLSv1.2;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;

###  HTTP HEADERS ###
add_header Strict-Transport-Security 'max-age=31536000; includeSubdomains; preload';
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header Content-Security-Policy "default-src 'none';

Treść fastcgi.inc:

location ~ \.php$ {
    include                 fastcgi_params;
    fastcgi_keep_conn       on;
    fastcgi_pass            unix:/var/run/php5-fpm.sock;
    fastcgi_index           index.php;
    fastcgi_param           SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Florent_ATo
źródło
Dodam więcej linków, gdy
zdobędę