当前位置: > Linux服务器 > nginx >

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

时间:2015-01-10 22:58来源:linux.it.net.cn 作者:IT
首先看下环境:
1、操作系统Linux Debuian6系统。
2、服务器基于lnmp 0.9环境安装滴。如果没安装lnmp,请来http://www.lnmp.org/install.html学习。
3、已经配置开启了ipv6环境。
   如果木有配置ipv6环境,请参见《buyvm的 OpenVZ 256 VPS的lnmp安装环境nginx启用ipv6 》网址:http://www.xiejiwu.org/article.asp?id=113

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

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

免费SSL证书的申请请参见文章《免费StartSSL证书申请与IIS设置完全攻略》的前半部分,网址http://www.xiejiwu.org/article.asp?id=104
这里有详细的图文教程,直接在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等环境,全部拷贝出来。
  1. server
  2.         {
  3.                 listen   80;
  4.                 listen [xxxx:xxxx:xx:xx:xxx:xxx::xxx]:80; //这里是虚拟主机监听的ipv6地址
  5.                 server_name  domain.com www.domain.com;
  6.  
  7.          ......
  8.  
  9.         }
复制代码
把 里面的 80 端口改成443,然后加上3行如下的代码:
  1.         ssl on;
  2.         ssl_certificate /home/wwwroot/certs/ssl.crt;     //这里如果你改过名字了,请改成你的文件名
  3.         ssl_certificate_key /home/wwwroot/certs/ssl.key; //这里如果你改过名字了,请改成你的文件名
复制代码
改变后的案例如下:
  1. server
  2.         {
  3.                 listen   443;
  4.                 listen [xxxx:xxxx:xx:xx:xxx:xxx::xxx]:443;
  5.                 server_name  domain.com www.domain.com;
  6.                 index index.html index.htm index.php default.html default.htm default.php;
  7.                 root /home/wwwroot/domain.com;
  8.  
  9.                 ssl on;
  10.                 ssl_certificate /home/wwwroot/certs/ssl.crt;
  11.                 ssl_certificate_key /home/wwwroot/certs/ssl.key;
  12.  
  13.          ......
  14.  
  15.         }
复制代码
然后呢,把443端口的 这么一大段代码,粘贴到 80端口配置的文档下方。
实际上等于新建了个虚拟主机,只是路径和绑定的域名是一样的,换了个监听端口。
这里要注意,是粘贴到下方,不是替换以前的。

现在 /usr/local/nginx/conf/vhost/域名.conf 配置文件大约是这个样子滴。
  1. server
  2.         {
  3.                 listen   80;
  4.                 listen [xxxx:xxxx:xx:xx:xxx:xxx::xxx]:80;
  5.                 server_name  domain.com www.domain.com;
  6.  
  7.          ......
  8.  
  9.         }
  10.  
  11. server
  12.         {
  13.                 listen   443;
  14.                 listen [xxxx:xxxx:xx:xx:xxx:xxx::xxx]:443;
  15.                 server_name  domain.com www.domain.com;
  16.                 index index.html index.htm index.php default.html default.htm default.php;
  17.                 root /home/wwwroot/domain.com;
  18.  
  19.                 ssl on;
  20.                 ssl_certificate /home/wwwroot/certs/ssl.crt;
  21.                 ssl_certificate_key /home/wwwroot/certs/ssl.key;
  22.  
  23.          ......
  24.  
  25.         }
复制代码
好啦。这里就修改完了。
先按ESC退出,按 :wq! 保存配置并退出当前文档。

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

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

找到 server 部分 { }括号内的文件,添加如下的一行,这个就是支持ipv6的SSL证书的啦,如果不添加,SSL证书也无法使用滴。
  1.                 listen [::]:443 default ipv6only=on;
复制代码
这里要注意,只需要添加这一行就OK。后面default ipv6only=on不要落下,否则也会出错。

效果如下:
  1. server
  2.         {
  3.                 listen       80;
  4.                 listen [::]:80 default ipv6only=on;
  5.                 listen [::]:443 default ipv6only=on;
  6.         ......
  7.     
  8.         }
