使用openssl生成自簽名證書以及nginx ssl雙向驗證

 

1、服務器端證書生成

一、生成服務器端的私鑰

openssl genrsa -des3 -out server.key 2048nginx

 

命令完成後會提示讓輸入密碼,這個密碼是經過des3(也能夠採用其餘加密算法)加密此密鑰文件的,若是其餘程序須要讀取這個文件,須要輸入密碼算法

openssl rsa -in server.key -out server.keyshell

執行這個命令後,NGINX引用此文件不須要輸入密碼瀏覽器

二、經過server.key生成證書

openssl req -new -key server.key -out server.csr服務器

 

按照相關提示,填入證書相關基本信息,生成的證書經過CA簽名後造成服務端本身的證書session

(Certificate Signing Request(CSR))app

2、客戶端證書生成

一、生成客戶端私鑰

 openssl genrsa -des3 -out client.key 2048加密

二、經過client.key生成客戶端證書

openssl req -new -key client.key -out client.csrspa

3、自簽名

生成的csr文件必需要通過CA簽名才能造成本身的證書,咱們能夠經過第三方權威認證機構進行簽名,可是這個須要收費,咱們製做自簽名根證書code

一、製做ca key文件和ca根證書

openssl req -new -x509 -keyout ca.key -out ca.crt

二、簽署證書配置文件

查看/etc/pki/tls/openssl.cnf文件 ,查看dir是否是指向dir= /etc/pki/CA 若是不是,請修改

 

touch /etc/pki/CA/{index.txt,serial}

這個是根據openssl.cnf中的配置,要求生成的文件

----------------------------------

 

dir             = /etc/pki/CA           # Where everything is kept

certs           = $dir/certs            # Where the issued certs are kept

crl_dir         = $dir/crl              # Where the issued crl are kept

database        = $dir/index.txt        # database index file.

-------------------------------

echo 01 > /etc/pki/CA/serial

三、用第一步製做的證書,對服務器證書和客戶端證書進行簽名

 openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

 

 openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key

 至此證書籤名已經所有完畢。

4、證書導出

        因爲咱們生成的客戶端證書是須要用在各個地方的,例如在瀏覽器中,在IOS和Android中,須要作相應的轉換才能安裝

        一、導出瀏覽器能夠安裝的證書

        openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

        二、導出Android能夠安裝的證書

        openssl pkcs12 -export -in client.crt -inkey client.key -out  client.pfx

        三、導出IOS能夠安裝的證書

        openssl x509 -in client.crt -out client.cer
        
        另外IE也能夠安裝.pfx格式的證書
        
        以上步驟有些須要輸入密碼,密碼就是咱們剛纔在生成客戶端和瀏覽器端證書時的密碼,密碼千萬必要忘記,忘記了只能從新生成
        
        client使用的文件有:ca.crt,client.crt,client.key,client.pfx
        server使用的文件有:ca.crt, server.crt,server.key

5、nginx Https雙向校驗配置

    修改nginx.conf文件
     server {
        listen       443 ssl;                                                    #https默認端口
        root /var/www/src;
        ssl on;                                                                                #開啓https校驗
        ssl_certificate ssl/server.crt;                                #服務端證書            
        ssl_certificate_key ssl/server.key;                        #服務端key
        #ssl_client_certificate ssl/client/client.crt;#客戶端證書,不須要根證書的時候可使用
        ssl_client_certificate ssl/ca.crt;                        #客戶端簽發的ca證書
        ssl_verify_client on;                                                    #開啓對客戶端的校驗,這個地方是就是開啓雙向校驗的地方

       ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
    }

配置完成之後    nginx -s reload 使之生效

6、使用

    把相關證書導入到相應的客戶端,例如在IE下,須要把根證書ca.crt安裝到受信任的證書頒發機構
client.crt(client.pfx) 安裝到我的證書的位置
而後打開咱們須要訪問的地址https://xxx.xxx.xxx.xx能正確的打開頁面即表明成功
在打開的時候,瀏覽器會詢問,一、證書確認,二、須要憑據(是否容許此應用訪問您的私鑰)
以上點擊確認和容許便可

 

(ps:接下來我會一些腳本直接把以上帶顏色的命令進行生成)

7、自動化腳本

經過以上命令,我寫了一個shell腳本,能夠快速的生成咱們須要的證書,因爲不能上傳附件,因此寫的shell文件就不能上傳上來了,貼上具體的腳本代碼,還請讀者複製到本身的文件中而後進行運行便可

一、腳本代碼

 

#!/bin/sh
# create self-signed server certificate:
read -p "請輸入證書的域 例如[www.example.com or 192.168.1.52]: " DOMAIN

SUBJECT="/C=CN/ST=BJ/L=BJ/O=bky/CN=$DOMAIN"

echo "建立服務器證書..."

openssl genrsa -des3 -out server.key 2048
openssl rsa -in server.key -out server.key

openssl req -new -subj $SUBJECT -key server.key -out server.csr

echo "建立客戶端證書..."
openssl genrsa -des3 -out client.key 2048
openssl req -new -subj $SUBJECT -key client.key -out client.csr

echo "建立根證書..."
openssl req -new -x509 -keyout ca.key -out ca.crt

rm -rf /etc/pki/CA/index.txt
rm -rf /etc/pki/CA/serial
touch /etc/pki/CA/{index.txt,serial}
echo 01 > /etc/pki/CA/serial

echo "用根證書對服務器證書和客戶端證書籤名"
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key

echo "導出服務器證書和客戶端證書"
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
openssl pkcs12 -export -in client.crt -inkey client.key -out  client.pfx
openssl x509 -in client.crt -out client.cer
openssl x509 -in server.crt -out server.cer


echo "把以上生成的文件copy到nginx conf文件的ssl目錄下面,若是ssl目錄不存在請建立"
echo "接下請配置nginx.conf操做:"
echo " server {																						"
echo " 			...                                           "
echo "     ssl on;                                        "
echo "     ssl_certificate ssl/server.crt;                "
echo "     ssl_certificate_key ssl/server.key;            "
echo "     ssl_client_certificate ssl/ca.crt;             "
echo "     ssl_verify_client on;                          "
echo "			...                                           "
echo "     }                                               "
echo "使用以下命令從新加載nginx配置"
echo "nginx -s reload"

 

注意事項:

SUBJECT="/C=CN/ST=BJ/L=BJ/O=bky/CN=$DOMAIN"

這一部分須要改成和本身公司相符的內容,或者乾脆直接更改成SUBJECT="/CN=$DOMAIN",而後在下面填寫證書的時候再進行填寫,若是使用了上述的SUBJECT,則在接下來填寫證書信息,例如國家,城市,機構的時候必需要和這個相同,若是不相同,就會生不成server.crt證書文件。例如若是國家在SUBJECT中設置的是CN,而下面填寫證書信息的時候不是CN,則執行openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key的時候會報以下錯誤

The countryName field needed to be the same in the
CA certificate (cn) and the request (CN)

二、腳本碰到的問題

 

在運行以上腳本的時候出現了一個小問題,錯誤信息以下:

 

openssl TXT_DB error number 2 failed to update database

在網上搜了一下解決方法,借鑑一下:

 

產生的緣由是:

This thing happens when certificates share common data. You cannot have two 
certificates that look otherwise the same.

方法一:

修改demoCA下 index.txt.attr

  1. unique_subject = yes 

 方法二:

刪除demoCA下的index.txt,並再touch下

  1. rm index.txt  
  2.   
  3. touch index.txt

 方法三:

將 common name設置成不一樣的

相關文章
相關標籤/搜索