- A+
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. 登录检查
3. Nginx同时支持http和https
说明:我在配置同时支持http和https的时遇到的问题有好几个,如果都配置在一个server标签里rewrite跳转会有问题(浏览器报错重定向次数过多),问了度娘,试了好一会儿~坑啦好一会儿~,最后还是配置了两个server标签(80和443),然后在80端口的server里面做了一个rewrite跳转到https的,这样就可以正常访问了。也许还有别的更好的办法我不知道,由于本人学艺不精,目前只能用的这种办法了......,如果还有别的更好的办法希望大家能分享出来,一起学习一下 ^ _ ^!!!
既然是https,就完全没必要http传输数据啦.我们必须把所有http请求转发到https,把http重定向到https使用了nginx的重定向命令。那么应该如何写重定向?之前老版本的nginx可能使用了类似的格式:“rewrite ^/(.*) https://server_name1 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-adminscheme://hosturi/ 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_namerequest_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
解决方法:对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