最近刚接触到了tomcat结合nginx做网站的负载均衡。之前对tomcat搭配nginx实现负载均衡也写过,在上一篇的博客中,最近遇到的问题是要在http的基础上支持https。也就是支持加密的请求。在网上也查了很多的资料,下面这篇个人觉着说的换很不错,记录一下。讲解了如何生成https证书,如何在自己的nginx服务器上配置支持https。
首先要说明为什么要实现https?
HTTP全名超文本传输协议,客户端据此获取服务器上的超文本内容。超文本内容则以HTML为主,客户端拿到HTML内容后可根据规范进行解析呈现。因此,HTTP主要负责的是“内容的请求和获取”。问题就出在这部分。行监控、劫持、阻挡等行为很容易导致网站泄密,一些关键参数比如登录密码开发者会在客户端进行MD5加密,不过互联网所承载的机密信息远不只是密码,搜索内容同样属于敏感信息。现如今,百度、谷歌、Github等网站已经全站启用https,https就像是给网站上了一个“锁”,HTTPS做的就是给请求加密,让其对用户更加安全。对于自身而言除了保障用户利益外,还可避免本属于自己的流量被挟持,以保护自身利益。所以在我看来,终有一天HTTPS会实现全网普及。
这个介绍言简意赅,我们知道了平常我们在访问一些银行或者支付的网站以及12306的时候发现里面都使用了https,上面讲解了之后大家应该对https是什么,干什么的有个了解了。下面进入正题,先说说这个证书是怎么生成的。
步骤:
1. 安装Openssl
下载地址:http://slproweb.com/products/Win32OpenSSL.html (根据系统选择32位或者64位版本下载安装)。
下载完成后,进行安装,我安装在了 C:wnmpOpenSSL-Win64文件夹中。
2. 安装ActivePerl (此软件目的为了解析pl文件,部分系统不安装也可以实现本教程的功能,安装该软件目的为了学习perl)。
下载地址:http://www.activestate.com/activeperl/downloads/ (根据系统选择win32或者win64版本下载安装)。
3. 配置环境变量
在环境变量中添加环境变量
变量名: OPENSSL_HOME 变量值:C:wnmpOpenSSL-Win64in; (变量值为openssl安装位置)
在path变量结尾添加如下 : %OPENSSL_HOME%;
4. 生成证书
(1) 首先在 nginx安装目录中创建ssl文件夹用于存放证书。比如我的文件目录为 C:wnmp ginxssl
以管理员身份进入命令行模式,进入ssl文件夹。 命令为: cd c:/wnmp/nginx/ssl
(2) 创建私钥
在命令行中执行命令: openssl genrsa -des3 -out lee.key 1024 (lee文件名可以自定义),如下图所示:
输入密码后,再次重复输入确认密码。记住此密码,后面会用到。
(3)创建csr证书
在命令行中执行命令: openssl req -new -key lee.key -out lee.csr (key文件为刚才生成的文件,lee为自定义文件名)
如上图所示,执行上述命令后,需要输入信息。输入的信息中最重要的为 Common Name,这里输入的域名即为我们要使用https访问的域名。
以上步骤完成后,ssl文件夹内出现两个文件:
ps : 如果你觉着上面这样一步步的太费劲,可以直接使用一个命令来实现,主要是要将你的网站信息进行一个说明,然后生成一个csr的文件,然后将这个包含有你网站信息的csr文件交给认证机构,认证机构会根据你的csr中的信息生成一个crt的证书文件。下面是一个命令来执行上面的分步的操作。
在openssl的认证中,
普通的 SSL 证书认证分两种形式,一种是 DV(Domain Validated),还有一种是 OV (Organization Validated),前者只需要验证域名,后者需要验证你的组织或公司,在安全性方面,肯定是后者要好。
无论你用 DV 还是 OV 生成私钥,都需要填写一些基本信息,这里我们假设如下:
域名,也称为 Common Name,因为特殊的证书不一定是域名:example.com
组织或公司名字(Organization):Example, Inc.
部门(Department):可以不填写,这里我们写Web Security
城市(City):Beijing
省份(State / Province):Beijing
国家(Country):CN
加密强度:2048 位,如果你的机器性能强劲,也可以选择 4096 位
按照以上信息,使用 OpenSSL 生成 key 和 csr 的命令如下
openssl req -new -newkey rsa:2048 -sha256 -nodes -out example_com.csr -keyout example_com.key -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Inc./OU=Web Security/CN=example.com"
PS:如果是泛域名证书,则应该填写*.example.com
你可以在系统的任何地方运行这个命令,会自动在当前目录生成example_com.csr和example_com.key这两个文件。我们看一下这个文件中的内容,其实就是使用rsa对你的网站信息进行加密后的一段加密字符串:
-----BEGIN CERTIFICATE REQUEST----- MIICujCCAaICAQAwdTELMAkGA1UEBhMCQ04xEDAOBgNVBAgTB0JlaWppbmcxEDAO BgNVBAcTB0JlaWppbmcxFTATBgNVBAoTDEV4YW1wbGUgSW5jLjEVMBMGA1UECxMM V2ViIFNlY3VyaXR5MRQwEgYDVQQDEwtleGFtcGxlLmNvbTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAPME+nvVCdGN9VWn+vp7JkMoOdpOurYMPvclIbsI iD7mGN982Ocl22O9wCV/4tL6DpTcXfNX+eWd7CNEKT4i+JYGqllqP3/CojhkemiY SF3jwncvP6VoST/HsZeMyNB71XwYnxFCGqSyE3QjxmQ9ae38H2LIpCllfd1l7iVp AX4i2+HvGTHFzb0XnmMLzq4HyVuEIMoYwiZX8hq+kwEAhKpBdfawkOcIRkbOlFew SEjLyHY+nruXutmQx1d7lzZCxut5Sm5At9al0bf5FOaaJylTEwNEpFkP3L29GtoU qg1t9Q8WufIfK9vXqQqwg8J1muK7kksnbYcoPnNgPx36kZsCAwEAAaAAMA0GCSqG SIb3DQEBBQUAA4IBAQCHgIuhpcgrsNwDuW6731/DeVwq2x3ZRqRBuj9/M8oONQen 1QIacBifEMr+Ma+C+wIpt3bHvtXEF8cCAJAR9sQ4Svy7M0w25DwrwaWIjxcf/J8U audL/029CkAuewFCdBILTRAAeDqxsAsUyiBIGTIT+uqi+EpGG4OlyKK/MF13FxDj /oKyrSJDtp1Xr9R7iqGCs/Zl5qWmDaLN7/qxBK6vX2R/HLhOK0aKi1ZQ4cZeP7Mr 8EzjDIAko87Nb/aIsFyKrt6Ze3jOF0/vnnpw7pMvhq+folWdTVXddjd9Dpr2x1nc y5hnop4k6kVRXDjQ4OTduQq4P+SzU4hb41GIQEz4 -----END CERTIFICATE REQUEST-----
这个 CSR 文件就是你需要提交给 SSL 认证机构的,当你的域名或组织通过验证后,认证机构就会颁发给你一个example_com.crt
而example_com.key是需要用在 Nginx 配置里和example_com.crt配合使用的,需要好好保管,千万别泄露给任何第三方。
哈哈哈 如果我们就是自己简单的学习,想必我们是不会提交给认证机构的,别着急,不提交给认证机构我们也能自己生成证书,只是这个证书在我们使用的时候回提示不是浏览器可以接受的,也就是不安全的,但是我们自己学习用没有关系。
这里说一点哈,如果你在设置证书的时候设置了密码,这里是如何去除密码。
在加载SSL支持的Nginx并使用上述私钥时除去必须的口令,否则会在启动nginx的时候需要输入密码。
复制lee.key并重命名为lee.key.org
可以使用此命令行,也可以使用鼠标操作 copy example.key example.key.org
去除口令,在命令行中执行此命令: openssl rsa -in example.key.org -out example.key (lee为自定义文件名)
如下图所示,此命令需要输入刚才设置的密码。
(5)生成crt证书
在命令行中执行此命令: openssl x509 -req -days 365 -in example.csr -signkey example.key -out example.crt (lee为自定义文件名)
证书生成完毕,ssl文件夹中一共生成如下4个文件,我们需要使用到的是example.crt和example.key。
上面是我们生成我们的证书的一个过程,下面看看如何在nginx中配置来支持https。
修改nginx.conf文件
nginx.conf文件位于:C:wnmp ginxconf
找到该文件中如下代码的位置进行修改: 保证本机的端口不被占用 443 和 80
# HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #}
修改为:
# HTTPS server # #modify by lee 20160907 for https -s server { listen 443 ssl; server_name www.example.com; ssl_certificate C:/wnmp/nginx/ssl/example.crt; ssl_certificate_key C:/wnmp/nginx/ssl/example.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root C:/wnmp/example; index index.html index.htm index.php; } root C:/wnmp/example; fastcgi_pass 127.0.0.1:9001; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } #modify by lee 20160907 for https -s
重启nginx。
在浏览器中,访问 https://www.example.com。发现出现证书认证,并能够成功访问。(www.example.com为生成证书时,Common Name输入的域名)
上面这是一个生成证书和如何结合nginx使用的简单说明,但是我们相信在这个过程中肯定会遇到很多很多的坑,遇到一个填一个吧,把所有的坑填了我认为你对https和nginx的理解就上了一个档次了。