/ 中存储网

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

2013-08-19 17:21:22 来源:itjs.cn
让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。