Nginx使用ssl模块配置支持https访问4 min read

  • A+
所属分类:Nginx

1. 开篇简介

 

    众所周知,我们在互联网上冲浪,一般都是使用的http协议(超文本传输协议),默认情况下数据是明文传送的,这些数据在传输过程中都可能会被捕获和窃听,因此是不安全的。https可以说是http协议的安全版,就是为了满足对安全性要求比较高的用户而设计的。如果您的邮件中有敏感数据,不希望被人窃听;如果您不希望被钓鱼网站盗用帐号信息,如果您希望您在使用邮箱的过程中更安全,那么我们推荐您使用https安全连接。

    默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖于OpenSSL库和一些引用文件,通常这些文件并不在同一个软件包中。通常这个文件名类似libssl-dev

    以下配置会将https://www.linuxgogo.com改为https://www.linuxgogo.com的访问方式,并对两种都支持。

    提示:https证书需要申请,可以到腾讯云进行申请,我申请的是免费一年的。本文配置的是自己生成的,所以网址上面不会有小绿锁,必须要有配置第三方认可的证书才会变成小绿锁,如果是wordpress网站安装好了证书,必须下载个插件(Easy HTTPS (SSL) Redirection)将http强制转换到https才行,不然没办法变成小绿锁。

    https-ssl证书申请网址(腾讯免费一年的):https://console.cloud.tencent.com/ssl

  

2. 配置Nginx支持https

    

  

1. 检查我们得nginx编译时是否有编译--with-http_ssl_module参数

/application/nginx/sbin/nginx -V
#说明:以上命令是nginx的启动命令和路径,-V参数是查看nginx的版本以及编译参数

  

2. 下载必要的软件包

yum -y install openssl openssl-devel
#提示:以上的openssl以及devel包一般情况下我们得服务器都会安装,但是这里为了漏装的情况下再次安装一遍,并无影响

  

3.创建私钥及证书存放目录

mkdir /application/nginx/conf/certs       #<== 目录可自行定义与存放
cd /application/nginx/conf/certs

    

4. 生成私钥

openssl genrsa -des3 -out server.key 123456
#提示:这里需要输入一个口令,在命令后面直接添加即可,我这里输入的是123456,如果不
#直接添加会以交互的方式输入,需要输入两次;私钥的名字也是可以自定义的;因为该私钥以
#后要给nginx使用。每次reload nginx配置时候都要你验证这个PAM密码的,很不方便,所以
#这个密码我们可在后面的步骤中删除。

  会生成如下文件:

[root@zyl certs]# ll
total 4
-rw-r--r-- 1 root root 963 Dec 29 20:22 server.key

  

5. 除去密码以便验证时不需要密码

[root@zyl certs]# cp server.key server.key.bak      #<== 对私钥文件进行备份
[root@zyl certs]# openssl rsa -in server.key -out server.key       #<== 对其进行去除操作
Enter pass phrase for server.key:123456             #<== 去除密码时也需要输入一下私钥密码
writing RSA key

   

6. 生成证书颁发机构,用于颁发公钥,最后标记证书使用上述私钥和CSR,以下一路回车即可

