为nginx配置https并自签名证书

一、把证书准备好。

步骤与使用OpenSSL自签发服务器https证书所述大同小异。在这里再重复一次。

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签名认证

在这里,假设网站域名为blog.creke.net

生成blog.creke.net证书私钥:

openssl genrsa -des3 -out blog.creke.net.pem 1024

制作解密后的blog.creke.net证书私钥:

openssl rsa -in blog.creke.net.pem -out blog.creke.net.key

生成签名请求:

openssl req -new -key blog.creke.net.pem -out blog.creke.net.csr

在common name中填入网站域名,如blog.creke.net即可生成改站点的证书,同时也可以使用泛域名如*.creke.net来生成所有二级域名可用的网站证书。

用CA进行签名:

openssl ca -policy policy_anything -days 1460 -cert ca.crt -keyfile ca.key -in blog.creke.net.csr -out blog.creke.net.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的内容粘贴到blog.creke.net.crt后面。这个比较重要!因为不这样做,可能会有某些浏览器不支持。

好了,现在https需要到的网站私钥blog.creke.net.key和网站证书blog.creke.net.crt都准备完毕。接下来开始配置服务端。

二、配置nginx

新开一个虚拟主机,并在server{}段中设置:

listen 443;

ssl on;

ssl_certificate /path/to/blog.creke.net.crt;

ssl_certificate_key /path/to/blog.creke.net.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官方的关于https的文档,可以作为参考。

18 comments

  1. qyc says:

    非常棒,根据你的这篇文章,直接搞定了,谢谢~~

    1. creke says:

      不客气O(∩_∩)O~

  2. zaykl says:

    支持一个..

  3. 欢迅干线 says:

    非常感谢,通过这文章把Https应用到欢迅干线(joyit.me)上。

  4. Anonymous says:

    thanks!

  5. testfor says:

    CA私钥
    制作解密后的blog.creke.net证书私钥
    这两个有什么作用?
    谢谢

    1. creke says:

      这是nginx配置中用到的,因为nginx支持的是解密后的格式

  6. 陈佳 says:

    谢谢分享,我去试试看,我也想自签证书玩。

  7. 王克亚 says:

    感谢你的分享

  8. shalk says:

    感谢楼主,配置成功

  9. zhangdong says:

    非常好!感谢博主!按步骤配置成功了
    但是有一点要改动,
    echo “01” > CA/serial
    里面是中文引号,我这样操作后失败了,然后改成英文引号
    (echo "01" > CA/serial)
    又试了一次,成功了

    1. creke says:

      很高兴对你有帮助:)
      引号问题是wordpress自作聪明,你看你的评论也被自动转换了,这是个历史遗留问题:(

    2. zhangdong says:

      果然……还没注意到,我发的引号也变成中文了

  10. fusheng says:

    昨天执行签名命令时,一直出现“I am unable to access the ../../CA/newcerts directory”按照上面的方法改了还是不行,然后把dir = ./CA改成绝对路径dir=/etc/pki/tls/CA就好了。
    冒昧问一下,博主你的文章能转载吗?

    1. creke says:

      可以的,转载请注明出处

  11. yew惹we'r says:

    ②yeertwerf'g'we'r

  12. yew惹we'r says:

    为什么有的网站教程生成证书只用4条就可以了,有什么区别?
    openssl genrsa -des3 -out ca.key 2048
    openssl rsa -in ca.key -out ca.key
    openssl req -new -key ca.key -out ca.csr
    openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt
    生成私钥>根据私钥生成请求文件>根据私钥与请求文件生成证书
    最后拿着私钥与证书配置nginx

Leave a comment