操作記錄
創(chuàng)建證書 keytool
keytool 生成私鑰和證書
keytool -genkeypair -alias serverkey -keypass 123456 -storepass 123456 \
-dname "CN=server.com,OU=group,O=comp,L=cz,ST=sx,C=cn" \
-keyalg RSA -keysize 2048 -validity 3650 -keystore server.keystore
keytool -genkeypair -alias clientkey -keypass 123456 -storepass 123456 \
-dname "CN=name,OU=group,O=comp,L=cz,ST=sx,C=cn" \
-keyalg RSA -keysize 2048 -validity 3650 -keystore client.keystore
# 遷移到行業(yè)標(biāo)準(zhǔn)格式 PKCS12
keytool -importkeystore -srckeystore server.keystore -destkeystore server.keystore -deststoretype pkcs12
keytool -importkeystore -srckeystore client.keystore -destkeystore client.keystore -deststoretype pkcs12
# 導(dǎo)出證書 DER編碼格式 (添加 `-rfc` 可輸出 PEM 編碼格式的證書)
# keytool -exportcert -keystore server.keystore -file server.crt -alias serverkey -storepass 123456
keytool -exportcert -keystore server.keystore -file server.cer -alias serverkey -storepass 123456
keytool -exportcert -keystore client.keystore -file client.cer -alias clientkey -storepass 123456
# 導(dǎo)入信任證書
keytool -importcert -keystore client_trust.keystore -file server.cer -alias client_trust_server -storepass 123456 -noprompt
keytool -importcert -keystore server_trust.keystore -file client.cer -alias server_trust_client -storepass 123456 -noprompt
# jks格式 轉(zhuǎn) pkcs12
keytool -importkeystore -srckeystore server.keystore -destkeystore server.p12 -srcalias serverkey -destalias serverkey \
-srcstoretype jks -deststoretype pkcs12 -srcstorepass 123456 -deststorepass 123456 -noprompt
keytool -importkeystore -srckeystore client.keystore -destkeystore client.p12 -srcalias clientkey -destalias clientkey \
-srcstoretype jks -deststoretype pkcs12 -srcstorepass 123456 -deststorepass 123456 -noprompt
# p12 證書提取pem證書和私鑰
openssl pkcs12 -in server.p12 -clcerts -nokeys -out server.crt
openssl pkcs12 -in server.p12 -nocerts -nodes -out server.key
openssl pkcs12 -in client.p12 -clcerts -nokeys -out client.crt
# Nginx 配置
ssl_certificate /root/keytool/server.crt;
ssl_certificate_key /root/keytool/server.key;
ssl_client_certificate /root/keytool/client.crt;
ssl_verify_client on;
# Android 使用 Portecle 工具修改類型
- client.keystore -> client.p12
- client_trust.keystore -> client_trust.bks
創(chuàng)建證書 openssl
- 服務(wù)端 server.crt / server.key
- 客戶端 client.crt / client.key
- 雙方信任的 root.crt
root, 生成CA私鑰(.key) --> 生成CA證書請求(.csr) --> 自簽名得到根證書(.crt)
- 生成根證書密鑰 root.key (生成 RSA私鑰)
openssl genrsa -out root.key 2048 -aes256 -passout pass:123456
- 生成根證書請求文件 root.csr (從現(xiàn)有的私鑰中生成一個 證書簽署請求CSR)
openssl req -key root.key -new -out root.csr -subj "/C=CN/ST=SX/L=CZ/O=mycpmpany/OU=mygroup/CN=myCA"
- 自簽根證書 root.crt (從現(xiàn)有的私鑰和 CSR 生成自簽證書 crt)
openssl x509 -req -days 3650 -sha256 -CAcreateserial -signkey root.key -in root.csr -out root.crt
服務(wù)端, 用自簽根證書 root.crt 給用戶證書簽名, 生成私鑰(.key) --> 生成證書請求(.csr) --> 用CA根證書簽名得到證書(.crt)
- server.key 服務(wù)器端的秘鑰文件
-
openssl genrsa -out server.key 2048 -aes256 -passout pass:123456
私鑰 -
openssl rsa -in server.key -pubout -out server.pem -passin pass:123456
公鑰
- server.csr 服務(wù)端證書請求文件 (從現(xiàn)有的私鑰中生成一個 證書簽署請求CSR)
openssl req -new -sha256 -key server.key -out server.csr -subj "/C=CN/ST=SX/L=CZ/O=mycpmpany/OU=mygroup/CN=myserver"
- server.crt 有效期十年的服務(wù)器端公鑰證書,使用根證書和服務(wù)器端私鑰文件一起生成
openssl x509 -req -days 3650 -sha256 -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -in server.csr -out server.crt
- 將證書轉(zhuǎn)為p12格式, p12格式的證書包含公私鑰
openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12 -passout pass:123456
客戶端
- client.key 客戶端的私鑰文件
openssl genrsa -out client.key 2048 -aes256 -passout pass:123456
- clinet.csr : 客戶端證書請求文件 (從現(xiàn)有的私鑰中生成一個 證書簽署請求CSR)
openssl req -key client.key -new -out client.csr -subj "/C=CN/ST=SX/L=CZ/O=mycpmpany/OU=mygroup/CN=myclient"
- client.crt 有效期十年的客戶端證書,使用根證書和客戶端私鑰一起生成
openssl x509 -req -days 3650 -sha256 -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -in client.csr -out client.crt
- client.p12 客戶端p12格式,這個證書文件包含客戶端的公鑰和私鑰,主要用來給瀏覽器訪問使用
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12 -passout pass:123456
- 使用 bcprov-ext-jdk15on-158.jar 生成 Android 的 bks
keytool -importcert -v -trustcacerts -alias android -file root.crt -keystore client-trust.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-ext-jdk15on-158.jar -storepass 123456
基礎(chǔ)知識
HTTPS = HTTP + SSL
HTTP 和 HTTPs
HTTP(超文本傳輸協(xié)議)是一個客戶端終端(用戶)和服務(wù)器端(網(wǎng)站)請求和應(yīng)答的標(biāo)準(zhǔn)(TCP)。[1]
超文本傳輸協(xié)議HTTP協(xié)議被用于在Web瀏覽器和網(wǎng)站服務(wù)器之間傳遞信息。HTTP協(xié)議以明文方式發(fā)送內(nèi)容,不提供任何方式的數(shù)據(jù)加密,易遭受竊聽、篡改、劫持等攻擊,因此HTTP協(xié)議不適合傳輸一些敏感信息,比如信用卡號、密碼等。[1]
為了解決HTTP協(xié)議的這一缺陷,需要使用另一種協(xié)議:安全套接字層超文本傳輸協(xié)議HTTPS。為了數(shù)據(jù)傳輸?shù)陌踩琀TTPS在HTTP的基礎(chǔ)上加入了SSL/TLS協(xié)議,SSL/TLS依靠證書來驗證服務(wù)器的身份,并為瀏覽器和服務(wù)器之間的通信加密,一次HTTPS協(xié)議實現(xiàn)了數(shù)據(jù)傳輸過程中的保密性、完整性和身份認證性。[1]
- HTTPS協(xié)議需要到CA申請證書,而HTTP協(xié)議則不用;
- HTTP是超文本傳輸協(xié)議,信息是明文傳輸,而HTTPS則是加密傳輸;
- HTTP和HTTPS使用完全不同的連接方式,所占用的端口也不一樣,前者占用80端口,后者占用443端口;
- HTTPS傳輸過程比較復(fù)雜,對服務(wù)端占用的資源比較多,由于握手過程的復(fù)雜性和加密傳輸?shù)奶匦詫?dǎo)致HTTPS傳輸?shù)男时容^低;HTTP的連接很簡單,是無狀態(tài)的;
- HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進行加密傳輸、身份認證的網(wǎng)絡(luò)協(xié)議,比HTTP協(xié)議安全。
SSL 和 TLS
SSL:(Secure Socket Layer,安全套接字層),位于可靠的面向連接的網(wǎng)絡(luò)層協(xié)議和應(yīng)用層協(xié)議之間的一種協(xié)議層。SSL通過互相認證、使用數(shù)字簽名確保完整性、使用加密確保私密性,以實現(xiàn)客戶端和服務(wù)器之間的安全通訊。該協(xié)議由兩層組成:SSL記錄協(xié)議和SSL握手協(xié)議。[2]
SSL協(xié)議提供的服務(wù)主要有:
- 認證用戶和服務(wù)器,確保數(shù)據(jù)發(fā)送到正確的客戶機和服務(wù)器;
- 加密數(shù)據(jù)以防止數(shù)據(jù)中途被竊取;
- 維護數(shù)據(jù)的完整性,確保數(shù)據(jù)在傳輸過程中不被改變。
TLS:(Transport Layer Security,傳輸層安全協(xié)議),用于兩個應(yīng)用程序之間提供保密性和數(shù)據(jù)完整性。該協(xié)議由兩層組成:TLS記錄協(xié)議和TLS握手協(xié)議。[2]
TLS的最大優(yōu)勢就在于:TLS是獨立于應(yīng)用協(xié)議。高層協(xié)議可以透明地分布在TLS協(xié)議上面。然而,TLS標(biāo)準(zhǔn)并沒有規(guī)定應(yīng)用程序如何在TLS上增加安全性;它如何啟動TLS握手協(xié)議以及如何解釋交換的認證證書的決定權(quán)留給協(xié)議的設(shè)計者和實施者來判斷。
TLS的主要目標(biāo)是使SSL更安全,并使協(xié)議的規(guī)范更精確和完善。TLS在SSL v3.0的基礎(chǔ)上,提供了以下增加內(nèi)容:
- 更安全的MAC算法
- 更嚴密的警報
- “灰色區(qū)域”規(guī)范的更明確的定義
SSL證書
- .pem 是Privacy Enhanced Mail的縮寫,它是一個失敗的保護電子郵件的方法,但是這個容器格式一直在使用。
- .key 這是一個PEM格式的文件,只包含證書的私鑰。
- X.509 是密碼學(xué)里公鑰證書的格式標(biāo)準(zhǔn)。證書組成結(jié)構(gòu)標(biāo)準(zhǔn)用ASN.1(一種標(biāo)準(zhǔn)的語言)來進行描述。
- ASN.1 抽象語法標(biāo)記(Abstract Syntax Notation One) ASN.1是一種 ISO/ITU-T 標(biāo)準(zhǔn),描述了一種對數(shù)據(jù)進行表示、編碼、傳輸和解碼的數(shù)據(jù)格式。它提供了一整套正規(guī)的格式用于描述對象的結(jié)構(gòu),而不管語言上如何執(zhí)行及這些數(shù)據(jù)的具體指代,也不用去管到底是什么樣的應(yīng)用程序。
- DER (Distinguished Encoding Rules,可辨別編碼規(guī)則)。ASN.1對象的編碼是ASN.1標(biāo)準(zhǔn)的重要部分,通常采用的是BER,而DER則是其一個子集。
- .csr 證書認證簽名請求(Certificate signing request), 這是證書申請文件,生成證書時要把這個提交給權(quán)威的證書頒發(fā)機構(gòu),頒發(fā)機構(gòu)審核通過之后,再根據(jù)這些申請信息生成相應(yīng)的證書。
- .pkcs12 .pfx .p12 最初定義在RSA的Public-Key Cryptography Standards,"12"這個版本開始是微軟使用,后來定義在 RFC 7292。這是一個密碼容器格式,可以包含公鑰和私鑰證書對。跟.pem文件不同,這個容器格式是加密的。java的keytool工具可以產(chǎn)生這種格式的證書。
- .der ASN.1語法的編碼規(guī)則之一。.pem文件是.der文件的Base64版本。
- .cert .cer .crt 證書(Certificate) .pem文件的不同格式,也可以是.der文件。這些文件在Windows下可以直接識別,.pem無法識別。
- .p7b .keystore 定義在RFC 2315這是Windows用于證書交換的一種格式,java支持該格式,通常用.keystore作為后綴。
- .crl 證書吊銷列表。
SSL證書也叫安全證書或者數(shù)字證書,SSL證書是數(shù)字證書的一種,跟駕駛證、護照、營業(yè)執(zhí)照電子副本類似。SSL證書是一種國際通用的Web安全標(biāo)準(zhǔn),主要通過對敏感數(shù)據(jù)加密來防止各種攻擊非法讀取重要信息,保證數(shù)據(jù)的完整性和安全性,避免受到數(shù)據(jù)劫持和釣魚攻擊等。[3]
SSL 證書是由受信任的數(shù)字證書頒發(fā)機構(gòu) CA,在驗證服務(wù)器身份后頒發(fā),且具有服務(wù)器身份驗證和數(shù)據(jù)傳輸加密功能。簡單說就是讓你網(wǎng)站通過 HTTPS 加密傳輸協(xié)議訪問的一個必要文件。[4]
數(shù)字證書認證機構(gòu)(Certificate Authority,縮寫為CA),是負責(zé)發(fā)放和管理數(shù)字證書的權(quán)威機構(gòu),并作為電子商務(wù)交易中受信任的第三方,承擔(dān)公鑰體系中公鑰的合法性檢驗的責(zé)任。CA 機構(gòu)是獨立的,沒有相互關(guān)系,這些機構(gòu)都是在webtrust認證審核下成立的。[4]
簽發(fā)主流機構(gòu):Symantec、Comodo、GeoTrust、DigiCert、GlobalSign 等。
SSL證書根據(jù)驗證級別,分為三種類型:
- 域名型SSL證書,簡稱DVSSL (常用于 個人站點)
- 企業(yè)型SSL證書,簡稱OVSSL (常用于 普通企業(yè)網(wǎng)站)
- 增強型SSL證書,簡稱EVSSL (常用于 企業(yè)官網(wǎng)、電商、P2P等互聯(lián)網(wǎng)金融網(wǎng)站)。
自簽名SSL證書
自己生成的SSL證書,不是CA機構(gòu)頒發(fā)的SSL證書,就是自簽名證書。自簽名SSL證書不會被瀏覽器信任,數(shù)據(jù)被泄漏級劫持安全漏洞安全風(fēng)險較高。
如果你想使用 SSL 證書來確保服務(wù)的安全,但你不需要 CA 簽名的證書,一個有效的(和免費的)解決方案是簽署你自己的證書。
你可以自己簽發(fā)的一種常見證書是自簽證書self-signed certificate。自簽證書是用自己的私鑰簽署的證書。自簽證書和 CA 簽名證書一樣可以用來加密數(shù)據(jù),但是你的用戶會顯示一個警告,說這個證書不被他們的計算機或瀏覽器信任。[5]
如果你想從證書頒發(fā)機構(gòu)certificate authority(CA)那里獲得 SSL 證書,你必須生成一個證書簽署請求certificate signing request(CSR)。
openssl / keytool
JDK里面內(nèi)置了一個數(shù)字證書生產(chǎn)工具:keytool。但是這個工具只能生成自簽名的數(shù)字證書。所謂自簽名就是指證書只能保證自己是完整的,沒有經(jīng)過非法修改的。
keytool 沒辦法簽發(fā)證書,而 openssl 能夠進行簽發(fā)和證書鏈的管理
常用命令
openssl
設(shè)置密碼
-
-passin -pass:123456
用于簽名待生成的請求證書的私鑰文件的解密密碼 -
-passout arg
arg為對稱加密(des/aes)的密碼 (省去了console交互提示輸入密碼的環(huán)節(jié)) -
-password -pass:123456
導(dǎo)入導(dǎo)出
自動輸入
-subj "/C=CN/ST=SX/L=CZ/O=cpmpany/OU=example/CN=example.com/emailAddress=aa@bb.cc"
- C: Country,單位所在國家,為兩位數(shù)的國家縮寫,如:CN 表示中國
- ST: State/Province,單位所在州或省
- L: Locality,單位所在城市/或縣區(qū)
- O: Organization,單位名稱
- OU: Organization Unit,部門名稱
- CN: Common Name,網(wǎng)站的域名;例:adf.com 或 IP
- Email Address: 郵箱
RSA私鑰公鑰[6]
-
-nodes
無密碼 -
-passout pass:123456
有密碼
默認情況下,openssl 輸出格式為 PKCS#1-PEM
-
openssl genrsa -out cakey.pem 2048
pem 格式 (內(nèi)容是 -----END RSA PRIVATE KEY-----) -
openssl genrsa -out cakey.key 2048
key 格式 (內(nèi)容也是 -----END RSA PRIVATE KEY-----) -
openssl genrsa -out root.key 2048 -aes256 -passout pass:123456
設(shè)置密碼
加密
-
openssl genrsa -des3 -out rsa_des_private.key 2048
使用des3加密 -
openssl genrsa -aes256 -passout pass:123456 -out rsa_aes_private.key 2048
生成RSA私鑰, 使用aes256加密,-passout
代替shell 進行密碼輸入 -
openssl rsa -in rsa_aes_private.key -passin pass:123456 -pubout -out rsa_public.key
生成RSA公鑰
非加密
-
openssl genrsa -out rsa_private.key 2048
生成RSA私鑰(無加密) -
openssl rsa -in rsa_private.key -pubout -out rsa_public.key
生成RSA公鑰
轉(zhuǎn)換
-
openssl rsa -in rsa_aes_private.key -passin pass:123456 -out rsa_private.key
私鑰轉(zhuǎn)非加密 -
openssl rsa -in rsa_private.key -aes256 -passout pass:123456 -out rsa_aes_private.key
私鑰轉(zhuǎn)加密 -
openssl rsa -in rsa_private.key -outform der-out rsa_aes_private.der
轉(zhuǎn)DER,-inform
/-outform
制定輸入輸出格式 -
openssl pkcs8 -topk8 -in rsa_private.key -passout pass:123456 -out pkcs8_private.key
私鑰PKCS#1轉(zhuǎn)PKCS#8, pkcs8默認采用des3加密,
查看密鑰
openssl rsa -in server.key -noout -text
-
openssl rsa -in server.key -text
使用-nocrypt
可以輸出無加密的pkcs8密鑰, 使用-pubin
可查看公鑰明細 cat server.key
證書簽署請求 CSR 文件
如果你想使用 HTTPS(HTTP over TLS)來保護你的 Apache HTTP 或 Nginx Web 服務(wù)器的安全,并且你想使用一個證書頒發(fā)機構(gòu)(CA)來頒發(fā) SSL 證書,那么就需要 CSR, 生成的 CSR 可以發(fā)送給 CA,請求簽發(fā)由 CA 簽名的 SSL 證書。
使用現(xiàn)有 RSA私鑰生成 CSR簽名請求 -key
指定私鑰, -out
生成文件
-
openssl req -key clientkey.pem -new -out client.csr -subj "..."
pem -
openssl req -key root.key -new -out root.csr -subj "..."
key
同時生成 RSA私鑰 和 CSR簽名請求
openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.csr -subj "..."
從現(xiàn)有的證書(cert.crt)和私鑰(server.key)生成 CSR(server.csr)
openssl x509 -in cert.crt -signkey server.key -x509toreq -out server.csr
-
-x509toreq
指定你使用一個 X509 證書來制作 CSR
查看 CSR
openssl req -text -in server.csr -noout
證書 CRT
CA
openssl x509 -req -days 3650 -sha256 -extensions v3_ca -signkey cakey.pem -in ca.csr -out cacert.cer
openssl x509 -req -days 3650 -sha256 -extensions v3_ca -signkey root.key -in root.csr -out root.crt
openssl x509 -req -days 3650 -sha256 -signkey root.key -in root.csr -out root.crt
用CA根證書簽發(fā)應(yīng)用證書 (server)
openssl x509 -req -days 3650 -sha256 -extensions v3_req -CA cacert.pem -CAkey cakey.pem -CAserial ca.srl -CAcreateserial -in server.csr -out servercert.pem
openssl x509 -req -days 3650 -sha256 -extensions v3_req -CA root.crt -CAkey root.key -CAserial ca.srl -CAcreateserial -in server.csr -out server.crt
openssl x509 -req -days 3650 -sha256 -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -in server.csr -out server.crt
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
直接生成 私鑰和 SSL 自簽證書
openssl req -newkey rsa:2048 -days 3650 -nodes -x509 -keyout ca.key -out ca.crt -subj "..."
-
req
是證書請求的子命令 -
-newkey rsa:2048 -keyout private_key.pem
表示生成私鑰(PKCS8格式) -
-nodes
表示私鑰不加密,若不帶參數(shù)將提示輸入密碼 -
-x509
告訴 req 子命令創(chuàng)建一個自簽名的證書 -
-days 365
指定證書的有效期為 365 天
從現(xiàn)有 私鑰 生成 自簽名證書, -new
生成證書請求, x509
直接輸出證書, -key
指定私鑰
openssl req -new -x509 -sha256 -days 3650 -key root.key -out root.crt -passin pass:123456 -subj "..."
從現(xiàn)有 私鑰和CSR 生成 自簽證書, x509
指定格式, -in
指定請求文件, -signkey
自簽名
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
-
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -passin pass:123456 -CAcreateserial -out server.crt
CA 證書
使用 已有RSA 私鑰生成自簽名證書 (生成 ca.crt)
openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt
-
-new
指生成證書請求 -
-x509
表示直接輸出證書 -
-key
指定私鑰文件
使用 CA 證書及CA密鑰 對請求簽發(fā)證書進行簽發(fā),生成 x509證書 (使用 ca 簽發(fā) server.crt)
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -passin pass:123456 -CAcreateserial -out server.crt
查看證書
openssl x509 -in cert.crt -noout -text
證書轉(zhuǎn)換
-
openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
將 DER 轉(zhuǎn)換為 PEM -
openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:123456 -password pass:123456 -out server.p12
將pem證書和私鑰轉(zhuǎn) pkcs#12 證書,-export
導(dǎo)出pkcs#12證書,-inkey
指定私鑰 -
openssl pkcs12 -export -inkey domain.key -in domain.crt -out domain.pfx
將 PEM 轉(zhuǎn)換為 PKCS12, 使用私鑰(domain.key)和證書(domain.crt),并將它們組合成一個 PKCS12 文件(domain.pfx) -
openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12 -passin pass:123456 -password pass:123456
證書轉(zhuǎn)為p12格式, p12格式的證書包含公私鑰 -
openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:123456 -chain -CAfile ca.crt -password pass:123456 -out server-all.p12
將pem證書和私鑰/CA證書 合成pkcs#12 證書,-chain
同時添加證書鏈,-CAfile
CA證書,導(dǎo)出的p12文件將包含多個證書 -
openssl x509 -in cert.crt -outform der -out server.der
將 PEM 轉(zhuǎn)換為 DER, DER 格式通常與 Java 一起使用。 -
openssl pkcs12 -in domain.pfx -nodes -out domain.combined.crt
將 PKCS12 轉(zhuǎn)換為 PEM, 轉(zhuǎn)換 PKCS12 文件(domain.pfx)并將其轉(zhuǎn)換為 PEM 格式(domain.combined.crt) -
openssl pkcs12 -in server.p12 -password pass:123456 -passout pass:123456 -out server.pem
pcks#12提取PEM文件(同時包含證書和私鑰pkcs#8) -
openssl pkcs12 -in server.p12 -password pass:123456 -passout pass:123456 -nocerts -out key.pem
僅提取私鑰 -
openssl pkcs12 -in server.p12 -password pass:123456 -nokeys -out key.pem
僅提取證書 -
openssl pkcs12 -in server-all.p12 -password pass:123456 -nokeys -cacerts -out cacert.pem
僅提取ca證書 -
openssl pkcs12 -in server-all.p12 -password pass:123456 -nokeys -clcerts -out cert.pem
僅提取server證書 -
openssl pkcs12 -in server.pfx -nodes -out server.pem
PFX文件轉(zhuǎn)換為 pem -
openssl rsa -in server.pem -out server2.key
PFX文件轉(zhuǎn)換為密鑰 -
openssl x509 -in server.pem -out server2.crt
PFX文件轉(zhuǎn)換為證書
驗證
檢查私鑰是否為有效密鑰
openssl rsa -check -in rsa_private.key
驗證私鑰是否與證書和 CSR 匹配
openssl rsa -noout -modulus -in rsa_private.key | openssl md5
openssl x509 -noout -modulus -in cert.crt | openssl md5
openssl req -noout -modulus -in server.csr | openssl md5
查看 CSR 條目, 查看和驗證純文本的 CSR 內(nèi)容
openssl req -text -noout -verify -in server.csr
使用CA證書驗證server端證書
openssl verify -CAfile cacert.pem servercert.pem
openssl verify -CAfile root.crt server.crt
驗證證書由 CA 簽署
openssl verify -verbose -CAFile ca.crt cert.crt
openssl 命令參數(shù)
參考 https://cloud.tencent.com/developer/article/1444793
1. openssl list-standard-commands(標(biāo)準(zhǔn)命令)
1) asn1parse: asn1parse用于解釋用ANS.1語法書寫的語句(ASN一般用于定義語法的構(gòu)成)
2) ca: ca用于CA的管理
openssl ca [options]:
2.1) -selfsign
使用對證書請求進行簽名的密鑰對來簽發(fā)證書。即"自簽名",這種情況發(fā)生在生成證書的客戶端、簽發(fā)證書的CA都是同一臺機器(也是我們大多數(shù)實驗中的情況),我們可以使用同一個
密鑰對來進行"自簽名"
2.2) -in file
需要進行處理的PEM格式的證書
2.3) -out file
處理結(jié)束后輸出的證書文件
2.4) -cert file
用于簽發(fā)的根CA證書
2.5) -days arg
指定簽發(fā)的證書的有效時間
2.6) -keyfile arg
CA的私鑰證書文件
2.7) -keyform arg
CA的根私鑰證書文件格式:
2.7.1) PEM
2.7.2) ENGINE
2.8) -key arg
CA的根私鑰證書文件的解密密碼(如果加密了的話)
2.9) -config file
配置文件
example1: 利用CA證書簽署請求證書
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
3) req: X.509證書簽發(fā)請求(CSR)管理
openssl req [options] <infile >outfile
3.1) -inform arg
輸入文件格式
3.1.1) DER
3.1.2) PEM
3.2) -outform arg
輸出文件格式
3.2.1) DER
3.2.2) PEM
3.3) -in arg
待處理文件
3.4) -out arg
待輸出文件
3.5) -passin
用于簽名待生成的請求證書的私鑰文件的解密密碼
3.6) -key file
用于簽名待生成的請求證書的私鑰文件
3.7) -keyform arg
3.7.1) DER
3.7.2) NET
3.7.3) PEM
3.8) -new
新的請求
3.9) -x509
輸出一個X509格式的證書
3.10) -days
X509證書的有效時間
3.11) -newkey rsa:bits
生成一個bits長度的RSA私鑰文件,用于簽發(fā)
3.12) -[digest]
HASH算法
3.12.1) md5
3.12.2) sha1
3.12.3) md2
3.12.4) mdc2
3.12.5) md4
3.13) -config file
指定openssl配置文件
3.14) -text: text顯示格式
example1: 利用CA的RSA密鑰創(chuàng)建一個自簽署的CA證書(X.509結(jié)構(gòu))
openssl req -new -x509 -days 3650 -key server.key -out ca.crt
example2: 用server.key生成證書簽署請求CSR(這個CSR用于之外發(fā)送待CA中心等待簽發(fā))
openssl req -new -key server.key -out server.csr
example3: 查看CSR的細節(jié)
openssl req -noout -text -in server.csr
4) genrsa: 生成RSA參數(shù)
openssl genrsa [args] [numbits]
[args]
4.1) 對生成的私鑰文件是否要使用加密算法進行對稱加密:
4.1.1) -des: CBC模式的DES加密
4.1.2) -des3: CBC模式的DES加密
4.1.3) -aes128: CBC模式的AES128加密
4.1.4) -aes192: CBC模式的AES192加密
4.1.5) -aes256: CBC模式的AES256加密
4.2) -passout arg: arg為對稱加密(des、des、aes)的密碼(使用這個參數(shù)就省去了console交互提示輸入密碼的環(huán)節(jié))
4.3) -out file: 輸出證書私鑰文件
[numbits]: 密鑰長度
example: 生成一個1024位的RSA私鑰,并用DES加密(密碼為1111),保存為server.key文件
openssl genrsa -out server.key -passout pass:1111 -des3 1024
5) rsa: RSA數(shù)據(jù)管理
openssl rsa [options] <infile >outfile
5.1) -inform arg
輸入密鑰文件格式:
5.1.1) DER(ASN1)
5.1.2) NET
5.1.3) PEM(base64編碼格式)
5.2) -outform arg
輸出密鑰文件格式
5.2.1) DER
5.2.2) NET
5.2.3) PEM
5.3) -in arg
待處理密鑰文件
5.4) -passin arg
輸入這個加密密鑰文件的解密密鑰(如果在生成這個密鑰文件的時候,選擇了加密算法了的話)
5.5) -out arg
待輸出密鑰文件
5.6) -passout arg
如果希望輸出的密鑰文件繼續(xù)使用加密算法的話則指定密碼
5.7) -des: CBC模式的DES加密
5.8) -des3: CBC模式的DES加密
5.9) -aes128: CBC模式的AES128加密
5.10) -aes192: CBC模式的AES192加密
5.11) -aes256: CBC模式的AES256加密
5.12) -text: 以text形式打印密鑰key數(shù)據(jù)
5.13) -noout: 不打印密鑰key數(shù)據(jù)
5.14) -pubin: 檢查待處理文件是否為公鑰文件
5.15) -pubout: 輸出公鑰文件
example1: 對私鑰文件進行解密
openssl rsa -in server.key -passin pass:111 -out server_nopass.key
example:2: 利用私鑰文件生成對應(yīng)的公鑰文件
openssl rsa -in server.key -passin pass:111 -pubout -out server_public.key
6) x509:
本指令是一個功能很豐富的證書處理工具。可以用來顯示證書的內(nèi)容,轉(zhuǎn)換其格式,給CSR簽名等X.509證書的管理工作
openssl x509 [args]
6.1) -inform arg
待處理X509證書文件格式
6.1.1) DER
6.1.2) NET
6.1.3) PEM
6.2) -outform arg
待輸出X509證書文件格式
6.2.1) DER
6.2.2) NET
6.2.3) PEM
6.3) -in arg
待處理X509證書文件
6.4) -out arg
待輸出X509證書文件
6.5) -req
表明輸入文件是一個"請求簽發(fā)證書文件(CSR)",等待進行簽發(fā)
6.6) -days arg
表明將要簽發(fā)的證書的有效時間
6.7) -CA arg
指定用于簽發(fā)請求證書的根CA證書
6.8) -CAform arg
根CA證書格式(默認是PEM)
6.9) -CAkey arg
指定用于簽發(fā)請求證書的CA私鑰證書文件,如果這個option沒有參數(shù)輸入,那么缺省認為私有密鑰在CA證書文件里有
6.10) -CAkeyform arg
指定根CA私鑰證書文件格式(默認為PEM格式)
6.11) -CAserial arg
指定序列號文件(serial number file)
6.12) -CAcreateserial
如果序列號文件(serial number file)沒有指定,則自動創(chuàng)建它
example1: 轉(zhuǎn)換DER證書為PEM格式
openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
example2: 使用根CA證書對"請求簽發(fā)證書"進行簽發(fā),生成x509格式證書
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
example3: 打印出證書的內(nèi)容
openssl x509 -in server.crt -noout -text
keytool
- jks 是Java的keytool證書工具支持的證書私鑰格式
- pfx 是微軟支持的私鑰格式(p12是pfx的新格式)
- cer / crt 是證書的公鑰格式(cer是crt證書的微軟形式)
- csr 數(shù)字證書簽名請求文件(Cerificate Signing Request)
- .der .cer 此證書文件是二進制格式,只含有證書信息,不包含私鑰
- .crt : 此證書文件是二進制格式或文本格式,一般為文本格式,功能與 .der 及 .cer 證書文件相同
- .pem : 此證書文件一般是文本格式,可以存放證書或私鑰,或者兩者都包含
- .pem 文件如果只包含私鑰,一般用 .key 文件代替
- .pfx .p12 : 此證書文件是二進制格式,同時包含證書和私鑰,且一般有密碼保護
- .keystore .truststore : 兩者本質(zhì)都是keystore,都是儲存密鑰的容器
- 使用
ketytool --help
獲取所有可用命令 - 使用
keytool -command_name -help
來獲取 command_name 的用法
keytool --help
密鑰和證書管理工具
命令:
-certreq 生成證書請求
-changealias 更改條目的別名
-delete 刪除條目
-exportcert 導(dǎo)出證書
-genkeypair 生成密鑰對
-genseckey 生成密鑰 genkey
-gencert 根據(jù)證書請求生成證書
-importcert 導(dǎo)入證書或證書鏈
-importpass 導(dǎo)入口令
-importkeystore 從其他密鑰庫導(dǎo)入一個或所有條目
-keypasswd 更改條目的密鑰口令 私鑰加解密密碼
-list 列出密鑰庫中的條目
-printcert 打印證書內(nèi)容
-printcertreq 打印證書請求的內(nèi)容
-printcrl 打印 CRL 文件的內(nèi)容
-storepasswd 更改密鑰庫的存儲口令 文件存儲密碼
刪除
keytool -delete -alias client -keystore client.p12 -keypass 123456 -storepass 123456
keytool -delete -alias server -keystore server.p12 -keypass 123456 -storepass 123456
keytool -delete -alias trustKeys -keystore trustKeys.p12 -keypass 123456 -storepass 123456
keytool -delete -alias localhost -keystore localhost.p12 -keypass 123456 -storepass 123456
查看證書
keytool -list -v -keystore trustKeys.jks -keypass 123456 -storepass 123456
keystore[7]
生成ca/server/client的keypair
keytool -genkeypair -alias ca -keystore ca.keystore -storepass 123456
生成證書請求文件 client.csr
keytool -certreq -alias client -keystore client.keystore -storepass 123456 -file client.csr
用ca進行 client.cer 證書簽發(fā)
keytool -gencert -alias ca -keystore ca.keystore -storepass 123456 -infile client.csr -outfile client.cer
導(dǎo)出ca證書 (含ca公鑰)
keytool -exportcert -alias ca -keystore ca.keystore -storepass 123456 -file ca.cer
把ca證書和ca簽名的client證書都導(dǎo)入到client的keystore中, 導(dǎo)入的client.cer將會替換原來client.keystore中相同別名的證書
keytool -importcert -alias ca -keystore client.keystore -storepass 123456 -file ca.cer
keytool -importcert -alias client -keystore client.keystore -storepass 123456 -file client.cer
轉(zhuǎn)為jks格式
keytool -importkeystore -srckeystore hanclientk.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore client.jks -keypass 123456 -storepass 123456
p12
根CA (自簽CA, 使用者和頒發(fā)者都是它自己), rootca.keystore (pkcs12)
keytool -genkeypair -alias rootca -storetype PKCS12 -keystore rootca.keystore -validity 3650 -keysize 2048 -keyalg RSA -sigalg SHA256withRSA -v -dname "C=CN,ST=SX,L=CZ,O=mycpmpany,OU=mygroup,CN=127.0.0.1" -keypass 123456 -storepass 123456
從密鑰庫中導(dǎo)出 cer 證書, rootca.cer
keytool -exportcert -alias rootca -keystore rootca.keystore -file rootca.cer -keypass 123456 -storepass 123456
生成 pkcs12 的keystore文件 serverKeystore.jks / clientKeystore.jks
keytool -genkeypair -alias server -storetype PKCS12 -keyalg RSA -keysize 1024 -sigalg SHA256withRSA -validity 3650 -keystore serverKeystore.jks -v -dname "C=CN,ST=SX,L=CZ,O=mycpmpany,OU=mygroup,CN=127.0.0.1" -keypass 123456 -storepass 123456
keytool -genkeypair -alias client -storetype PKCS12 -keyalg RSA -keysize 1024 -sigalg SHA256withRSA -validity 3650 -keystore clientKeystore.jks -v -dname "C=CN,ST=SX,L=CZ,O=mycpmpany,OU=mygroup,CN=127.0.0.1" -keypass 123456 -storepass 123456
生成證書請求 csr 文件, server.csr / client.csr
keytool -certreq -alias server -keystore serverKeystore.jks -storepass 123456 -file server.csr
keytool -certreq -alias client -keystore clientKeystore.jks -storepass 123456 -file client.csr
用ca進行證書簽發(fā) server.cer / client.cer
keytool -gencert -alias rootca -keystore rootca.keystore -storepass 123456 -infile server.csr -outfile server.cer
keytool -gencert -alias rootca -keystore rootca.keystore -storepass 123456 -infile client.csr -outfile client.cer
把ca證書和ca簽名的client證書都導(dǎo)入到client的keystore中, 導(dǎo)入的client.cer將會替換原來client.keystore中相同別名的證書
keytool -importcert -alias ca -keystore client.keystore -storepass 123456 -file ca.cer
keytool -importcert -alias client -keystore client.keystore -storepass 123456 -file client.cer
從keystore中導(dǎo)出證書 server.cer / client.cer
keytool -exportcert -alias server -keystore serverKeystore.jks -file server.cer -keypass 123456 -storepass 123456
keytool -exportcert -alias server -keystore clientKeystore.jks -file client.cer -keypass 123456 -storepass 123456
將 cer 證書導(dǎo)入信任證書庫 clientTruststore.jks / serverTruststore.jks
keytool -importcert -alias trustServer -file server.cer -keystore clientTruststore.jks -keypass 123456 -storepass 123456
keytool -importcert -alias trustClient -file client.cer -keystore serverTruststore.jks -keypass 123456 -storepass 123456
jks
需要生成雙方的密鑰文件,并把對方的cert導(dǎo)入自己的密鑰文件里[8]
Warning:
JKS 密鑰庫使用專用格式。建議使用 "keytool -importkeystore -srckeystore server.jks -destkeystore server.jks -deststoretype pkcs12" 遷移到行業(yè)標(biāo)準(zhǔn)格式 PKCS12。
以jks格式生成服務(wù)器端包含Public key和Private Key的keystore文件 server.jks
keytool -genkey -alias server -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keystore server.jks -validity 3650 -v -dname "C=CN,ST=SX,L=CZ,O=mycpmpany,OU=mygroup,CN=myserver" -keypass 123456 -storepass 123456
從keystore中導(dǎo)出別名為server的服務(wù)端證書 server.cer
keytool -keystore server.jks -export -alias server -file server.cer -keypass 123456 -storepass 123456
以jks格式生成服務(wù)器端包含Public key和Private Key的keystore文件 client.jks
keytool -genkey -alias client -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keystore client.jks -validity 3650 -v -dname "C=CN,ST=SX,L=CZ,O=mycpmpany,OU=mygroup,CN=myclient" -keypass 123456 -storepass 123456
從keystore中導(dǎo)出別名為client的客戶端證書 client.cer
keytool -keystore client.jks -export -alias client -file client.cer -keypass 123456 -storepass 123456
把客戶端的 cer 導(dǎo)入到服務(wù)端
keytool -import -alias client -file client.cer -keystore server.jks -keypass 123456 -storepass 123456
把服務(wù)端的 cer 導(dǎo)入到客戶端
keytool -import -alias server -file server.cer -keystore client.jks -keypass 123456 -storepass 123456
分別把 cer 導(dǎo)入 信任庫 serverTruststore.jks / clientTruststore.jks / 公共的truststore.jks
keytool -import -alias trustClient -file client.cer -keystore serverTruststore.jks -keypass 123456 -storepass 123456
keytool -import -alias trustServer -file server.cer -keystore clientTruststore.jks -keypass 123456 -storepass 123456
檢驗服務(wù)端是否具有自己的private key和客戶端的cert
keytool -list -keystore server.jks
轉(zhuǎn)換JKS格式為P12, JKS是Java的密鑰文件格式,轉(zhuǎn)換成通用的PKCS12格式 (*.p12 / *.pfx)
keytool -importkeystore -srckeystore client.jks -destkeystore client.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass 123456 -deststorepass 123456 -srckeypass 123456 -destkeypass 123456 -srcalias client -destalias client -noprompt
SpringBoot yml 配置
server:
ssl:
enabled: true
key-store-type: JKS # PKCS12 #JKS
key-store: classpath:certificate/server.jks
key-store-password: 123456
key-alias: server
client-auth: need
trust-store-provider: SUN
trust-store-type: JKS
trust-store: classpath:certificate/server.jks # serverTruststore.jks
trust-store-password: 123456
測試驗證
curl
-
--cert
指定客戶端公鑰證書的路徑 -
-key
指定客戶端私鑰文件的路徑 -
-k
不校驗證書的合法性,因為我們用的是自簽名證書,所以需要加這個參數(shù) -
-v
可選, 來觀察具體的SSL握手過程
導(dǎo)出客戶端的cert文件
openssl pkcs12 -nokeys -in client.p12 -out client.pem
導(dǎo)出客戶端的key文件
openssl pkcs12 -nocerts -nodes -in client.p12 -out client.key
使用 cert 和 key 測試
curl -k --cert client.pem --key client.key https://localhost/hello
使用密碼測試
-
openssl pkcs12 -in client.p12 -nodes -out client.pem -password pass:123456
導(dǎo)出 pem -
curl -k --cert client.pem:123456 https://localhost/hello
測試