LNMP + SSL 实现及 IPv6 访问

刚去 StartSSL 搞了一张免费的 Class 1 证书,把某个子站点 SSL 了,以后回国会方便很多。证书申请和实现都非常简单。LNMP 已经有编译 SSL 模块了,只要生成密钥、CSR、证书,并更新 nginx 配置即可完成修改。

IPv6 的话,LNMP 已经编译相关模块了,经过一番百谷很容易就配置好了,然后搞定 DNS 和 Cloudflare 就可以上线了。

具体过程:
访问 https://www.startssl.com/?app=12 点击 Express Lane 开始申请证书,按照提示操作即可。在运行到 “Generate Private Key” 这一步时,点击 “Skip” 跳过此步骤。我选择在服务器上直接生成密钥,并使用证书请求申请证书。

SSH 到服务器,进入 nginx 的 conf 目录(通常在 /usr/local/nginx/conf)。将证书放在这里,一会儿配置文件里面引用会比较方便。下面以 “example.com” 域名为例,在终端里运行:

openssl genrsa -out example_com.pem 2048

生成私钥证书,然后再用这个证书生成一个证书请求:

openssl req -new -key example_com.pem -out example_com.csr

此过程中会询问一些细节,如:

Country Name (2 letter code) [XX]: CN //这个是国家代码,中国是CN
State or Province Name (full name) [Some-State]: Beijing //这个是省份名
Locality Name (eg, city) []: Beijing //这个是城市名
Organization Name (eg, company) [Internet Widgits Pty Ltd]: John Doe //这里填上你的英文大名
Common Name (eg, YOUR name) []: example.com //这里填上你的域名(顶级,不带二级域名)
Email Address []: webmaster@example.com//这里是邮件地址

请注意以上信息必须与之前申请 StartSSL 时填写的信息一致。当然,你申请 StartSSL 的信息必须真实可靠,虽然人家不会去跨省,但是虚假信息可能导致证书吊销等等问题。本来证书就是验证身份信息的,不填真实信息干脆不要申请好了。

完成上述过程后将会生成一个证书申请文件: example_com.csr,运行:

cat example_com.csr

就会显示一段以 “-----BEGIN CERTIFICATE REQUEST-----” 开头,以 “-----END CERTIFICATE REQUEST-----” 结尾的文字,将此段复制到 StartSSL 的向导里面的那个大框中,继续申请向导。向导之后还会问你要证书一同认证的一个子域名(免费证书只能用于根域名和一个自己指定的子域名,此文以 www.example.com 举例)。通过验证后(有时可能需要人工验证,几个小时时间吧)即可得到以 “-----BEGIN CERTIFICATE-----” 开头和 “-----END CERTIFICATE-----” 结束的证书内容,运行:

nano example_com.crt

打开一个文本编辑器,将证书内容粘贴到文件中并保存备用。

接下来是配置 nginx,打开对应的 vhost 配置文件,将文件当前的所有内容复制一遍放在最后面,然后在 “server” 段加上:

ssl on;
ssl_certificate example_com.crt;
ssl_certificate_key example_com.pem;

将第一行的 listen 端口号修改为 443,并在 “location ~ .*\.(php|php5)?$” 段加上:

fastcgi_param HTTPS on;

这样可以使站点在是否加密的情况下都可以访问。当然你也可以将监听 80 端口的那一段直接修改为:

server
{
listen 80;

server_name www.example.com;
rewrite ^/(.*) https://www.example.com/$1 permanent;
}

即可强制页面以加密形式访问。当然,如果页面含有非站内链接的内容(比如说外站图片之类的东西),浏览器会警告加密不完全云云,这个不太重要啦。最后,运行:

/usr/local/nginx/sbin/nginx -t

检查配置文件完整性,如果没有报错即可重新加载 nginx 服务应用修改,到浏览器里面试一下咯。如果你在使用 Firefox 浏览,证书可能会报错,请到 StartSSL 下载他们的根证书。其他浏览器似乎已经含有 StartCom(就是证书的提供商)的 CA 证书了所以不会报错。

至于 IPv6 的修改嘛,一句话:将所有 nginx 的配置文件中监听的端口改为:

[::]:80

就行了,意思就是说监听所有 IPv4/IPv6 的 80 端口。对应的 SSL 配置文件要把这里的 80 改为 443。当然啦,nginx 必须要将 IPv6 模块编译进去才行。终端输入:

/usr/local/nginx/sbin/nginx -V

如果输出内容包含 “--with-ipv6” 那就是已经编译好了(比较新的 LNMP 包已经编译了这个模块)。如果没有这个参数就得重新编译 nginx 了,请自行谷歌。

还有一个问题,当配置了 IPv6 之后,似乎修改配置文件然后重新加载服务已经不行了,需要停止 nginx 服务再启动服务,有时候甚至要重启服务器才行。

服务端搞定以后,去 DNS 服务商那里绑定服务器的 IPv6 地址到一个 AAAA 记录上,生效以后就可以通过 IPv6 访问了。

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.