SSL證書及HTTPS協議
SSL 證書是一種數字證書,它使用 Secure Socket Layer 協議在瀏覽器和 Web 服務器之間建立一條安全通道,從而實現:
1、數據信息在客戶端和服務器之間的加密傳輸,保證雙方傳遞信息的安全性,不可被第三方竊聽;
2、用戶可以通過服務器證書驗證他所訪問的網站是否真實可靠。
要設置安全服務器,使用公共鑰創建一對公私鑰對。大多數情況下,發送證書請求(包括自己的公鑰),你的公司證明材料以及費用到一個證書頒發機構(CA).CA驗證證書請求及您的身份,然后將證書返回給您的安全服務器。
但是內網實現一個服務器端和客戶端傳輸內容的加密,可以自己給自己頒發證書,只需要忽略掉瀏覽器不信任的警報即可!
由CA簽署的證書為您的服務器提供兩個重要的功能:
- 瀏覽器會自動識別證書並且在不提示用戶的情況下允許創建一個安全連接
- 當一個CA生成一個簽署過的證書,它為提供網頁給瀏覽器的組織提供身份擔保。
- 多數支持ssl的web服務器都有一個CA列表,它們的證書會被自動接受。當一個瀏覽器遇到一個其授權CA並不在列表中的證書,瀏覽器將詢問用戶是否接受或拒絕連接
生成SSL證書
# 生成一個RSA密鑰
$ openssl genrsa -des3 -out 33iq.key 1024
# 拷貝一個不需要輸入密碼的密鑰文件
$ openssl rsa -in 33iq.key -out 33iq_nopass.key
# 生成一個證書請求
$ openssl req -new -key 33iq.key -out 33iq.csr
# 自己簽發證書
$ openssl x509 -req -days 365 -in 33iq.csr -signkey 33iq.key -out 33iq.crt
第3個命令是生成證書請求,會提示輸入省份、城市、域名信息等,重要的是,email一定要是你的域名后綴的。這樣就有一個 csr 文件了,提交給 ssl 提供商的時候就是這個 csr 文件。當然我這里並沒有向證書提供商申請,而是在第4步自己簽發了證書。
HTTPS 是以安全為目標的 HTTP 通道,即 HTTP 下加入 SSL 加密層。HTTPS 不同於 HTTP 的端口,HTTP默認端口為80,HTTPS默認端口為443。
apache,nginx配置HTTPS
nginx配置,/etc/nginx/nginx.conf 加入:
server {
listen 80; server_name kwdst.welcom.cn; rewrite ^ https://$http_host$request_uri? permanent; } server { listen 443 ssl; server_name kwdst.welcom.cn ssl on; ssl_certificate /etc/nginx/cert/2ceo.pem; //路徑 ssl_certificate_key /etc/nginx/cert/2ceo.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { root /var/www/static; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; } }
Apache 可直接在apache2.conf中加入也可以在/etc/apache/sites-enabled/創建 .conf后綴的配置文件.
<VirtualHost *:80>
ServerName kwdbiz.welcom.cn
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/carku/public ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined RewriteEngine on RewriteCond %{HTTPS} !=on RewriteRule ^(.*)?$ https://%{SERVER_NAME}$1 [L,R]</VirtualHost> <VirtualHost *:443> ServerName kwdbiz.welcom.cn ServerAdmin webmaster@localhost DocumentRoot /var/www/html/carku/public ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/apache2/cert/2ceo/2ceo.pem SSLCertificateKeyFile /etc/apache2/cert/2ceo/2ceo.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> </VirtualHost>
重啟apache/nginx即可訪問HTTPS 網站.
使用HTTPS協議安全但對服務器來說是很大的負載開銷,所以一般對一些安全有要求的操作使用HTTPS安全加密,如:交易,用戶密碼相關等.
在https server下加入如下配置:
if ($uri !~* "/login.php$") { rewrite ^/(.*)$ http://$host/$1 redirect; }
在http server下加入如下配置:
if ($uri ~* "/login.php$") { rewrite ^/(.*)$ https://$host/$1 redirect; }
這樣一來,用戶會且只會在訪問login.php的情況下,才會通過https訪問。