如何在Ubuntu 12.04上使用Nginx在一个IP上设置多个SSL证书

虽然在单个虚拟专用服务器上托管多个站点不是使用虚拟主机的一个挑战,为每个站点提供单独的SSL证书传统上需要单独的IP地址。这个过程最近简化了

您可以使用服务器名称标识(SNI)在一个IP地址上托管多个SSL证书。

关于SNI

虽然在单个虚拟专用服务器上托管多个站点不是使用虚拟主机的一个挑战,为每个站点提供单独的SSL证书传统上需要单独的IP地址。 最近通过使用服务器名称指示(SNI)简化了该过程,该服务器名称指示(SNI)向站点访问者发送与所请求的服务器名称匹配的证书。

注意:

SNI只能用于从您的Web服务器提供多个SSL站点,并且不可能在其他守护程序(例如邮件服务器等)上工作。还有一小部分旧的Web浏览器仍然可能会出现证书错误。 维基百科拥有的软件,不和不支持此TLS扩展的更新列表。

建立

SNI确实需要注册域名才能提供证书。

本教程中的步骤要求用户具有root权限。 你可以看到如何设置了在初始服务器设置教程第3步和4。

Nginx应该已经安装并运行在您的VPS上。

如果不是这样,您可以使用此命令下载:

sudo apt-get install nginx

您可以确保在服务器上启用SNI:

 nginx -V

显示nginx版本后,你应该看到这行:

 TLS SNI support enabled

第一步 - 创建您的SSL证书目录

为了本教程的目的,两个证书都将是自签名的。 我们将努力创建一个承载example.com和example.org的服务器。

SSL证书有2个主要部分:证书本身和公钥。 为了使所有相关文件易于访问,我们应为每个虚拟主机的SSL证书创建一个目录。

mkdir -p /etc/nginx/ssl/example.com
mkdir -p /etc/nginx/ssl/example.org

第二步:创建服务器密钥和证书签名请求

首先,为example.com创建SSL证书。

切换到正确的目录:

cd /etc/nginx/ssl/example.com

首先创建私有服务器密钥。 在此过程中,您将被要求输入特定的密码。 一定要仔细地注意这个短语,如果你忘记它或失去它,你将无法访问证书。

sudo openssl genrsa -des3 -out server.key 1024

后续操作是创建证书签名请求:

sudo openssl req -new -key server.key -out server.csr

此命令将提示终端显示需要填写的字段列表。

最重要的一行是“Common Name”。 在这里输入您的官方网域名称,如果您还没有,请输入您网站的IP位址。 将挑战密码和可选的公司名称留空。

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:NYC
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Awesome Inc
Organizational Unit Name (eg, section) []:Dept of Merriment
Common Name (e.g. server FQDN or YOUR name) []:example.com                  
Email Address []:webmaster@awesomeinc.com

第三步 - 删除密码

我们几乎完成了证书的创建。 但是,它将帮助我们删除密码。 虽然具有密码确实提供了更高的安全性,但是当尝试重新加载nginx时,问题开始。 在nginx崩溃或需要重新启动的情况下,您将总是必须重新输入密码,以使整个Web服务器重新联机。

使用此命令删除密码:

sudo cp server.key server.key.org
sudo openssl rsa -in server.key.org -out server.key

第四步 - 签名SSL证书

你的证书只是完成了,你只需要签名。

请记住,您可以通过将365更改为您希望的天数来指定证书应保持有效的时间。 因为它认为这个证书将在一年后过期。

sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

您现在已完成为您的第一个主机的证书。

要创建第二个证书,请切换到第二个目录:

cd /etc/nginx/ssl/example.org

对第二个证书重复前三个步骤。 一旦两者平方后,您就可以开始将证书添加到虚拟主机。

第五步 - 创建虚拟主机

一旦您保存并准备好证书,就可以在虚拟主机文件中添加您的信息。

虽然不是必需的,但我们可以创建两个虚拟主机文件,以将虚拟主机存储在单独的文件中。

sudo nano /etc/nginx/sites-available/example.com

然后,每个文件将包含虚拟主机配置(请务必编辑的服务器名 ,ssl_certificatessl_certificate_key线,以配合您的详细信息):

 server {

        listen   443;
        server_name example.com;

        root /usr/share/nginx/www;
        index index.html index.htm;

        ssl on;
        ssl_certificate /etc/nginx/ssl/example.com/server.crt;
        ssl_certificate_key /etc/nginx/ssl/example.com/server.key;
}

然后,可以将相应的配置放入其他虚拟主机文件中。

sudo nano /etc/nginx/sites-available/example.org
 server {

        listen   443;
        server_name example.org;

        root /usr/share/nginx/www;
        index index.html index.htm;

        ssl on;
        ssl_certificate /etc/nginx/ssl/example.org/server.crt;
        ssl_certificate_key /etc/nginx/ssl/example.org/server.key;
}

第六步 - 激活虚拟主机

最后一步是通过在sites-available目录和sites-enabled目录之间创建符号链接来激活主机。

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo ln -s /etc/nginx/sites-available/example.org /etc/nginx/sites-enabled/example.org

在所有虚拟主机到位后,重新启动nginx。

sudo service nginx restart

您现在应该可以访问这两个网站,每个网站都有自己的域名和SSL证书。

您可以通过在刚刚输入域视图既没有签名的SSL证书的网站(例如:example.comexample.org。),或者使用HTTPS前缀的域名(https://example.comhttps:// example.org)。

作者Etel Sverdlov