服务器之家

专注于服务器技术!
当前位置:首页 > Web服务器 > Nginx

配置Nginx SSL证书网站支持在ipv6协议下访问

发布时间:2014-07-30 来源:服务器之家

让nginx的SSL证书服务支持ipv6访问

首先看下环境:
1、操作系统为Linux Debian6系统。
2、服务器基于lnmp环境安装滴。
3、已经配置开启了ipv6环境。
   如果木有配置ipv6环境,请参见《buyvm的 OpenVZ 256 VPS的lnmp安装环境nginx启用ipv6 》网址:http://www.server110.com/nginx/201407/10797.html

网上讲解证书安装教程一般都是讲解ipv4下配置SSL,基本很少说ipv6下SSL的。
很多讲的很复杂,而且乱七八糟,各有说辞,下面我们来看如何最简单的配置SSL证书,并让他同时支持ipv4和ipv6访问。

一、免费SSL证书的申请,这里用的是startssl的免费证书。

免费SSL证书的申请请参见文章《免费StartSSL证书申请详细步骤和IIS中的SSL设置》的前半部分,网址http://www.server110.com/iis/201407/10798.html
这里有详细的图文教程,直接在startssl网站上申请就OK,不需要在自己服务器上做任何步骤。
这里要提醒的是,一定要用IE浏览器申请,别的基本都无法保存E-mail的进入证书。
还一点很重要的,楼主测试IE 10也无法获取到startSSL的信箱证书,建议用IE 7/8/9 申请,都没有问题。
证书申请部分,请详细研究上面的文章,这里不再多赘述。

顺利的话,现在你获得了一个ssl.key文件和ssl.crt的证书,这个就是我们需要的啦。
当然,还有你申请时候填写的证书密码,这个也需要,记好一会用。

二、把证书安装到服务器,在nginx下配置ssl证书。

第一步:把key文件和crt证书上传到自己的服务器上。

可以用FTP软件或其他方式把你的证书传到服务器上。
如传在你的自己服务器 /home/wwwroot/certs/ 文件夹下,当然,这里只是举个例子。
这里要传的是刚才得到的ssl.key文件和ssl.crt证书(你也可以给他们改个名字,当然后面用到这个路径,也都要跟着改)。
我们暂且用默认的名字吧,你需要的话自己修改好了。

第二步:修改虚拟主机conf配置文件。

我的ssl证书是给一个虚拟主机使用的,所以首先要来给虚拟主机conf配置文件修改下。

通过 vi /usr/local/nginx/conf/vhost/域名.conf 打开配置文件。

找到配置文件的 server 部分,{ } 内包括配置的PHP等环境,全部拷贝出来。

server
        {
                listen   80;
                listen [xxxx:xxxx:xx:xx:xxx:xxx::xxx]:80; //这里是虚拟主机监听的ipv6地址
                server_name  server110.com www.server110.com;

         ......

        }

把 里面的 80 端口改成443,然后加上3行如下的

        ssl on;
        ssl_certificate /home/wwwroot/certs/ssl.crt;     //这里如果你改过名字了,请改成你的文件名
        ssl_certificate_key /home/wwwroot/certs/ssl.key; //这里如果你改过名字了,请改成你的文件名

改变后的案例如下:

server
        {
                listen   443;
                listen [xxxx:xxxx:xx:xx:xxx:xxx::xxx]:443;
                server_name  server110.com www.server110.com;
                index index.html index.htm index.php default.html default.htm default.php;
                root /home/wwwroot/server110.com;

                ssl on;
                ssl_certificate /home/wwwroot/certs/ssl.crt;
                ssl_certificate_key /home/wwwroot/certs/ssl.key;

         ......

        }

然后呢,把443端口的 这么一大段代码,粘贴到 80端口配置的文档下方。
实际上等于新建了个虚拟主机,只是路径和绑定的域名是一样的,换了个监听端口。
这里要注意,是粘贴到下方,不是替换以前的。

现在 /usr/local/nginx/conf/vhost/域名.conf 配置文件大约是这个样子滴。

server
        {
                listen   80;
                listen [xxxx:xxxx:xx:xx:xxx:xxx::xxx]:80;
                server_name  server110.com www.server110.com;

         ......

        }

server
        {
                listen   443;
                listen [xxxx:xxxx:xx:xx:xxx:xxx::xxx]:443;
                server_name  server110.com www.server110.com;
                index index.html index.htm index.php default.html default.htm default.php;
                root /home/wwwroot/server110.com;

                ssl on;
                ssl_certificate /home/wwwroot/certs/ssl.crt;
                ssl_certificate_key /home/wwwroot/certs/ssl.key;

         ......

        }

好啦。这里就修改完了。
先按ESC退出,按 :wq! 保存配置并退出当前文档。

第三步 :修改nginx主配置文件

通过命令 vi /usr/local/nginx/conf/nginx.conf 打开nginx主配置文件。

