使用OpenSSL生成多域名自簽名證書(shū)進(jìn)行HTTPS開(kāi)發(fā)調(diào)試
時(shí)間:2023-02-07 03:44:01 | 來(lái)源:建站知識(shí)
時(shí)間:2023-02-07 03:44:01 來(lái)源:建站知識(shí)
證書(shū)生成過(guò)程介紹
證書(shū)的目的是建立特定密鑰對(duì)與特定實(shí)體之間的聯(lián)系。
自簽名根證書(shū)是指一堆密鑰對(duì)的私鑰對(duì)自己相應(yīng)的公鑰生成的證書(shū)請(qǐng)求進(jìn)行簽名而頒發(fā)的證書(shū),證書(shū)的申請(qǐng)人和簽發(fā)人都是同一個(gè)。
- 需要一對(duì)密鑰對(duì);
- 常用的是RSA,DSA密鑰,ECDSA密鑰,用于密鑰交換的證書(shū)不能用DSA,只能用RSA,因?yàn)镈SA不能加解密也不能做密鑰交換,只能做簽名;ECDSA還沒(méi)有被大部分的CA支持;
- 生成密鑰可以使用OpenSSL的genrsa 和 gendsa指令,也可以使用req指令;
- 證書(shū)認(rèn)證請(qǐng)求文件(csr文件)
- 這是按照一定格式生成的文件,里面包含實(shí)體信息
- 將實(shí)體信息和公鑰一起用相應(yīng)的私鑰簽名,是CA(證書(shū)認(rèn)證)能確認(rèn)這些信息是用戶發(fā)送的(證書(shū)請(qǐng)求中的公鑰拿出來(lái)驗(yàn)證這個(gè)證書(shū)請(qǐng)求的簽名)
- 通過(guò)OpenSSL的req指令填寫(xiě)和生成這個(gè)csr文件
- 不同的CA要求,可能需要更改默認(rèn)的配置文件openssl.cnf
- 將證書(shū)請(qǐng)求文件(csr文件)給CA簽發(fā)
- 驗(yàn)證證書(shū)請(qǐng)求上的簽名是否正確,確保公鑰對(duì)應(yīng)的私鑰就在申請(qǐng)者手中并且申請(qǐng)信息是正確沒(méi)被更改的
- CA對(duì)某些字段信息可能有特殊的要求,比如要求國(guó)家,身份等信息要求跟CA本身設(shè)定的一樣
- 如果CA是在OpenSSL指令的基礎(chǔ)上,那么它使用的簽發(fā)指令可能是ca,也可能是x509
常用指令
req 指令
req指令既可以直接生成一個(gè)新的自簽名證書(shū),也可以根據(jù)現(xiàn)有的證書(shū)請(qǐng)求和其相應(yīng)私鑰生成自簽名根證書(shū)。如果是根據(jù)現(xiàn)有證書(shū)請(qǐng)求生成自簽名根證書(shū),那么一定要-key選項(xiàng)指定相應(yīng)的私鑰指令才能執(zhí)行成功。
req 指令也可以生成密鑰對(duì),但在使用req 同時(shí)生成密鑰對(duì)是對(duì)密鑰對(duì)保存和格式有限制(只能是PEM編碼,DES3-CBC模式加密)。如果需要更靈活的處理,可以使用genrsa或者gendsa先生成密鑰然后使用-key選項(xiàng)指定。
參數(shù)選項(xiàng)
- -new 指定執(zhí)行生成新的證書(shū)請(qǐng)求,此時(shí)會(huì)忽略-in 指定的內(nèi)容
- -x509 根據(jù)現(xiàn)有的證書(shū)請(qǐng)求生成自簽名根證書(shū)(要求使用-key指定證書(shū)請(qǐng)求里面的公鑰相應(yīng)的私鑰,以便對(duì)自簽名根證書(shū)進(jìn)行簽名)
- -key 指定輸入的密鑰,如果不指定此選項(xiàng)會(huì)根據(jù)-newkey選項(xiàng)的參數(shù)生成密鑰對(duì)
- -newkey 指定生成一個(gè)新的密鑰對(duì),只有在沒(méi)有-key 選項(xiàng)的時(shí)候才生效,參數(shù)形式為rsa:numbits 或者 dsa:file
- -subj直接從指令行指定證書(shū)請(qǐng)求的主體名稱,格式為/分割的鍵值對(duì)字符串,如果沒(méi)有此選項(xiàng),那么會(huì)彈出交互提示;
- -days 設(shè)定了生成的自簽名根證書(shū)的有效期,單位為天;該選項(xiàng)只有在使用了-x509選項(xiàng)生成自簽名證書(shū)的時(shí)候才生效,默認(rèn)為30天。
- -config 指定req指令在生成證書(shū)請(qǐng)求的時(shí)候使用的OpenSSL配置文件,一般默認(rèn)為openssl.cnf
- -extensions 選項(xiàng)指定了生成自簽名根證書(shū)的時(shí)候使用的擴(kuò)展字段,其參數(shù)為OpenSSL配置文件中的某個(gè)字段名
- -reqexts 選項(xiàng)指定了生成證書(shū)請(qǐng)求是使用的擴(kuò)展字段,該字段參數(shù)也是配置文件中的某個(gè)字段名
- -text 讓指令輸出證書(shū)請(qǐng)求或者自簽名根證書(shū)內(nèi)容的明文解析,默認(rèn)情況下,它將輸出所有可能輸出的內(nèi)容,如果使用了reqopt選項(xiàng),則輸出內(nèi)容取決于reqopt選項(xiàng)
- -reqopt 指定text 選項(xiàng)輸出的內(nèi)容,可以為多個(gè),每個(gè)之間使用,分隔
- set_serial指定生成的自簽名根證書(shū)的序列號(hào),默認(rèn)情況下生成的自簽名根證書(shū)序列號(hào)是0;該選項(xiàng)也只有在生成自簽名根證書(shū)的時(shí)候有效。
- -keyout 置頂新生成的私鑰的輸出(僅在使用了-newKey 或-new 選項(xiàng)導(dǎo)致生成新密鑰對(duì)的時(shí)候才有效,如果使用了-key則此選項(xiàng)被忽略)
- -keyform 指定輸入密鑰的編碼格式(比如PEM,DER,PKCS#12,Netscape,IIS SGC,Engine等)
- -in 指定輸入證書(shū)請(qǐng)求文件,如果使用了-new 或者 -newkey選項(xiàng),此選項(xiàng)被忽略
- -inform 指定輸入證書(shū)請(qǐng)求文件的編碼格式(比如PEM,DER)
- -out 指定輸出證書(shū)請(qǐng)求文件或自簽名證書(shū)文件
- -noout 使用此選項(xiàng)后,指令將不會(huì)輸出編碼的證書(shū)請(qǐng)求或者自簽名根證書(shū)到-out選項(xiàng)指定的文件中,一般用來(lái)測(cè)試指令或者查看證書(shū)請(qǐng)求的信息
- -outform 指定輸出證書(shū)請(qǐng)求文件或自簽名證書(shū)的編碼格式(比如PEM,DER)
- -pubkey 使用此選項(xiàng)活 指令將輸出PEM編碼的公鑰到-out選擇指定的文件中,默認(rèn)情況下只輸出私鑰到-keyout指定的文件,并不輸出公鑰。
- -passin 指定讀取-key 選項(xiàng)指定的私鑰所需要的解密口令,如果沒(méi)有指定,私鑰又有密鑰的話,會(huì)彈出交互提示
- -passout 指定-keyout 選項(xiàng)輸出私鑰時(shí)使用的加密口令
- -nodes 表示不對(duì)私鑰進(jìn)行加密,如果指定此選項(xiàng),則忽略-passout指定的口令;如果沒(méi)有此選項(xiàng),卻指定了-passout則會(huì)有交互提示。
- -digest 指定生成證書(shū)請(qǐng)求或者自簽名根證書(shū)是使用的信息摘要算法,一般在生成數(shù)字簽名的時(shí)候使用。
- -verify 使用此選項(xiàng)對(duì)證書(shū)請(qǐng)求中的數(shù)字簽名進(jìn)行驗(yàn)證操作,并給出失敗或者成功的提示信息,其驗(yàn)證的過(guò)程是從證書(shū)請(qǐng)求里面提取公鑰,然后使用該公鑰對(duì)證書(shū)請(qǐng)求的數(shù)字簽名進(jìn)行驗(yàn)證。
- 如果沒(méi)有-key選項(xiàng)也沒(méi)有-newkey選項(xiàng),則會(huì)根據(jù)openssl.cnf中req字段的default_bits選項(xiàng)的參數(shù),生成一個(gè)RSA密鑰
- 如果沒(méi)有使用-nodes選項(xiàng),并且生成了新的私鑰,私鑰會(huì)被輸出到-keyout指定的文件中時(shí)將被以DES3的CBC模式加密。
使用實(shí)例
- 生成一個(gè)新的證書(shū)請(qǐng)求,使用新的rsa2048位密鑰,輸出證書(shū)請(qǐng)求到request.pem,密鑰到private.pem,私鑰口令為12345678
openssl req -new -newkey rsa:2048 -keyout private.pem -passout pass:12345678 -out request.pem
- 對(duì)證書(shū)請(qǐng)求簽名進(jìn)行驗(yàn)證
openssl req -in request.pe -verify -noout
openssl req -x509 -newkey rsa:2048 -keyout private.pem -passout pass:12345678 -out selfsign.crt
openssl req -text -in fd.csr -noout
ca 指令
ca指令模擬一個(gè)完整的CA服務(wù)器,它包括簽發(fā)用戶證書(shū),吊銷(xiāo)證書(shū),產(chǎn)生CRL及更新證書(shū)庫(kù)等管理操作
參數(shù)選項(xiàng)
- -config 指定要使用的配置文件,如果沒(méi)有此選項(xiàng),則會(huì)先查找OPENSSL_CONF或者SSLEAY_CONF定義的文件名,如果這兩個(gè)環(huán)境變量都沒(méi)有定義,就使用OpenSSL安裝的默認(rèn)路徑,一般是/usr/local/openssl/openssl.cnf,具體看安裝配置
- -startdate 設(shè)置證書(shū)的生效時(shí)間 格式為YYMMDDHHMMSSZ指定年月日時(shí)分秒,如果沒(méi)有則使用主配置文件中的default_startdate
- -enddate 格式跟-startdate一樣
- -days 設(shè)置證書(shū)的有效天數(shù),生效時(shí)間到到期時(shí)間之間的天數(shù),如果使用了-enddate,此選項(xiàng)被忽略
- -name 指定配置文件中CA選項(xiàng)的名稱
- -notext 不輸出明文信息到證書(shū)文件
- -subj直接從指令行指定證書(shū)請(qǐng)求的主體名稱,格式為/分割的鍵值對(duì)字符串,如果沒(méi)有此選項(xiàng),那么會(huì)彈出交互提示;
- -cert 參數(shù)是一個(gè)可以包含路徑的文件名,該文件是一個(gè)PEM編碼的X.509證書(shū)文件
- -keyfile 參數(shù)是一個(gè)包含路徑的文件名,文件格式可以為PEM,DER,PKCS#12,Netscape,IIS SGC,Engine,但需要通過(guò)-keyform指定到底是哪種格式
- -policy 指定CA的匹配策略
- -extensions 指定x509 v3擴(kuò)展字段的字段名,如果沒(méi)有這個(gè)選項(xiàng)就由-extfile中內(nèi)容
- -extfile 指定x509 v3擴(kuò)展的配置文件,如果沒(méi)有-extensions字段,則由CA主配置文件中的x509_extensions選項(xiàng)指定
- -in 指定一個(gè)可以包含路徑的證書(shū)請(qǐng)求文件名,應(yīng)該是PEM變得PKCS#10格式的證書(shū)請(qǐng)求
- -infiles指定一系列包含PEM編碼證書(shū)請(qǐng)求的文件,包含多個(gè),只能作為指令的最后一個(gè)選項(xiàng),其后的參數(shù)都被認(rèn)為是證書(shū)請(qǐng)求文件
- -out 選項(xiàng)指定了輸出簽發(fā)好的證書(shū)或者新生成的CRL的文件,如果沒(méi)有使用-notext選項(xiàng),那么證書(shū)的明文信息也會(huì)輸出到-out選項(xiàng)指定的文件中
- -outdir選項(xiàng)指定了新生成的證書(shū)的輸出目錄,默認(rèn)輸出到newecerts目錄,并使用.pem作為后綴,都是PEM編碼。
x509
x509指令能已各種方式顯示一個(gè)證書(shū)的內(nèi)容,也可以對(duì)一個(gè)證書(shū)的格式進(jìn)行轉(zhuǎn)換,還可以簽發(fā)證書(shū)
參數(shù)選項(xiàng)
- -in
- -inform
- -out
- -outform
- -keyform
- -CA 指定簽發(fā)證書(shū)或者轉(zhuǎn)換證書(shū)格式的時(shí)候需要的CA證書(shū)文件
- -CAkey 指定簽發(fā)證書(shū)或者轉(zhuǎn)換證書(shū)格式時(shí)需要的CA證書(shū)對(duì)應(yīng)的私鑰文件路徑
- -CAform 指定CA證書(shū)文件的格式
- -CAkeyform 私鑰文件格式
- -startdate
- -enddate
- -pubkey
- -noout
使用實(shí)例
- 使用現(xiàn)有證書(shū)生成證書(shū)請(qǐng)求文件
openssl x509 -x509toreq -in fd.crt -out fd.csr -signkey fd.key
- 使用證書(shū)請(qǐng)求文件生成自簽名證書(shū)
openssl x509 -req -days 365 -in fd.csr -signkey fd.key -out fd.crt
openssl x509 -text -in fd.crt -noout
crl指令
crl指令用于顯示、處理和驗(yàn)證CRL文件信息
參數(shù)選項(xiàng)
- -in
- -inform
- -out
- -outform
- -noout
開(kāi)發(fā)測(cè)試使用自簽名證書(shū)實(shí)例
生成認(rèn)證私鑰 私鑰 私鑰
要輸入密碼
openssl genrsa -des3 -out qunarzz-dev-enc.key 2048
可以通過(guò)如下方式解密(輸入上面的密碼)
openssl rsa -in qunarzz-dev-enc.key -out qunarzz-dev.key
生成帶有SAN(Subject Alt Name)的自簽名證書(shū)
生成對(duì)多個(gè)主機(jī)有效的自簽名證書(shū)
missing_subjectAltName 問(wèn)題解決
原有的簡(jiǎn)單自簽名證書(shū)在chrome里面不好使了,提示 missing_subjectAltName
需要全局找一份openssl.cnf ,或者下載一份openssl 那里有
openssl req -new -sha256 / -x509 / -days 10000 / -key qunarzz-dev.key / -subj "/C=CN/ST=BeiJing/L=Beijing/O=QUNAR/OU=FE/CN=qunarzz.com" / -extensions SAN / -config <(cat ./openssl.cnf / <(printf "[SAN]/nsubjectAltName=DNS.1:qunarzz.com,DNS.2:q.qunarzz.com,DNS.3:*.qunarzz.com")) / -out qunarzz-dev.crt
相關(guān)字段的信息
C => 國(guó)家 Country ST => 省 StateL => 市 CityO => 機(jī)構(gòu) OrganizationOU => 部門(mén) Organization UnitCN => 域名 Common Name (證書(shū)所請(qǐng)求的域名)emailAddress => main administrative point of contact for the certificate
參考資料
- 《OpenSSL與網(wǎng)絡(luò)信息安全-基礎(chǔ)、結(jié)構(gòu)和指令》
- 《OpenSSL攻略》
- 《OpenSSL編程》
- OpenSSL文檔
- OpenSSL命令
- OpenSSL 給自己頒發(fā)根證書(shū),由根證書(shū)簽發(fā)下級(jí)證書(shū)的步驟。
- Nginx 使用 openssl 的自簽名證書(shū)
- 使用 OpenSSL 制作一個(gè)包含 SAN(Subject Alternative Name)的證書(shū)
- 使用openssl為ssl證書(shū)增加“使用者備用名稱(DNS)”
- openssl證書(shū)添加多個(gè)IP
- 使用openssl為ssl證書(shū)增加“使用者備用名稱(DNS)”
- Multiple SSL Sites Using SubjectAltName
- Multiple Names on One Certificate
- 多個(gè)SSL站點(diǎn)使用SubjectAltName教程
- openssl生成證書(shū)鏈多級(jí)證書(shū)