前言
大部分HTTPS的站點都只是單向認證,即只有客戶端校驗服務(wù)端。那么一種更安全的做法則是雙向認證谋币,即客戶端服務(wù)端互相驗證暑竟。
網(wǎng)上介紹https雙向認證原理的帖子很多斋射,就不做贅述!
重要
是否需要雙向認證是服務(wù)端決定的
雙向認證的客戶端證書和服務(wù)端ssl證書沒有關(guān)系
自簽CA
首先ssl證書是受CA信任的三方機構(gòu)頒發(fā)但荤,并預(yù)裝到主流瀏覽器中的罗岖,網(wǎng)站擁有合法的ssl證書可以規(guī)避瀏覽器的不安全警告,數(shù)據(jù)傳輸更安全腹躁。
但這里我們只探討器原理桑包,所以不去糾結(jié)ssl證書是否合法
創(chuàng)建根證書私鑰:
openssl genrsa -out root.key 1024
創(chuàng)建根證書請求文件:
openssl req -new -out root.csr -key root.key
這里會讓你填一些東西,隨便填就行潜慎,我舉個例子:
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:sc
Locality Name (eg, city) [Default City]:cd
Organization Name (eg, company) [Default Company Ltd]:phaoer
Organizational Unit Name (eg, section) []:phaoer
Common Name (eg, your name or your servers hostname) []:root
Email Address []:
A challenge password []:
An optional company name []:
注意:在生成服務(wù)端和客戶端請求文件的時候也會要求填寫這些信息捡多,Common Name填寫域名即可
創(chuàng)建根證書(有效期10年):
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650
服務(wù)端證書
如果你的網(wǎng)站目前已經(jīng)擁有合法的ssl證書蓖康,略過這一步即可。
生成服務(wù)端證書私鑰:
openssl genrsa -out server.key 1024
生成服務(wù)端證書請求文件:
openssl req -new -out server.csr -key server.key
生成服務(wù)端公鑰證書:
openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650
客戶端證書
生成客戶端證書私鑰:
openssl genrsa -out client.key 1024
生成客戶端證書請求文件(各個參數(shù)需要和server相同):
openssl req -new -out client.csr -key client.key
生成客戶端公鑰證書:
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650
nginx配置
......
ssl_certificate /你的證書路徑/server.crt;
ssl_certificate_key /你的證書路徑/server.key;
ssl_client_certificate /你的證書路徑/root.crt;
ssl_verify_client on;
......
客戶端證書提供給終端使用
瀏覽器
生成一個p12文件供終端安裝
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
curl
curl雙向認證請求需要將客戶端證書和私鑰轉(zhuǎn)換成pem格式
crt轉(zhuǎn)pem
openssl x509 -in client.crt -out client.der -outform der
openssl x509 -in client.der -inform der -outform pem -out client.pem
key轉(zhuǎn)pem
openssl rsa -in client.key -out client.der -outform DER
openssl rsa -inform DER -outform PEM -in client.der -out clientkey.pem
curl請求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'/你的目錄/client.pem');
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
curl_setopt($ch, CURLOPT_SSLKEY, getcwd().'/你的目錄/clientkey.pem');
$data = curl_exec($ch);
// var_dump($data);
curl_close($ch);