找到 server 部分 { }括号内的文件,添加如下的一行,这个就是支持ipv6的SSL证书的啦,如果不添加,SSL证书也无法使用滴。

                listen [::]:443 default ipv6only=on;

这里要注意,只需要添加这一行就OK。后面default ipv6only=on不要落下,否则也会出错。

效果如下:

server
        {
                listen       80;
                listen [::]:80 default ipv6only=on;
                listen [::]:443 default ipv6only=on;
        ......
    
        }

一定要注意,不要自作聪明加上一行 listen 443;
如果写上 listen 443; 这行,会导致重启nginx的时候提示IP被占用而无法启动nginx。
如果不写 listen [::]:443 default ipv6only=on;这行,也会导致重启nginx的时候提示IP被占用而无法启动nginx。
按ESC退出,按 :wq! 保存配置并退出当前文档。

好啦,现在测试nginx.conf配置文件是否正确,如果不正确,检查配置。

执行以下命令,查看Nginx配置是否正确
/usr/local/nginx/sbin/nginx -t
若返回以下结果则正确
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful

第四步:合并证书。

这里颁发给你的 ssl.crt 只是你自己网站的证书,而不包含startssl的根证书和class1证书。
在某些浏览器下没有根证书会提示证书有问题,所以startssl也会提醒你安装根证书。

方法一:用记事本手动合并。

最简单的方法,把class1和根证书下载下来,粘贴到你的证书里。

具体步骤如下:
打开网址 http://cert.startssl.com/certs/sub.class1.server.ca.pem 下载class1证书。
打开网址 http://cert.startssl.com/certs/ca.pem 下载根证书。

用记事本打开 你自己的 ssl.crt文件,然后用记事本打开 下载的 sub.class1.server.ca.pem 和 ca.pem 文件。
把sub.class1.server.ca.pem 和 ca.pem 依次粘贴到你的 ssl.crt文件里,然后保存即可。

这里要注意的是,每个文件的开头和结束有 -----END CERTIFICATE----------BEGIN CERTIFICATE----- 代码。
这个代码一定不要在一行里。

如果在一行,测试配置文件会出现错误,错误如下。
[emerg]: SSL_CTX_use_certificate_chain_file("/etc/nginx/certs/server.crt")
failed (SSL: error:0906D066:PEM routines:PEM_read_bio:bad end line error:140DC009:SSL routines:SSL_CTX_use_certificate_chain_file:PEM lib)
configuration file /etc/nginx/conf/nginx.conf test failed

所以我们在粘贴证书文件的时候,最好回车,哪怕多一行也没关系,这样不会出错,也比较好看。
粘贴后样式应该是:

-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----

最后,把记事本最后一行多回车一下,最好多回车一行。

把合并过的证书上传,替换掉你服务器里的ssl.crt文件。

方法二:用命令在服务器上合并.

首先 用命令 cd /home/wwwroot/certs/ 切换到你证书的文件夹。

然后依次执行一下命令
wget http://cert.startssl.com/certs/ca.pem
wget http://cert.startssl.com/certs/sub.class1.server.ca.pem
cat ca.pem sub.class1.server.ca.pem >> ca-certs.crt
cat ca-certs.crt >> ssl.crt

这样就合并证书了,但是合并的证书会出现上面的错误,所以还要下载下来。
把 -----END CERTIFICATE----------BEGIN CERTIFICATE-----  分成2行。
变成:
-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----
然后保存,上传证书,替换掉你服务器里的ssl.crt文件。

第五步:去除key里的加密密码。

这时候如果你重启Nginx让配置生效,可以使用如下命令。
输入以下命令:
killall nginx
/usr/local/nginx/sbin/nginx
kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
会出现要求你输入密码的 Enter PEM pass phrase
如果你配置文件也正确,输入密码后才能启动Nginx,这是很麻烦的。
而且服务器重新启动也不会自动启动nginx,必须手动启动,还要输入2次密码。
所以我们必须要取消key里的密钥.

好啦,我们现在可以取消密码。
命令如下,首先切换到保存key的文件夹,如果你在别的文件夹,请更换成你自己的。
cd /home/wwwroot/certs
openssl rsa -in ssl.key -out ssl.key.unsecure
这样,就剥离了密码文件,利用OpenSSL命令生成了一个没有私钥server.key.unsecure文件。

然后我们要更改 虚拟主机里的配置文件。
用命令 vi /usr/local/nginx/conf/vhost/域名.conf 打开虚拟主机的配置文件。

找到     ssl_certificate_key /home/wwwroot/certs/ssl.key;
替换成      ssl_certificate_key /home/wwwroot/certs/ssl.key.unsecure;
然后保存。

效果如下:
server
        {
                listen   443;
                listen [xxxx:xxxx:xx:xx:xxx:xxx::xxx]:443;
                server_name  server110.com www.server110.com;
                index index.html index.htm index.php default.html default.htm default.php;
                root /home/wwwroot/server110.com;

                ssl on;
                ssl_certificate /home/wwwroot/certs/ssl.crt;
                ssl_certificate_key /home/wwwroot/certs/ssl.key.unsecure;

         ......

        }

