最近剛接觸到了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:\wnmp\OpenSSL-Win64文件夾中。
2. 安裝ActivePerl (此軟件目的為了解析pl文件,部分系統不安裝也可以實現本教程的功能,安裝該軟件目的為了學習perl)。
下載地址:http://www.activestate.com/activeperl/downloads/ (根據系統選擇win32或者win64版本下載安裝)。
3. 配置環境變量
在環境變量中添加環境變量
變量名: OPENSSL_HOME 變量值:C:\wnmp\OpenSSL-Win64\bin; (變量值為openssl安裝位置)
在path變量結尾添加如下 : %OPENSSL_HOME%;
4. 生成證書
(1) 首先在 nginx安裝目錄中創建ssl文件夾用於存放證書。比如我的文件目錄為 C:\wnmp\nginx\ssl
以管理員身份進入命令行模式,進入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\nginx\conf
找到該文件中如下代碼的位置進行修改: 保證本機的端口不被占用 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的理解就上了一個檔次了。