[工具] SSL 證書

操作記錄

創(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)

  1. 生成根證書密鑰 root.key (生成 RSA私鑰)
    openssl genrsa -out root.key 2048 -aes256 -passout pass:123456
  2. 生成根證書請求文件 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"
  3. 自簽根證書 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)

  1. 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 公鑰
  1. 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"
  2. 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
  3. 將證書轉(zhuǎn)為p12格式, p12格式的證書包含公私鑰
    openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12 -passout pass:123456

客戶端

  1. client.key 客戶端的私鑰文件
    openssl genrsa -out client.key 2048 -aes256 -passout pass:123456
  2. 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"
  3. client.crt 有效期十年的客戶端證書,使用根證書和客戶端私鑰一起生成
    openssl x509 -req -days 3650 -sha256 -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -in client.csr -out client.crt
  4. client.p12 客戶端p12格式,這個證書文件包含客戶端的公鑰和私鑰,主要用來給瀏覽器訪問使用
    openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12 -passout pass:123456
  5. 使用 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同時添加證書鏈, -CAfileCA證書,導(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

使用密碼測試

  1. openssl pkcs12 -in client.p12 -nodes -out client.pem -password pass:123456 導(dǎo)出 pem
  2. curl -k --cert client.pem:123456 https://localhost/hello 測試

參考資料


  1. http://www.lxweimin.com/p/a7292b4db7bd ? ? ?

  2. https://blog.csdn.net/enweitech/article/details/81781405 ? ?

  3. http://www.lxweimin.com/p/3f20772cd0be ?

  4. https://www.cnblogs.com/mafly/p/ssl.html ? ?

  5. https://linux.cn/article-12293-1.html ?

  6. https://cloud.tencent.com/developer/article/1444793 ?

  7. https://bbs.huaweicloud.com/blogs/288569 ?

  8. https://www.cnblogs.com/larrydpk/p/12830365.html ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,643評論 2 380

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