SSL雙向認證(高清版)

來源:互聯網
上載者:User

上一篇介紹了SSL雙向認證的一些基本問題,以及使用Nginx+PHP基於它搭建https的Webservice。

之前的方式只是實現1:1的模式,昨天同事繼續實現了n:1的模式,這裡我再整理記錄下。

由於nginx的ssl_client_certificate參數只能指定一個用戶端公開金鑰,如果增加一個用戶端進行通訊就要重新配一個server。

n:1的模式是通過CA的級聯認證模式實現的,首先自己產生一套CA根級認證,再藉助其產生二級認證作為client認證。

此時client私密金鑰簽名不僅可以通過對應的client公開金鑰驗證,還可通過根憑證的公開金鑰進行驗證。

看到這裡應該豁然開朗了吧,下面簡單介紹下具體怎麼操作:

1 準備工作1.1 openssl目錄準備

一般情況下openssl的設定檔都在這個目錄/etc/pki/tls,so:

mkdir /etc/pki/ca_linvo

cd /etc/pki/ca_linvo

mkdir root server client newcerts

echo 01 > serial

echo 01 > crlnumber

touch index.txt

1.2 openssl配置準備

修改openssl配置

vi /etc/pki/tls/openssl.cnf

找到這句注釋掉,替換為下面那句

#default_ca      = CA_default

default_ca      = CA_linvo

把[ CA_default ]整個部分拷貝一份,改成上面的名字[
CA_linvo ]

修改裡面的如下參數:

dir = /etc/pki/ca_linvo

certificate = $dir/root/ca.crt

private_key = $dir/root/ca.key

儲存退出

2 建立CA根級認證產生key:openssl genrsa -out /etc/pki/ca_linvo/root/ca.key

產生csr:openssl req -new -key /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/root/ca.csr

產生crt:openssl x509 -req -days 3650 -in /etc/pki/ca_linvo/root/ca.csr -signkey /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/root/ca.crt

產生crl:openssl ca -gencrl -out /etc/pki/ca_linvo/root/ca.crl -crldays 7

產生的根級認證檔案都在/etc/pki/ca_linvo/root/目錄下

注意:建立認證時,建議認證密碼設定長度>=6位,因為java的keytool工具貌似對它有要求。

3 建立server認證

產生key:openssl genrsa -out /etc/pki/ca_linvo/server/server.key

產生csr:openssl req -new -key /etc/pki/ca_linvo/server/server.key -out /etc/pki/ca_linvo/server/server.csr

產生crt:openssl ca -in /etc/pki/ca_linvo/server/server.csr -cert /etc/pki/ca_linvo/root/ca.crt -keyfile /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/server/server.crt -days 3650

說明:

1、這裡產生的crt是剛才ca根級認證下的級聯認證,其實server認證主要用於配置正常單向的https,所以不使用級聯模式也可以:

openssl rsa -in /etc/pki/ca_linvo/server/server.key -out /etc/pki/ca_linvo/server/server.key
openssl x509 -req -in /etc/pki/ca_linvo/server/server.csr -signkey /etc/pki/ca_linvo/server/server.key -out /etc/pki/ca_linvo/server/server.crt -days 3650

2、-days 參數可根據需要設定認證的有效期間,例如預設365天

4 建立client認證

產生key:openssl genrsa -des3 -out /etc/pki/ca_linvo/client/client.key 1024

產生csr:openssl req -new -key /etc/pki/ca_linvo/client/client.key -out /etc/pki/ca_linvo/client/client.csr

產生crt:openssl ca -in /etc/pki/ca_linvo/client/client.csr -cert /etc/pki/ca_linvo/root/ca.crt -keyfile /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/client/client.crt -days 3650

說明:

1、這裡就必須使用級聯認證,並且可以重複該步驟,建立多套client認證

2、產生crt時可能會遇到如下報錯:

openssl TXT_DB error number 2 failed to update database

可參照這裡進行操作。

我使用的是方法一,即將index.txt.attr中unique_subject = no

5 配置nginx

這裡只列出server段的關鍵區段:

ssl_certificate  /etc/pki/ca_linvo/server/server.crt;#server公開金鑰
ssl_certificate_key  /etc/pki/ca_linvo/server/server.key;#server私密金鑰
ssl_client_certificate   /etc/pki/ca_linvo/root/ca.crt;#根級認證公開金鑰,用於驗證各個二級client
ssl_verify_client on;

重啟Nginx

6 測試6.1 瀏覽器測試由於是雙向認證,直接通過瀏覽器訪問https地址是被告知400 Bad Request(No required SSL certificate was sent)的,需要在本機安裝client認證。windows上安裝的認證需要pfx格式,也叫p12格式,產生方式如下:openssl pkcs12 -export -inkey /etc/pki/ca_linvo/client/client.key -in /etc/pki/ca_linvo/client/client.crt -out /etc/pki/ca_linvo/client/client.pfx然後考到windows中雙擊即可進行安裝,安裝時會提示輸入產生認證時設定的密碼。安裝成功後,重啟瀏覽器輸入網址訪問,瀏覽器可能會提示你選擇認證,選擇剛才安裝的那個認證即可。此時有些瀏覽器會提示使用者該認證不受信任,地址不安全之類,這是因為我們的server認證是我們自己頒發的,而非真正的權威CA機構頒布(通常很貴哦~),忽略它既可。6.2 php curl測試這裡只列出關鍵的需要設定的curl參數:
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何認證,不是CA機構頒布的也沒關係        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 檢查認證中是否設定網域名稱,如果不想驗證也可設為0        curl_setopt($ch, CURLOPT_VERBOSE, '1'); //debug模式,方便出錯調試        curl_setopt($ch, CURLOPT_SSLCERT, CLIENT_CRT); //client.crt檔案路徑,這裡我用常量代替        curl_setopt($ch, CURLOPT_SSLCERTPASSWD, CRT_PWD); //client認證密碼        curl_setopt($ch, CURLOPT_SSLKEY, CLIENT_KEY); //client.key檔案路徑

如果出現白板頁沒有返回資訊,一般是認證或密碼沒有設定正確的問題,請檢查。6.3 php soap測試

首先需要構建client的pem格式認證,通過openssl命令也可以,不過因為我們已經有了crt和key,所以手動合并也很簡單:

建立一個檔案,把crt中-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----之間的base64內容(包括這兩個分割線)拷貝進去,然後把key中-----BEGIN RSA PRIVATE KEY-----和-----END
RSA PRIVATE KEY-----之間的內容也複製進去,然後儲存為client.pem即可。

其實更省事的話可以如下命令,直接合并兩個檔案:

cat /etc/pki/ca_linvo/client/client.crt /etc/pki/ca_linvo/client/client.key > /etc/pki/ca_linvo/client/client.pem

有了pem檔案,下面可以使用php內建的SoapClient進行調用,建構函式需要設定第二個參數:

$header = array('local_cert' => CLIENT_PEM, //client.pem檔案路徑'passphrase' => CRT_PWD //client認證密碼);$client = new SoapClient(FILE_WSDL, $header); //FILE_WSDL為要訪問的https地址

上一篇部落格裡最後說到local_cert設定成遠程路徑的話會報錯,好像是因為第一次擷取wsdl時並沒有使用client認證的原因,需要將wsdl保持成本地檔案進行調用;

但是這次測試卻沒問題,不用另存新檔本地檔案,直接遠程擷取即可。

本來認為是之前的認證有問題,但是使用之前的那套認證依然可以,很是詭異~~~~~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.