是不是发现不再提示了,整个世界清净了吧:-)

这里要注意的是,有时候检测配置文件的时候,
会提示 ssl.key 或 ssl.key.unsecure 有错误。
只要用记事本打开  ssl.key 或 ssl.key.unsecure  ,在最后一行回车,留一行空白就OK。

最后,当然是重启Nginx让配置生效,可以使用如下命令。
输入以下命令:
killall nginx
/usr/local/nginx/sbin/nginx
kill -HUP `cat /usr/local/nginx/logs/nginx.pid`

当然,你也可以重新启动服务器哦。

如果你想让网站强制使用SSL那么添加如下代码即可。
找到虚拟主机的配置文件 /usr/local/nginx/conf/vhost/域名.conf

在server 80端口的配置 {} 里,添加代码  
rewrite ^(.*) https://$server_name$1 permanent;

效果如下:
server
        {
              listen    80;
             rewrite ^(.*) https://$server_name$1 permanent;
    .........
         }

重新启动nginx 大功告成。:)

++++++++++++++++++++++++++++++++++++++++

如何测试,服务器到底走的是IPV4还是ipv6??????

PHP脚本代码如下,保存为ip.php上传到你服务器上,通过访问该地址既可以测试。

$ip=$_SERVER["REMOTE_ADDR"];
if (strpos($ip,":")!==false)
{
    $show = "您正在使用IPv6地址 $ip 访问本站!";
}
else
{
    $show = "您正在使用IPv4地址 $ip 访问本站!";
}
echo $show;
?>

通过访问即可看见,你当前的访问IP,即可知道由ipv4还是ipv6访问的。
这里前提是你的域名支持ipv6解析并成功解析到服务器的ipv6上了哦。

感谢ipv6home.cn的ipv6之家站长提供代码。

+++++++++++++++++ 分割线 ++++++++++++++++

有问题的请看:

问题一:

Linux 提示 nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

今天在重启nginx时候发现这个错误,原因是nginx自己占用了80端口
killall -9 nginx 杀掉nginx 进程 然后重启就行了。 service nginx restart
check running pidfuser -n tcp 8080/tcp: 26621 26622 Kill# kill -9 2118# kill -9 2119restart nginx/root/lnmp restart

netstat -an|grep LISTEN 命令可以查看当前开启了那些端口。

问题二:

Nginx配置SSL安全证书避免启动输入Enter PEM pass phrase

配置好的Nginx每次启动都要输两遍PEM pass phrase,很是不爽,尤其是在服务器重启后,Nginx压根就无法自动启动,必须手动启动并输入那麻烦的PEM pass phrase。如何避免Nginx启动出现Enter PEM pass phrase呢?
切换到key文件目录后 openssl rsa -in ssl.key -out ssl.key.unsecure
然后更改 /usr/local/nginx/conf/vhost/域名.conf 配置文件。
修改ssl_certificate_key /etc/nginx/certs/server.key;到没有密钥的文件。
代码为 ssl_certificate_key /etc/nginx/certs/ssl.key.unsecure;
然后重启启动Nginx

问题三:

startssl的发邮件给你,提示:It seems, that the installation of your server certificate with serial number 1*** for www.***** is not complete!

根证书没有合并,请参照以上教程合并证书。

问题四:

服务器只支持ipv4访问,不支持ipv6访问证书。

1.请配置更改 /usr/local/nginx/conf/vhost/域名.conf 配置文件。
加上代码:
       listen [xxxx:xxxx:xx:xx:xxx:xxx::xxx]:443;
       ssl on;
       ssl_certificate /home/wwwroot/certs/ssl.crt;
       ssl_certificate_key /home/wwwroot/certs/ssl.key;

2.并配置 /usr/local/nginx/conf/nginx.conf 的nginx主配置文件。
加上  listen [::]:443 default ipv6only=on; 语句。

问题五:

提示key文件错误。

在key文件最后一行加上一个空白行即可。

问题六:

提示 nginx: [emerg] bind() to [2605:6400:2:xxx:xx:xxx:xx:xxx]:443 failed (98: Address already in use)
..............
nginx: [emerg] still could not bind()

这是ipv6下443的ssl有问题。请配置好nginx主文件nginx.conf和虚拟主机vhost/域名.conf文件。
需要在   /usr/local/nginx/conf/nginx.conf 添加 listen [::]:443 default ipv6only=on;
这里不能添加   listen       443;
如果添加了listen 443; 在虚拟主机中,ipv4下SSL网站将无法访问。并且服务器测试会出现以上提示。

vhost 虚拟主机 要写监听每一个详细IPV6地址。
server
        {
              listen    443;
              listen [2605:6400:2:xxx:xx:xxx:xx:2]:443;
       .................
         }

如果不加以上代码 则会提示报错。导致无法启动nginx。