CURL
請求 HTTPS 網(wǎng)站坤溃,一般為單向認(rèn)證拍霜,流程圖如下:
步驟1
CURLOPT_SSLVERSION
指定要使用的 SSL 版本(一般無需設(shè)置,讓 Curl 決定)
步驟3
CURLOPT_CAINFO
/CURLOPT_CAPATH
校驗(yàn)服務(wù)端證書合法性所使用的本地 CA 證書薪介,(一般不設(shè)置祠饺,內(nèi)用內(nèi)置證書)
CURLOPT_SSL_VERIFYPEER
是否校驗(yàn)服務(wù)端的證書合法性,默認(rèn): true
CURLOPT_SSL_VERIFYHOST
若服務(wù)端證書合法汁政,是否驗(yàn)證域名與證書是否匹配道偷。 默認(rèn): true
CURLOPT_SSL_VERIFYSTATUS
若服務(wù)端證書校驗(yàn)通過,是否校驗(yàn)證書狀態(tài)(會向證書服務(wù)商發(fā)出請求记劈,檢查證書是否被吊銷)默認(rèn): false
步驟4
CURLOPT_SSL_CIPHER_LIST
設(shè)置SSL的加密算法列表勺鸦,(一般無需設(shè)置,讓 Curl 決定)
步驟7
CURLOPT_RANDOM_FILE
用來生成 SSL 隨機(jī)數(shù)種子的文件名目木,(一般不設(shè)置换途,Curl 自行決定)
其他
CURLOPT_SSL_OPTIONS
SSL 驗(yàn)證行為:一般保持默認(rèn),可 參見
CURLOPT_CERTINFO
是否收集通信過程中的證書信息嘶窄,需要CURLOPT_VERBOSE=1
(開啟 debug , 收集信息)
以上為客戶端校驗(yàn)服務(wù)端的流程怀跛,有些時(shí)候,服務(wù)端也要校驗(yàn)客戶端柄冲,比如一些支付接口吻谋,需要認(rèn)證才能請求 API。此時(shí)现横,客戶端也需要提供證書漓拾,進(jìn)行雙向認(rèn)證,所有單向認(rèn)證的參數(shù)仍然有效戒祠,額外增加了客戶端提供證書的步驟骇两。
步驟 4 、步驟 9:客戶端提供證書和公鑰:
CURLOPT_SSLCERT
客戶端證書路徑姜盈,該證書可以同時(shí)包含公鑰低千,比如 PEM 證書就可以合二為一
CURLOPT_SSLCERTTYPE
證書類型,支持 "PEM"(默認(rèn)值)馏颂、"DER"和"ENG"
若證書不包含公鑰示血,則需要單獨(dú)提供。(證書和公鑰一般為相同格式救拉,但也可以不同)
CURLOPT_SSLKEY
私鑰的文件路徑
CURLOPT_SSLKEYTYPE
私鑰的文件類型难审,支持 "PEM"(默認(rèn)值)、"DER"和"ENG"
CURLOPT_KEYPASSWD
公鑰如果需要密碼亿絮,可通過該選項(xiàng)進(jìn)行設(shè)置
CURLOPT_SSLCERTPASSWD
/CURLOPT_SSLKEYPASSWD
提一下這兩個(gè)選項(xiàng)告喊,已不建議(棄用)麸拄,原本:
CURLOPT_SSLCERTPASSWD
對應(yīng)二合一CURLOPT_SSLCERT
的密碼CURLOPT_SSLKEYPASSWD
對應(yīng)單獨(dú)CURLOPT_SSLKEY
密碼
但實(shí)際上二者都是指公鑰密碼,現(xiàn)在建議使用CURLOPT_SSLKEY
直接設(shè)置
CURLOPT_SSLENGINE
/CURLOPT_SSLENGINE_DEFAULT
私鑰的加密引擎 / 非對稱加密操作的變量黔姜。這兩個(gè)參數(shù)用的較少拢切,需要使用通過引擎構(gòu)建的 Openssl 庫,通常無需理會地淀,當(dāng)你需要用到的時(shí)候失球,自然就會明白。
最后帮毁,以上都是針對 HTTP 請求的。Curl 還支持 SSH 豺撑、SFTP烈疚、SCP 協(xié)議,對應(yīng)的也有相關(guān)配置聪轿,如:
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5
SSH 遠(yuǎn)程主機(jī)公鑰(public key) 的 MD5 校驗(yàn)值爷肝,用于驗(yàn)證遠(yuǎn)程主機(jī)公鑰證書
CURLOPT_SSH_PUBLIC_KEYFILE
SSH 客戶端公鑰文件路徑,默認(rèn)使用$HOME/.ssh/id_dsa.pub
CURLOPT_SSH_PRIVATE_KEYFILE
SSH 客戶端私鑰文件路徑陆错,默認(rèn)使用$HOME/.ssh/id_dsa
CURLOPT_KEYPASSWD
SSH 客戶端私鑰密碼灯抛,在舊版本的 Curl 中,沒有CURLOPT_SSLCERTTYPE
和CURLOPT_SSLKEYPASSWD
選項(xiàng)音瓷,也是使用該選項(xiàng)設(shè)置的对嚼。很有可能為了兼容,該值仍作為這兩個(gè)值的 fallback
CURLOPT_SSH_AUTH_TYPES
SFTP 和 SCP 所需的身份驗(yàn)證類型
SSL 上下文
以上是使用 CURL 時(shí)绳慎,與 SSL 相關(guān)的配置纵竖,還有一些是直接使用 openssl 來進(jìn)行操作,以 php ssl 上下文選項(xiàng) 舉例
作為客戶端
使用 stream-socket-client 創(chuàng)建 SSL 客戶端杏愤,在配置上下文選項(xiàng)時(shí)
對應(yīng) CURL 章節(jié)中步驟 3
cafile
/capath
校驗(yàn)服務(wù)端證書合法性所使用的本地 CA 證書靡砌,(一般不設(shè)置,內(nèi)用內(nèi)置證書)
verify_peer
是否校驗(yàn)服務(wù)端的證書合法性珊楼,默認(rèn): true
verify_peer_name
若服務(wù)端證書合法通殃,是否驗(yàn)證域名與證書是否匹配。 默認(rèn): true
peer_name
證書內(nèi)包含域名信息厕宗,一般校驗(yàn)時(shí)画舌,對比證書內(nèi)域名與所請求域名。但可以通過該值直接指定
allow_self_signed
服務(wù)端的證書一般為 CA 證書下發(fā)的二級證書媳瞪,是否允許服務(wù)端自制的證書(非 CA 二級證書)
對應(yīng) CURL 章節(jié)中步驟 4骗炉、9(僅支持 PEM 證書)
local_cert
客戶端證書路徑,該證書可以同時(shí)包含公鑰
local_pk
若證書不包含公鑰蛇受,單獨(dú)提供公鑰
passphrase
二合一證書或單獨(dú)公鑰的密碼
作為服務(wù)端
使用 stream-socket-server 創(chuàng)建 SSL 服務(wù)端端句葵,在配置上下文選項(xiàng)時(shí)
cafile
/capath
服務(wù)端 CA 證書,(一般不設(shè)置,內(nèi)用內(nèi)置證書)
local_cert
服務(wù)端證書乍丈,一般為從 CA 機(jī)構(gòu)注冊得到的二級證書
local_pk
若證書不包含公鑰剂碴,單獨(dú)提供公鑰
passphrase
二合一證書或單獨(dú)公鑰的密碼
若服務(wù)端需要 SSL 雙向認(rèn)證,即客戶端在請求時(shí)也要提供證書(該證書也由服務(wù)端生成轻专,分發(fā)給用戶)
verify_peer
設(shè)置為 true 開啟校驗(yàn)忆矛,即客戶端需提供證書
verify_peer_name
是否要驗(yàn)證客戶端證書的域名一致性
peer_name
驗(yàn)證域名一致性時(shí),要求客戶端證書的域名與該設(shè)置值匹配(一般會自動(dòng)獲取请垛,但也可手動(dòng)設(shè)置)
證書生成
若是客戶端需要證書催训,一般由服務(wù)端提供。若是服務(wù)端需要證書宗收,通常在 CA 機(jī)構(gòu)注冊獲得漫拭。但有時(shí)候只是為了測試,或者部署私有 CA混稽,使用私有證書采驻,有必要了解一下證書的制作。
對于 Windows匈勋,如果安裝了 Git礼旅,就無需再次安裝 openssl 了, 可直接使用 C:\Progra~1\Git\usr\bin\openssl
命令行方式
一洽洁、制作一級 CA 證書
生成私鑰 CA.key
#創(chuàng)建私鑰 (建議設(shè)置密碼)
openssl genrsa -des3 -out CA.key 2048
生成如下
Generating RSA private key, 2048 bit long modulus
.............................................+++
................................+++
e is 65537 (0x010001)
<注:輸入兩次 CA Key 的密碼>
Enter pass phrase for Ca.key:123456
Verifying - Enter pass phrase for CA.key:123456
由 KEY 生成證書 CA.crt
# 1 年有效期
openssl req -x509 -new -nodes -key CA.key -sha256 -days 360 -out CA.crt
流程如下
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:HaiNan
Locality Name (eg, city) []:WenChang
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CNASA Inc
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:CNASA root CA
Email Address []:admin@cnasa.cn
一級 CA 證書制作完畢痘系,該 CA.crt 將作為客戶端請求使用的 CA 證書。若是希望用戶通過瀏覽器訪問該 CA 證書下發(fā)的二級證書網(wǎng)站诡挂,需要用戶將 CA.crt 添加到系統(tǒng)信任證書中碎浇。
二、制作二級 SSL 證書
假如你的 CA 獲得了操作系統(tǒng)認(rèn)證璃俗,內(nèi)置在操作系統(tǒng)內(nèi)了奴璃,你就成了一個(gè) CA 簽發(fā)機(jī)構(gòu)了,可以賣證書了城豁,通過下面的方式簽發(fā)證書發(fā)放給網(wǎng)站主
創(chuàng)建 SSL 證書 KEY
# 這里簡單起見苟穆,使用無密碼 key,若需要給 key 設(shè)置密碼唱星,參考上面 CA.key
openssl genrsa -out localhost.key 2048
輸出信息
Generating RSA private key, 2048 bit long modulus
...............+++
..............................................................................+++
e is 65537 (0x010001)
由 KEY 創(chuàng)建 SSL 證書 CSR
openssl req -new -key localhost.key -out localhost.csr
輸入相關(guān)信息
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:HaiNan
Locality Name (eg, city) []:WenChang
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CNASA Inc
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:CNASA root CA
Email Address []:admin@cnasa.cn
Please enter the following 'extra' attributes
to be sent with your certificate request
<注:以下兩項(xiàng)一般無需輸入雳旅,回車即可>
A challenge password []:<Enter>
An optional company name []:<Enter>
challenge password:這個(gè)不是證書密碼(證書沒有密碼,證書公鑰 KEY 才有密碼)间聊,CA 機(jī)構(gòu)的網(wǎng)站一般有管理證書的操作界面攒盈,該密碼通常為 CA 機(jī)構(gòu)自用,在進(jìn)行一些敏感操作(如刪除證書哎榴,修改 KEY 密碼)型豁,需要證書管理員提供該 challenge password
以提高安全性
創(chuàng)建域名附加配置文件僵蛛,新建文件cert.ext
輸入如下內(nèi)容保存
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
IP.2 = 127.0.0.1
DNS.3 = test.com
DNS.4 = *.test.com
使用上面準(zhǔn)備好的文件,由步驟一創(chuàng)建的 CA 簽發(fā) SSL 證書
# ssl證書有效期10年
openssl x509 -req -in localhost.csr -out localhost.crt -days 3650 \
-CAcreateserial -CA CA.crt -CAkey CA.key \
-CAserial serial -extfile cert.ext
此步驟需要輸入 CA 私鑰的密碼
....
Getting CA Private Key
<輸入 CA.key 密碼回車>
Enter pass phrase for CA.key:
OK迎变,到這里為止充尉, SSL 證書制作完畢,使用自制的 CA 和 SSL 證書可以配置到服務(wù)端衣形,網(wǎng)站就可以開啟 HTTPS 了(客戶端需要使用該 CA 證書進(jìn)行訪問 )
若網(wǎng)站需要開啟 雙向 SSL 認(rèn)證驼侠,就需要給客戶端也提供一個(gè) SSL 證書,只需要重復(fù)上面 [制作二級 SSL 證書] 的步驟谆吴,生成的證書 和 key(密碼可選)就可以分發(fā)給用戶了倒源。
編程方式
通過 PHP 舉例,創(chuàng)建 CA 證書 / SSL 證書都可以通過以下步驟完成
- openssl_pkey_new(創(chuàng)建 key)
- openssl-csr-new(創(chuàng)建 CSR)
- openssl-csr-sign(由 KEY 簽署 CSR)
- openssl-x509-export(創(chuàng)建 CA)