TLS(SSL) 相關(guān)

CURL

請求 HTTPS 網(wǎng)站坤溃,一般為單向認(rèn)證拍霜,流程圖如下:

單向認(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ù)仍然有效戒祠,額外增加了客戶端提供證書的步驟骇两。

雙向認(rèn)證

步驟 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_SSLCERTTYPECURLOPT_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 證書都可以通過以下步驟完成

  1. openssl_pkey_new(創(chuàng)建 key)
  2. openssl-csr-new(創(chuàng)建 CSR)
  3. openssl-csr-sign(由 KEY 簽署 CSR)
  4. openssl-x509-export(創(chuàng)建 CA)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纪铺,一起剝皮案震驚了整個(gè)濱河市相速,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鲜锚,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苫拍,死亡現(xiàn)場離奇詭異芜繁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绒极,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門骏令,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人垄提,你說我怎么就攤上這事榔袋。” “怎么了铡俐?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵凰兑,是天一觀的道長。 經(jīng)常有香客問我审丘,道長吏够,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任滩报,我火速辦了婚禮锅知,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脓钾。我一直安慰自己售睹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布可训。 她就那樣靜靜地躺著昌妹,像睡著了一般捶枢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捺宗,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天柱蟀,我揣著相機(jī)與錄音,去河邊找鬼蚜厉。 笑死长已,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昼牛。 我是一名探鬼主播术瓮,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贰健!你這毒婦竟也來了胞四?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤伶椿,失蹤者是張志新(化名)和其女友劉穎辜伟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脊另,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡导狡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偎痛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旱捧。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖踩麦,靈堂內(nèi)的尸體忽然破棺而出枚赡,到底是詐尸還是另有隱情,我是刑警寧澤谓谦,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布贫橙,位于F島的核電站,受9級特大地震影響茁计,放射性物質(zhì)發(fā)生泄漏料皇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一星压、第九天 我趴在偏房一處隱蔽的房頂上張望践剂。 院中可真熱鬧,春花似錦娜膘、人聲如沸逊脯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽军洼。三九已至巩螃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匕争,已是汗流浹背避乏。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甘桑,地道東北人拍皮。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像跑杭,于是被迫代替她去往敵國和親铆帽。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容