1 最后由 cz (2014-03-31 09:31:42) 编辑

主题: nginx https自签名证书

自己用的一个页面,只为安全,上https,网上copy,稍加修改和补充。留着备用

一、把证书准备好。
1、制作CA证书:
ca.key CA私钥:

openssl genrsa -des3 -out ca.key 2048

制作解密后的CA私钥(一般无此必要):

openssl rsa -in ca.key -out ca_decrypted.key

ca.crt CA根证书(公钥):

openssl req -new -x509 -days 7305 -key ca.key -out ca.crt

2、制作生成网站的证书并用CA签名认证
在这里,假设网站域名为adm.de3eb.cn
生成adm.de3eb.cn证书私钥:

openssl genrsa -des3 -out adm.de3eb.cn.pem 1024

制作解密后的adm.de3eb.cn证书私钥:

openssl rsa -in adm.de3eb.cn.pem -out adm.de3eb.cn.key

生成签名请求:

openssl req -new -key adm.de3eb.cn.pem -out adm.de3eb.cn.csr

在common name中填入网站域名,如adm.de3eb.cn即可生成改站点的证书,同时也可以使用泛域名如*.de3eb.cn来生成所有二级域名可用的网站证书。
用CA进行签名:

openssl ca -policy policy_anything -days 1460 -cert ca.crt -keyfile ca.key -in adm.de3eb.cn.csr -out adm.de3eb.cn.crt

其中,policy参数允许签名的CA和网站证书可以有不同的国家、地名等信息,days参数则是签名时限。
如果在执行签名命令时,出现“I am unable to access the ../../CA/newcerts directory”
修改/etc/pki/tls/openssl.cnf中“dir = ./CA”
然后:

mkdir -p CA/newcerts
touch CA/index.txt
touch CA/serial
echo “01″ > CA/serial

再重新执行签名命令。
最后,把ca.crt的内容粘贴到adm.de3eb.cn.crt后面。这个比较重要!因为不这样做,可能会有某些浏览器不支持。
好了,现在https需要到的网站私钥adm.de3eb.cn.key和网站证书adm.de3eb.cn.crt都准备完毕。接下来开始配置服务端。
二、配置nginx
新开一个虚拟主机,并在server{}段中设置:

listen 443;
ssl on;
ssl_certificate /etc/nginx/cert/adm.de3eb.cn.crt;
ssl_certificate_key /etc/nginx/cert/adm.de3eb.cn.key;

其中的路径是刚刚生成的网站证书的路径。
然后使用一下命令检测配置和重新加载nginx:
检测配置:

nginx -t

重新加载:

nginx -s reload

三、优化nginx配置
1、优化nginx性能
在http{}中加入:

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

据官方文档所述,cache中的1m可以存放4000个session。
在配置https的虚拟主机server{}中加入:

keepalive_timeout 70;

2、有时候,会发现,在phpMyAdmin等程序登入后会错误地跳转http的问题。解决方法是定位至“location ~ .*\.(php|php5)?${}”在include fcgi.conf;或者在fastcgi_param配置后面加上:

fastcgi_param HTTPS on;
fastcgi_param HTTP_SCHEME https;

nginx.org/en/docs/http/configuring_https_servers.htmlocs/http/configuring_https_servers.html是nginx官方的关于https的文档,可以作为参考。
3、强制使用https访问

server {
    listen       80;
    server_name  adm.de3eb.cn;
    rewrite ^(.*)$  https://$host$1 permanent;
}

server {
    #listen      80;
    listen       443 ssl;
    server_name  adm.de3eb.cn;

... ...