如何在Nginx中搭建HTTPS站点

分类:技术备忘 阅读:12007 评论:1

这里采取的是在StartSSL申请免费证书,使用Nginx + php-cgi(php-fpm)的方式建立HTTPS加密的站点。

首先在StartSSL注册,点左上角图标“Sign-up For Free”,注册的过程要填写比较详细的地址、电话什么的,否则可能被拒,具体注册教程可以Google一下,很多介绍,也很简单。注册过程要验证邮件地址,注册成功之后会自动安装一个StartCom Free Certificate Member的证书,这个就是用来登录的,搞证书的完整登录用证书也算是门当户对。必须用IE浏览器注册,因为要装ActiveX控件。


注册之后,点击Authenticate,再进入Control Panel,  先使用Validations Wizard验证域名,再使用Certificates Wizard创建证书,类型为“Web Server SSL /TLS Certificate”。在接下来的步骤里面,可以在线创建私钥,但我发现在网站上直接输入密码,提交会有一个JavaScript错误,导致无法继续,换了浏览器和机器也是一样。

所以我们可以选择创建私钥的步骤Skip,然后把自己采用自己创建的CSR用用本工具打开,粘贴到下一步“Submit Certificate Request (CSR)”的文本框中;下面用到的openssl是OpenSSL库里面的一个工具。
1)创建一个4096长度的私钥
openssl genrsa -des3 -out server.key 4096

2)创建一个CSR (Certificate Signing Request)
openssl req -new -key server.key -out server.csr
其中challenge password为空

这样就可以得到一个CRT证书文件,将其从页面中粘贴到本地一个文本文件,并改名为CRT后缀即可。今后要可以在Control Panel -> Tool Box ->Retrieve Certificate重新获得。


Nginx配置很简单,最重要的配置红色标识。一些PHP程序可能会使用_SERVER["HTTPS"]参数来判断当前是HTTPS还是HTTP,这个会影响程序生成的一些链接的前缀,如果检测不正确,可能会导致访问HTTPS站点时候,浏览器提示“本页不但包含安全的内容,也包含不安全的内容。是否显示不安全的内容”,而由于是采用反向代理的方式,透过Nginx访问php-cgi,而php-cgi不是以HTTPS方式运行的,所以必须要显示的制定生成参数fastcgi_param HTTPS on; 

server
{
    listen a.b.c.d:443;

    access_log /xxx/ssl.access.log main;
    error_log  /xxx/ssl.error.log;


    root /xxx/;
    index index.php index.html index.htm;


    ssl on;
    ssl_certificate /xxx/server.crt;
    ssl_certificate_key /xxx/server.key;

    ssl_session_timeout 5m;
    ssl_protocols SSLv2 SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers on;


    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        fastcgi_param HTTPS on; 
        include fastcgi_params;
    }


    location ~ /\.ht {
        deny all;
    }

}


启动试一试应该就可以了,但每次启动Nginx的时候都会提示输入私钥密码,这个可以这样解决:
1) 去除密码
openssl rsa -in server.key -out server.nopass.key

2)把Nginx的配置替换为
ssl_certificate_key /xxx/server.nopass.key;即可


经过测试,在IE 7.0.5730.11、Chrome 4.1.249.1064版本中使用正常;在Firefox 3.5.3会提示“此连接是不受信任的”,这是因为StartSSL的根证书还没有被FF认可,只是被M$和Google认可,添加个例外就可以继续访问了,加密功能是一样的,不过变得和自己的做的证书一样了。免费的不求太完美,将就用。

已有1位网友发表了看法:

sunjita 2010-06-03 23:35:59 回复
不错,下次我还vps找你要现成配置
无为而为 2010-06-04 12:46:10 回复
上面的配置已经是完整的一个SSL站点咯

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。