[root@zyl certs]# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key: 123456 
#说明:如果没有在上面去除密码会提示输入私钥密码,如果在上面一部去除掉私钥密码的,这一步将不会出现
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn                #<== 国家名字(可自行定义)
State or Province Name (full name) []: BeiJing      #<== 省名称(全称)
Locality Name (eg, city) [Default City]: BeiJing    #<== 地点名称(例如,城市)
Organization Name (eg, company) [Default Company Ltd]:smht    #<== 组织名称(如公司)
Organizational Unit Name (eg, section) []:          #<== 组织单位名称(例如,部分)
Common Name (eg, your name or your server's hostname) []:zyl    #<== 常见的名字(例如,您的姓名或您的服务器的主机名)
Email Address []:1097857032@qq.com                  #<== 电子邮件地址
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456                      #<== 私钥保护密码
An optional company name []:it                      #<== 一个可选的公司名称  

  

生成的证书文件如下“

[root@zyl certs]# ll server.csr
-rw-r--r-- 1 root root 692 Dec 29 20:27 server.crt

现在可以查看下生成了多少证书文件,如下:

[root@zyl certs]# ll
total 16
-rw-r--r-- 1 root root 599 Dec 29 22:22 server.csr
-rw-r--r-- 1 root root 887 Dec 29 22:22 server.key
-rw-r--r-- 1 root root 951 Dec 29 22:22 server.key.bak

  

7.标记证书使用上述私钥和CSR

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

生成如下文件:

[root@zyl certs]# ll server.crt
-rw-r--r-- 1 root root 749 Dec 29 21:09 server.crt

    

8.配置nginx配置文件,让其包含新标记的证书和私钥

[root@zyl ~]# vim /application/nginx/conf/nginx.conf
server {
......
      listen       443;
      server_name  www.linuxgogo.com;
......
      ssl                  on;
      ssl_certificate      /application/nginx/conf/certs/server.crt;
      ssl_certificate_key  /application/nginx/conf/certs/server.key;
      ssl_session_timeout  5m;
      ssl_protocols  SSLv2 SSLv3 TLSv1;
      ssl_ciphers  HIGH:!aNULL:!MD5;
      ssl_prefer_server_ciphers   on;
......
}

    

配置文件参数解释如下:

listen      443;       #<== 监听https的端口(https端口为443)
#说明:此配置存放位置为nginx配置文件的server标签

ssl                  on;            #<== 开启ssl
ssl_certificate      /application/nginx/conf/certs/server.crt;    #<== 证书位置
ssl_certificate_key  /application/nginx/conf/certs/server.key;    #<== 私钥位置
ssl_session_timeout  5m;            #<== 缓存时间
ssl_protocolsSSLv2 SSLv3 TLSv1;     #<== 指定密码为openssl支持的格式
ssl_ciphersHIGH:!aNULL:!MD5;        #<== 密码的加密方式
ssl_prefer_server_ciphers   on;     #<== 依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
#说明:以上配置存放文件为http、server标签均可
#Nginx下SSL配置解释:http://www.hatoko.net/nginx/nginx-ssl.html

      

9. 重启nginx服务器

/application/nginx/sbin/nginx -t            #<== 检查语法
/application/nginx/sbin/nginx -s reload     #<== 优雅重启

   

10. 登录检查

Nginx使用ssl模块配置支持https访问

  

3. Nginx同时支持httphttps

  

说明:我在配置同时支持http和https的时遇到的问题有好几个,如果都配置在一个server标签里rewrite跳转会有问题(浏览器报错重定向次数过多),问了度娘,试了好一会儿~坑啦好一会儿~,最后还是配置了两个server标签(80和443),然后在80端口的server里面做了一个rewrite跳转到https的,这样就可以正常访问了。也许还有别的更好的办法我不知道,由于本人学艺不精,目前只能用的这种办法了......,如果还有别的更好的办法希望大家能分享出来,一起学习一下  ^ _ ^!!!

既然是https,就完全没必要http传输数据啦.我们必须把所有http请求转发到https,把http重定向到https使用了nginx的重定向命令。那么应该如何写重定向?之前老版本的nginx可能使用了类似的格式:“rewrite ^/(.*) https://$server_name$1 permanent;"现在nginx新版本已经换了一种写法,下面的两个server标签的完整写法。

参考:https://www.cnblogs.com/phpper/p/6441475.html

  

第一步:配置第一个server标签https的443端口

server {
    listen       443 ssl;
    server_name  www.linuxgogo.com linuxgogo.com;
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;

    ssl                  on;
    ssl_certificate      1_www.linuxgogo.com_bundle.crt;
    ssl_certificate_key  2_www.linuxgogo.com.key;
    ssl_session_timeout  5m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers   on;

    location / {
       root   html/blog;
       index  index.php index.html index.htm;

       if (-f $request_filename/index.html){
           rewrite (.*) $1/index.html break;
          }
       if (-f $request_filename/index.php){
           rewrite (.*) $1/index.php;
          }
       if (!-f $request_filename){
           rewrite (.*) /index.php;
          }
    }

    location ~ .*\.(php|php5)?$ {
        root   html/blog;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
    error_page   500 502 503 504  /50x.html;
}

    

第二步. 配置第二个server标签,将访问到的http请求重定向到https上面

server {
    listen 80;
    server_name  www.linuxgogo.com linuxgogo.com;
    rewrite ^/(.*) https://$server_name$request_uri? permanent;    #在http的server标签里配置跳转https 
}

  

第三步:配置好重启

nginx -t
nginx -s reload

   

4. 报错总结

     

1.在重启nginx时报错如下:

[emerg] 10464#0: unknown directive "ssl" in /usr/local/nginx-0.6.32/conf/nginx.conf:74

  

   报错原因:没有将ssl模块编译进nginx,在configure的时候加上“--with-http_ssl_module”即可。

   解决方法:对nginx重新编译,编译参数如下:

#第一步:先使用-V参数查看原有编译参数
[root@zyl ~]# /application/nginx/sbin/nginx -V
nginx version: nginx/1.9.9
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --user=nginx --group=nginx --prefix=/application/nginx --with-http_stub_status_module

#第二步:进入nginx编译目录重新编译
[root@zyl ~]# cd /home/soft/nginx-1.9.9/
[root@zyl nginx-1.9.9]# ./configure --user=nginx --group=nginx --prefix=/application/nginx \
--with-http_stub_status_module --with-http_ssl_module
[root@zyl nginx-1.9.9]# make   #千万不要make install,因为我们只编译不安装(安装就会覆盖)
 
#第三步:我们编译的只是要的一个他的nginx这个程序文件,编译好之后我们将nginx编译好的替换掉旧的即可
#这个nginx文件在nginx源目录的objs/下,将其替换掉即可,然后重启nginx
cp /nginx源目录/objs/nginx /nginx工作目录/sbin/

#第四步:再次查看重新编译的参数
/nginx工作目录/sbin/nginx -V

   


    

zhaoyulin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: