使用由Nginx的通配符处理的子域进行Let's加密

时间:2017-06-18 08:43:48

标签: ssl nginx https lets-encrypt

我正在使用nginx设置debian服务器,我希望能够使用HTTPS提供我的Web服务。我还在学习,我发现自己迷失了nginx +让我们加密配置。

第一个问题:

由于nginx(sub.domain.com),我是否必须为certbot提供我要创建的所有子域

certbot certonly -a webroot --webroot-path=/var/www/html -d domain.com -d sub1.domain.com -d sub2.domain.com

或者我可以只提供我的主域名(domain.com),它会生成一组证书,我可以在之后使用,感谢nginx

certbot certonly -a webroot --webroot-path=/var/www/html -d domain.com
第二个问题:

我按照Nginx + Let的Encrypt + Debian DigitalOcean教程设置我的服务器。

我访问了我的域名DNS,我给了我的nginx服务器一个通配符,以便它处理子域名。

  A      domain.com     SERVER_IP
CNAM    *.domain.com    domain.com

我希望能够在我的启用站点的文件夹中创建一个默认文件,该文件夹处理对端口80进行的每个网络连接并将其转发到正确的子域服务。我希望能够为每个子域创建一个带有服务器块的文件,这将允许我明确地说出我是否需要或者我不想要特定域的SSL。

我的默认文件现在看起来像这样:

# Default server configuration
#
server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name domain.com www.domain.com;
        return 301 https://$server_name$request_uri;
}

server {

        # SSL configuration

        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;

        ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
        ssl_ecdh_curve secp384r1;
        ssl_session_cache shared:SSL:10m;
        ssl_session_tickets off;
        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.8.8 8.8.4.4 valid=300s;
        resolver_timeout 5s;
        # Disable preloading HSTS for now.  You can use the commented out header line that includes
        # the "preload" directive if you understand the implications.
        #add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;

        ssl_dhparam /etc/ssl/certs/dhparam.pem;

        #root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name domain.com;

        location / {
                include uwsgi_params;
                uwsgi_pass unix:/home/user1/website/website.sock;
        }       


        location ~/.well-known {
                allow all;
        }
}

我在其他文件中有一个主机使用我的主域来部署带有ssl的烧瓶应用程序:

server {
    listen 80;
    server_name IP_OF_MY_SERVER;

    ssl on;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/user1/website/website.sock;
    }
}

现在我想为我的其他网络服务创建子域名,我所做的是在创建的网站中创建一个新的主机文件,例如传输web ui(我希望它没有SSL):

server {
        listen 80;
        server_name sub1.domain.com;

        ssl off;

        location / {
                proxy_pass      http://localhost:9091/;
        }

        location /transmission {
                proxy_pass      http://localhost:9091/transmission;
        }
}

另一个烧瓶应用程序(我想用SSL):

server {
    listen 80;
    server_name sub2.domain.com;

    ssl on;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/user2/flaskapp2/flaskapp2.sock;
    }
}

不幸的是,我尝试的所有内容都会导致HSTS错误或其他类型的错误。也许我的用例是不可能的。如果有人能向我解释我做错了什么,我将非常感激。

1 个答案:

答案 0 :(得分:0)

第一个问题。对于letsencrypt证书,不可能使用通配符。