Https、OpenSSL自建CA證書及簽發證書、nginx單向認證、雙向認證及使用Java訪問

0.環境html

本文的相關源碼位於 https://github.com/dreamingodd/CA-generation-demo mysql

必須安裝nginx,必須安裝openssl,(用apt-get update, apt-get install來安裝比較簡單)nginx

 

1.配置和腳本git

先建立一個demo目錄(位置本身選擇,我選擇建在nginx的目錄下):github

mkdir /etc/nginx/ca-demo
cd /etc/nginx/ca-demo

修改SSL配置openssl.cnf(也多是openssl.conf,不知道在哪能夠用find -name / openssl.cnf查找)sql

將dir屬性改爲你上一步自建的目錄,不要用相對路徑,會踩坑,保存,如圖:數據庫

我喜歡自動化,因此寫了三個以下腳本,能夠直接使用:windows

ca.sh:瀏覽器

#!/bin/bash

#Create directory hierarchy.建立目錄結構
touch index.txt serial
chmod 666 index.txt serial
echo 01 >  serial
mkdir -p newcerts private

#生成RSA密鑰對 openssl genrsa
-des3 -out ./private/cakey.pem 2048 #openssl req -new -days 365 -key ./private/cakey.pem -out ca.csr #openssl ca -selfsign -in ca.csr -out ca.crt # one step.一步生成csr,crt,直接10年使用期 openssl req -new -x509 -days 3650 -key ./private/cakey.pem -out ca.crt

server.sh:安全

#!/bin/bash
# 簽發服務器證書
mkdir server
openssl genrsa -out ./server/server.key
openssl req -new -key ./server/server.key -out ./server/server.csr
openssl ca -in ./server/server.csr -cert ./ca.crt -keyfile ./private/cakey.pem -out ./server/server.crt -days 3650

client.sh:

#!/bin/bash
# 簽發client證書
mkdir client
openssl genrsa -des3 -out ./client/client.key 2048
openssl req -new -key ./client/client.key -out ./client/client.csr
openssl ca -in ./client/client.csr -cert ./ca.crt -keyfile ./private/cakey.pem -out ./client/client.crt -config "/etc/ssl/openssl.cnf"
openssl pkcs12 -export -clcerts -in ./client/client.crt -inkey ./client/client.key -out ./client/client.p12

以上三個腳本均可以在 https://github.com/dreamingodd/CA-generation-demo  找到

將以上三個腳本複製到自建demo目錄中,以下所示:

加入運行權限:

chmod +x *.sh

結果以下:

 

2.自建CA證書

運行腳本ca.sh,效果以下:

 

a.輸入密碼短語:(隨便,記住就行,我填的是"demo",須要填3次)

b.生成證書須要填入一些信息:Country Name(國家),State or Province Name(省),Locality Name(市),Organizational Name(組織名,隨便填,我填的是Choosefine Ltd),Common Name(通常填域名),其餘能夠不填。

 這樣證書就生成並自簽名了:

其中,newcerts目錄用於存放CA簽署(頒發)過的數字證書(證書備份目錄)。private目錄用於存放CA的私鑰。 文件serial和index.txt分別用於存放下一個證書的序列號和證書信息數據庫。 文件serial填寫第一個證書序列號(如10000001),以後每前一張證書,序列號自動加1。

能夠把ca.crt下載到你的windows系統的PC機上,後面會用到。 

 

3.簽發服務端證書

 運行腳本server.sh,效果以下:

最後一句是Data Base Updated,就表示成功了,要填的東西跟上一步很是類似,須要注意的是:

a.國家和省份必須和上一步同樣。

b.Organizational Name必須和上一步同樣。

c.Common Name,若是你的測試服務器有域名的話,填入域名,沒有的話隨便填一個網址,windows訪問測試時配置一下hosts就好,我這裏填的是ssl.demo.com。

d.challenge password隨便填,記住就行,我填的demo。

e.pass phrase密碼短語是CA證書的的,我生成的時候用的也是demo。

生成結果:

 

4.Nginx配置Https單向認證

 這一步我要使用上面咱們生成的證書s來配置一個安全的Https單向訪問資源連接。

首先修改nginx配置文件,

vi /etc/nginx/nginx.conf

在http中加入如下內容:

        server {
                server_name ssl.demo.com;
                listen 443;
                ssl on;
                ssl_certificate ca-demo/server/server.crt;
                ssl_certificate_key ca-demo/server/server.key;
                location / {
                        root html;
                        index index.html index.htm;
                }
        }

運行如下命令檢查和重啓nginx:

/usr/sbin/nginx -t
service nginx restart

使用IP訪問一下:

成功了,會顯示證書不安全。通常來講,若是花錢使用證書公司簽發的server.crt和server.key不會有這個問題。

這裏想解決這個問題的話須要windows本地信任咱們本身的CA證書。若是對這個問題不感興趣能夠直接跳過。

首先,將咱們第二步生成的CA證書下載到windows系統本地,雙擊打開

點擊安裝:

點擊下一步:

  

選擇自定義證書集合,點擊瀏覽:

選擇第二個,受信任的證書列表,一直下一步/完成/是的等,就能夠了。

 成功後效果如圖:

一開始那個X已經沒有了。

Status顯示OK。

若是你想看到證書集合的狀況,能夠WIN+R -> certmgr.msc查看

名字是CA證書的Common Name。

最後(若是沒有域名),修改如下hosts文件模擬一下域名:

使用域名訪問,風險提示就消失了:

  

5.簽發客戶端證書

簽發客戶端證書,用於服務端開啓了ssl的客戶端驗證時,要求客戶端對請求作加密。 

運行腳本client.sh

全部密碼處我填的全是demo。

結果以下:

到此爲止,證書的生成已經所有講完了。

 

6.Nginx配置Https雙向認證

Https雙向認證不只驗證服務端的證書,服務端也要驗證客戶端的證書;不只對客戶端的請求進行了加密,而且服務端使用的加密方案也是使用客戶端公鑰加密後發送給客戶端的。比單項認證更加安全。

我我的的理解是,單項認證防止請求被篡改,雙向認證防止請求被模擬。

題外話,Https使用了對稱加密+非對稱加密,因爲非對稱加密的效率低,不適合傳輸的數據量大的時候。因此Https的客戶端將對稱加密的密鑰用服務端的公鑰進行加密再發送給服務端,服務端用私鑰進行解密(非對稱加密),對傳輸數據自己的加密使用的密鑰是同樣的(對稱加密)。

進入正題,首先開啓服務端nginx的客戶端ssl認證,將以前加入的配置刪除,貼入新的一份:

        server {
                server_name ssl.demo.com;
                listen 443;
                ssl on;
                ssl_certificate                 ca-demo/server/server.crt;
                ssl_certificate_key             ca-demo/server/server.key;

                ssl_client_certificate          ca-demo/ca.crt;
                ssl_verify_client               on;

                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;
               }
        }

檢查並重啓,再次訪問:

顯示未發送客戶端證書。

下載client.p12文件到本地,雙擊安裝,此次安裝到我的:

關閉瀏覽器再次訪問,就有了證書選擇的界面,選擇後正常訪問。

 以前有很多網銀都是使用這種方式進行交易的。

 

7.使用Java訪問雙向認證的Https資源

下一篇再講... 

未完待續...

To be Continued...

 

下一篇在這兒:http://www.cnblogs.com/dreamingodd/p/7491098.html

 

本文的相關源碼位於 https://github.com/dreamingodd/CA-generation-demo  

 

dreamingodd原創文章,如轉載請註明出處。

相關文章
相關標籤/搜索