复制代码
一定要注意,不要自作聪明加上一行 listen 443;
如果写上 listen 443; 这行,会导致重启nginx的时候提示IP被占用而无法启动nginx。
如果不写 listen [::]:443 default ipv6only=on;这行,也会导致重启nginx的时候提示IP被占用而无法启动nginx。
按ESC退出,按 :wq! 保存配置并退出当前文档。

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

执行以下命令,查看Nginx配置是否正确
  1. /usr/local/nginx/sbin/nginx -t
复制代码
若返回以下结果则正确
  1. the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
  2. 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----- 代码。
这个代码一定不要在一行里。

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

所以我们在粘贴证书文件的时候,最好回车,哪怕多一行也没关系,这样不会出错,也比较好看。
粘贴后样式应该是:
  1. -----END CERTIFICATE-----
  2.  
  3. -----BEGIN CERTIFICATE-----
复制代码
最后,把记事本最后一行多回车一下,最好多回车一行。

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

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

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

然后依次执行一下命令
  1. wget http://cert.startssl.com/certs/ca.pem
  2. wget http://cert.startssl.com/certs/sub.class1.server.ca.pem
  3. cat ca.pem sub.class1.server.ca.pem >> ca-certs.crt
  4. cat ca-certs.crt >> ssl.crt
复制代码
这样就合并证书了,但是合并的证书会出现上面的错误,所以还要下载下来。
把 -----END CERTIFICATE----------BEGIN CERTIFICATE-----  分成2行。
变成:
  1. -----END CERTIFICATE-----
  2.  
  3. -----BEGIN CERTIFICATE-----
复制代码
然后保存,上传证书,替换掉你服务器里的ssl.crt文件。

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

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

好啦,我们现在可以取消密码。
命令如下,首先切换到保存key的文件夹,如果你在别的文件夹,请更换成你自己的。
  1. cd /home/wwwroot/certs
  2. 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;
然后保存。

效果如下:
  1. server
  2.         {
  3.                 listen   443;
  4.                 listen [xxxx:xxxx:xx:xx:xxx:xxx::xxx]:443;
  5.                 server_name  domain.com www.domain.com;
  6.                 index index.html index.htm index.php default.html default.htm default.php;
  7.                 root /home/wwwroot/domain.com;
  8.  
  9.                 ssl on;
  10.                 ssl_certificate /home/wwwroot/certs/ssl.crt;
  11.                 ssl_certificate_key /home/wwwroot/certs/ssl.key.unsecure;
  12.  
  13.          ......
  14.  
  15.         }
复制代码
是不是发现不再提示了,整个世界清净了吧:-)

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

最后,当然是重启Nginx让配置生效,可以使用如下命令。
输入以下命令:
  1. killall nginx
  2. /usr/local/nginx/sbin/nginx
  3. kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
复制代码
当然,你也可以重新启动服务器哦。



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

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

PHP脚本代码如下,保存为ip.php上传到你服务器上,通过访问改地址既可以测试。
  1. $ip=$_SERVER["REMOTE_ADDR"];
  2. if (strpos($ip,":")!==false)
  3. {
  4.     $show = "您正在使用IPv6地址 $ip 访问本站!";
  5. }
  6. else
  7. {
  8.     $show = "您正在使用IPv4地址 $ip 访问本站!";
  9. }
  10. echo $show;
  11. ?>
复制代码
通过访问即可看见,你当前的访问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 配置文件。
加上代码:
  1.        listen [xxxx:xxxx:xx:xx:xxx:xxx::xxx]:443;
  2.        ssl on;
  3.        ssl_certificate /home/wwwroot/certs/ssl.crt;
  4.        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地址。
  1. server
  2.         {
  3.               listen    443;
  4.               listen [2605:6400:2:xxx:xx:xxx:xx:2]:443;
  5.        .................
  6.          }
复制代码
如果不加以上代码 则会提示报错。导致无法启动nginx。

笔记版权归三掌柜所有,转载请链接 http://www.xiejiwu.org/article.asp?id=117 (责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容