亚洲成A人片在线观看网站_成年网站免费视频A在线双飞_日日日日做夜夜夜夜无码_久久夜色撩人精品国产小说

OpenSSL 備忘清單

這個 快速參考備忘(wang)單展示了它(ta)的常用命令(ling)使用清(qing)單

入門

基礎

檢查版本

$ openssl version -a

它在(zai)使(shi)用四(si)個 CPU 內(nei)核并測試 RSA 算(suan)法的(de)系(xi)統上運行速度有多快

$ openssl speed -multi 4 rsa

獲得基本幫助

$ openssl help

生成 20 個(ge)隨機字節并將它(ta)們(men)顯(xian)示在屏幕上

$ openssl rand -hex 20

編碼/解碼

使用 Base64 編碼文件(jian)

$ openssl base64 -in file.data

使用(yong) Base64 編碼一(yi)些文(wen)本

$ echo -n "some text" | openssl base64

Base64 解(jie)碼一(yi)(yi)個文件(jian)并輸出到另一(yi)(yi)個文件(jian)

$ openssl base64 -d -in encode-d.data -out decode-d.data

使用哈希

列出可用的摘要算法

$ openssl list -diges-t-a-lgo-rithms

使用 SHA256 散列(lie)文件

$ openssl dgst -sha256 file.data

使用 SHA256 散列文件及(ji)其二進制形式的(de)輸出(無(wu)輸出十六進制編碼) 沒有 ASCII 或編碼字符(fu)將打印(yin)到控制臺,只有純(chun)字節。 您(nin)可(ke)以附加(jia) ' | xxd'

$ openssl dgst -binary -sha256 file.data

使用 SHA3-512 的哈希文本

$ echo -n "some text" | openssl dgst -sha3-512

創(chuang)建 HMAC - 使用特(te)定密鑰(以字節為單位(wei))的文件的 SHA384

$ openssl dgst -SHA384 -mac HMAC -macopt hexkey:369bd7d655 file.data

創建 HMAC - 一些文(wen)本的 SHA512

$ echo -n "some text" | openssl dgst -mac HMAC -macopt hexkey-:36-9bd-7d655 -sha512

非對稱加密

列出可用的橢圓曲線

$ openssl ecparam -list_-curves

創建 4096 位 RSA 公私密鑰對

$ openssl genrsa -out pub_pr-iv.key 4096

顯示詳細的私鑰信息

$ openssl rsa -text -in pub_priv.key -noout

使用 AES-256 算(suan)法加(jia)密公私鑰對(dui)

$ openssl rsa -in pub_priv.key -out encrypted.key -aes256

刪除密鑰文件加密并將(jiang)它(ta)們保存到(dao)另一個文件

$ openssl rsa -in encrypted.key -out cleartext.key

將公(gong)私鑰對文件(jian)(jian)的公(gong)鑰復制到另一個文件(jian)(jian)中(zhong)

$ openssl rsa -in pub_priv.key -pubout -out pubkey.key

使用 RSA 公鑰加(jia)密文件

$ openssl rsautl -encrypt -inkey pubkey.key -pubin -in cleartext.file -out ciphertext.file

使用 RSA 私鑰解密(mi)文件(jian)

$ openssl rsautl -decrypt -inkey pub_priv.key -in ciphertext.file -out decrypted.file

使用 P-224 橢(tuo)圓曲線創建私鑰

$ openssl ecparam -name secp224k1 -genkey -out ecpriv.key

使用 3DES 算法加密私鑰

$ openssl ec -in ecP384priv.key -des3 -out ecP384priv_enc.key

對稱加密

列出所(suo)有支持的對稱加密密碼

$ openssl enc -list

使用提(ti)供的 ASCII 編碼密碼和 AES-128-ECB 算(suan)法(fa)加密文件

$ openssl enc -aes-128-ecb -in cleartext.file -out ciphertext.file -pass pass:thisisthepassword

使用(yong) AES-256-CBC 和(he)密(mi)鑰文件(jian)解密(mi)文件(jian)

$ openssl enc -d -aes-256-cbc -in ciphertext.file -out cleartext.file -pass file:./key.file

使(shi)用以十六進制數字形式提供的(de)特定加密(mi)(mi)密(mi)(mi)鑰 (K) 加密(mi)(mi)文件

$ openssl enc -aes-128-ecb -in cleartext.file -out ciphertext.file -K 1881807b2d1b3d22f14e9ec52563d981 -nosalt

使用指定(ding)的(de)加密(mi)(mi)密(mi)(mi)鑰(K:256 位)和初始化向量(iv:128 位)在 CBC 塊密(mi)(mi)碼模式下(xia)使用 ARIA 256 加密(mi)(mi)文(wen)件

$ openssl enc -aria-256-cbc -in cleartext.file -out ciphertext.file -K f92d2e986b7a2a01683b4c40d0cbcf6feaa669ef2bb5ec3a25ce85d9548291c1 -iv 470bc29762496046882b61ecee68e07c -nosalt

使(shi)用提供(gong)的密(mi)鑰和 iv 在 COUNTER 塊密(mi)碼模式下(xia)使(shi)用 Camellia 192 算(suan)法加(jia)密(mi)文件

$ openssl enc -camellia-192-ctr -in cleartext.file -out ciphertext.file -K 6c7a1b3487d28d3bf444186d7c529b48d67dd6206c7a1b34 -iv 470bc29762496046882b61ecee68e07c

數字簽名

為私鑰生成(cheng) DSA 參數。 2048 位長(chang)度

$ openssl dsaparam -out dsaparam.pem 2048

生成用于(yu)簽署(shu)文檔的 DSA 公私(si)密(mi)鑰并使用 AES128 算(suan)法(fa)對其進行保護

$ openssl gendsa -out dsaprivatekey.pem -aes-128-cbc dsaparam.pem

將DSA公(gong)私(si)鑰(yao)(yao)文件(jian)的公(gong)鑰(yao)(yao)復制(zhi)到另一個文件(jian)中

$ openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem

打印出(chu) DSA 密鑰對文件的內容(rong)

$ openssl dsa -in dsaprivatekey.pem -text -noout

使用 RSA 私鑰(yao)對文件(jian)的 sha-256 哈希(xi)進(jin)行(xing)簽名

$ openssl dgst -sha256 -sign rsakey.key -out signature.data document.pdf

使用公鑰驗(yan)證 SHA-256 文件簽名

$ openssl dgst -sha256 -verify publickey.pem -signature signature.data original.file

使用 DSA 私(si)鑰(yao)對文件(jian)的(de) sha3-512 哈希(xi)進行簽名

$ openssl pkeyutl -sign -pkeyopt digest:sha3-512 -in document.docx -inkey dsaprivatekey.pem -out signature.data

驗證 DSA 簽名

$ openssl pkeyutl -verify -sigfile dsasignature.data -inkey dsakey.pem -in document.docx

使用 P-384 橢圓曲線創建私(si)鑰

$ openssl ecparam -name secp384r1 -genkey -out ecP384priv.key

使用(yong)3DES算法(fa)加(jia)密私鑰

$ openssl ec -in ecP384priv.key -des3 -out ecP384priv_enc.key

使用(yong)帶有(you)生成密鑰(yao)的橢圓曲線對 PDF 文(wen)件(jian)進行(xing)簽名

$ openssl pkeyutl -sign -inkey ecP384priv_enc.key -pkeyopt digest:sha3-512 -in document.pdf -out signature.data

驗(yan)(yan)證文件的簽名。 如果沒(mei)問題,您必須收到“簽名驗(yan)(yan)證成功(gong)”

$ openssl pkeyutl -verify -in document.pdf -sigfile signature.data -inkey ecP384priv_enc.key

數字證書

生成 CSR 文件和 4096 位 RSA 密鑰(yao)對

$ openssl req -newkey rsa:4096 -keyout private.key -out request.csr

顯示證(zheng)書簽名請(qing)求 ( CSR ) 內容

$ openssl req -text -noout -in request.csr

顯示 CSR 文(wen)件(jian)中(zhong)包含的公鑰

$ openssl req -pubkey -noout -in request.csr

使用現有私鑰(yao)創建證(zheng)書簽名請求 ( CSR )。 當您(nin)需要(yao)在(zai)不更(geng)改私鑰(yao)的情況(kuang)下更(geng)新公共數(shu)字(zi)證(zheng)書時(shi),這會很有用

$ openssl req -new -key private.key -out request.csr

創建(jian) EC P384 曲線(xian)參數文件(jian)以在下(xia)一(yi)步中使用(yong)橢圓曲線(xian)生(sheng)成 CSR

$ openssl genpkey -genparam -algorithm EC -out EC_params.pem -pkeyopt ec_paramgen_curve:secp384r1 -pkeyopt ec_param_enc:named_curve

使用(yong)在上(shang)一步中創建(jian)的橢圓(yuan)曲線 P384 參(can)數文件創建(jian) CSR 文件。 而不是使用(yong) RSA 密鑰。

$ openssl req -newkey ec:EC_params.pem -keyout EC_P384_priv.key -out EC_request.csr

創建自簽名證書,新的 2048 位 RSA 密鑰對,有效期為一(yi)年

$ openssl req -newkey rsa:2048 -nodes -keyout priv.key -x509 -days 365 -out cert.crt

使用(yong)(yong) CSR 文(wen)件和用(yong)(yong)于簽(qian)名的(de)私鑰創建并簽(qian)署新(xin)證(zheng)書(您必須準備好 openssl.cnf 文(wen)件)

$ openssl ca -in request.csr -out certificate.crt -config ./CA/config/openssl.cnf

顯示(shi)PEM格式證書(shu)信息

$ openssl x509 -text -noout -in cert.crt

以 Abstract Sintax Notation One (ASN.1) 顯示證(zheng)書信(xin)息(xi)

$ openssl asn1parse -in cert.crt

提取證書的公鑰

$ openssl x509 -pubkey -noout -in cert.crt

在證書中提取公鑰的模數

$ openssl x509 -modulus -noout -in cert.crt

從(cong) HTTPS/TLS 連接中提(ti)取域證書

$ openssl s_client -connect domain.com:443 | openssl x509 -out certificate.crt

將證書從 PEM 格(ge)式(shi)轉(zhuan)換為 DER 格(ge)式(shi)

$ openssl x509 -inform PEM -outform DER -in cert.crt -out cert.der

檢(jian)查證書公鑰是否與(yu)私鑰和請(qing)求文件匹(pi)配。 每(mei)個文件一(yi)步。 必須(xu)在(zai)輸(shu)出哈希中匹(pi)配

$ openssl x509 -modulus -in certificate.crt -noout | openssl dgst -sha256
$ openssl rsa -modulus -in private.key -noout | openssl dgst -sha256
$ openssl req -modulus -in request.csr -noout | openssl dgst -sha256

使用 TLS 協議

列出所有支持的密碼套件(jian)

$ openssl ciphers -V 'ALL'

列出 AES 支(zhi)持(chi)的(de)所有密碼(ma)套件

$ openssl ciphers -V 'AES'

列出(chu)所(suo)有(you)支(zhi)持 CAMELLIA 和 SHA256 算(suan)法的密(mi)碼套件(jian)。

$ openssl ciphers -V 'CAMELLIA+SHA256'

使(shi)用端(duan)口 443 (HTTPS) 與服務器的 TLS 連接

$ openssl s_client -connect domain.com:443

使用 v1.2 與服務器的 TLS 連接

$ openssl s_client -tls1_2 -connect domain.com:443

TLS 連接(jie)和禁用(yong) v1.0

$ openssl s_client -no_tls1 domain.com:443

使用特定密碼套(tao)件的 TLS 連接(jie)

$ openssl s_client -cipher DHE-RSA-AES256-GCM-SHA384 domain.com:443

顯示服務器提供的所有證書的 TLS 連接

$ openssl s_client -showcerts domain.com:443

使用證書、私鑰(yao)和僅支持 TLS 1.2 設置監聽(ting)端口以接收 TLS 連接

$ openssl s_server -port 443 -cert cert.crt -key priv.key -tls1_2

從 HTTPS/TLS 連接(jie)中提取(qu)域證書

$ openssl s_client -connect domain.com:443 | openssl x509 -out certificate.crt

nmap 命令(ling):通過 HTTPS/TLS 連接顯示啟用(yong)的密碼套件

$ nmap --script ssl-enum-ciphers -p 443 domain.com

nmap 命令:使(shi)用 SNI 通(tong)過 TLS (HTTPS) 連接顯示啟用的密碼(ma)套件。 (將其(qi)更改為所需的 IP 和域(yu)名)

$ nmap --script ssl-enum-ciphers --script-args=tls.servername=domain.com 172.67.129.11

個人安全環境 (PSE)

將證書從(cong) PEM (base64) 格(ge)(ge)式轉(zhuan)換為 DER(二(er)進(jin)制(zhi))格(ge)(ge)式

$ openssl x509 -in certif-ica-te.pem -outform DER -out certif-ica-te.der

將(jiang)證(zheng)(zheng)書和私鑰插入 PKCS #12 格式文件。 這些文件可以(yi)導入到 Windows 證(zheng)(zheng)書管理器或(huo) Java Key Store (jks) 文件中

$ openssl pkcs12 -export -out cert_key.p12 -inkey private.key -in certificate.crt

顯(xian)示 PKCS #12 文件(jian)的內容(rong)

$ openssl pkcs12 -in cert_k-ey.p12

將 .p12 文件(jian)轉換為 Java Key Store。 此(ci)命令使(shi)用 java keytool 而不是 openssl。

keytool -importkeystore -destkeystore javakeystore.jks -srckeystore cert_key.p12 -srcstoretype pkcs12

將(jiang) PEM 證(zheng)書轉換為 PKCS #7 格式

$ openssl crl2pkcs7 -nocrl -certfile certificate.crt -out cert.p7b

將 PKCS #7 文件從 PEM 轉(zhuan)換為 DER

$ openssl pkcs7 -in cert.p7b -outform DER -out p7.der

查看

查看 PEM 編碼證書

使用具有證(zheng)書擴展(zhan)名(ming)的命令將(jiang) cert.xxx 替換為證(zheng)書名(ming)稱

$ openssl x509 -in cert.pem -text -noout
$ openssl x509 -in cert.cer -text -noout
$ openssl x509 -in cert.crt -text -noout

如果您(nin)收到以(yi)下(xia)錯(cuo)誤(wu),則(ze)表(biao)示您(nin)正在(zai)嘗試查(cha)看 DER 編碼的證書(shu),并且需要使用下(xia)面“查(cha)看 DER 編碼的證書(shu)”部(bu)分中的命令:

unable to load certificate
12626:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:647:Expecting: TRUSTED CERTIFICATE View DER encoded Certificate

查看 DER 編碼證書

openssl x509 -in certificate.der -inform der -text -noout

如果您收(shou)到以下(xia)錯誤(wu),則(ze)表示(shi)您正(zheng)在嘗試使用(yong)用(yong)于 DER 編(bian)(bian)碼(ma)(ma)證(zheng)書的命令查(cha)(cha)看 PEM 編(bian)(bian)碼(ma)(ma)證(zheng)書。 使用(yong)上(shang)面“查(cha)(cha)看 PEM 編(bian)(bian)碼(ma)(ma)證(zheng)書”部分中的命令:

unable to load certificate
13978:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1306:
13978:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:380:Type=X509

查看證書鏈中的所有證書

# subject + issuer
openssl crl2pkcs7 -nocrl -certfile host.domain.tld-ca-chain.pem | openssl pkcs7 -print_certs -noout
# full public keys
openssl crl2pkcs7 -nocrl -certfile host.domain.tld-ca-chain.pem | openssl pkcs7 -print_certs -text -noout

轉換

轉換示例

將 DER 文件 (.crt .cer .der) 轉換為(wei) PEM

openssl x509 -inform der -in certificate.cer -out certificate.pem

將 PEM 文件轉換為 DER

openssl x509 -outform der -in certificate.pem -out certificate.der

將包含私鑰和證書的 PKCS#12 文件 (.pfx .p12) 轉換為 PEM

openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes
# 您可以添(tian)加 -nocerts 以僅輸(shu)出(chu)私鑰或(huo)添(tian)加 -nokeys 以僅輸(shu)出(chu)證(zheng)書

將 PEM 證書文(wen)件(jian)和私(si)鑰轉換為 PKCS#12 (.pfx .p12)

openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt

將 PEM 轉(zhuan)換為 CRT(.CRT 文件)

openssl x509 -outform der -in certificate.pem -out certificate.crt

OpenSSL 轉換 PEM

將 PEM 轉換為(wei) DER

$ openssl x509 -outform der -in certificate.pem -out certificate.der

將 PEM 轉換為 P7B

$ openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CACert.cer

將 PEM 轉換為 PFX

$ openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt

OpenSSL 轉換 DER

將 DER 轉(zhuan)換為 PEM

$ openssl x509 -inform der -in certificate.cer -out certificate.pem

OpenSSL 轉換 PFX

將 PFX 轉換為 PEM

$ openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes

OpenSSL 轉換 P7B

將 P7B 轉換為 PEM

$ openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

將 P7B 轉(zhuan)換成 PFX

$ openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
$ openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CACert.cer

通過 OpenSSL 生成 rsa 密鑰

在命令行上使用 OpenSSL 您首先需要生成公鑰和私鑰。 您應該使用 -passout 參數對這(zhe)個(ge)文(wen)件(jian)進行密(mi)碼保護,這(zhe)個(ge)參數可(ke)以采用許多不同的形式,因此請查(cha)閱 OpenSSL 文(wen)檔

$ openssl genrsa -out private.pem 4096

這(zhe)將(jiang)創建一個(ge)名(ming)為 private.pem 的密鑰(yao)(yao)文(wen)件(jian),它使(shi)用 4096 位。 這(zhe)個(ge)文(wen)件(jian)實際上有私鑰(yao)(yao)和公(gong)鑰(yao)(yao),所以(yi)你應該從這(zhe)個(ge)文(wen)件(jian)中(zhong)提取公(gong)鑰(yao)(yao):

$ openssl rsa -in private.pem -out public.pem -outform PEM -pubout
# or
$ openssl rsa -in private.pem -pubout > public.pem
# or
$ openssl rsa -in private.pem -pubout -out public.pem

您(nin)現在將擁有僅包含您(nin)的公鑰(yao)的 public.pem,您(nin)可(ke)(ke)以與第 3 方自(zi)由共享。 您(nin)可(ke)(ke)以通(tong)過使用您(nin)的公鑰(yao)自(zi)己(ji)加密(mi)(mi)一些東西然后使用您(nin)的私鑰(yao)解密(mi)(mi)來測試這一切,首(shou)先(xian)我(wo)們(men)需要一些數據(ju)來加密(mi)(mi):

示例文件:

$ echo 'too many secrets' > file.txt

您(nin)現在在 file.txt 中有一(yi)些數據(ju),讓我(wo)們使(shi)用 OpenSSL 和(he)公(gong)鑰(yao)對其進行(xing)加密(mi):

$ openssl rsautl -encrypt -inkey public.pem -pubin -in file.txt -out file.ssl

這會創建一(yi)個 file.txt 的(de)加密版本,稱為 file.ssl,如果你看這個文件(jian),它只(zhi)是二(er)進制(zhi)垃圾,對(dui)任何人都沒有什么用處。 現在您(nin)可以使用私鑰對(dui)其進行解(jie)密:

$ openssl rsautl -decrypt -inkey private.pem -in file.ssl -out decrypted.txt

您現在(zai)將在(zai) decrypted.txt 中有一(yi)個未加密的文件:

cat decrypted.txt
 |output -> too many secrets

OpenSSL 中的 RSA 工具選項

NAME

$ rsa - RSA key processing tool

SYNOPSIS 概要

$ openssl rsa [-help] [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-aes128] [-aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-RSAPublicKey_in] [-RSAPublicKey_out] [-engine id]

DESCRIPTION 描述

rsa 命令處理 RSA 密鑰。 它(ta)們(men)可以在各種形式之間轉換,并(bing)且(qie)可以打印(yin)出它(ta)們(men)的組(zu)成部分。
請注意,此命令使用傳統的 SSLeay 兼(jian)容格式進行(xing)私鑰加密:較新的應用程序(xu)
應該使用 pkcs8 實用程序使用更安全的 PKCS#8 格式。

COMMAND OPTIONS 命(ming)令選項

-help
#> 打印(yin)出使用信息(xi)。

-inform DER|NET|PEM
#> 這指定了輸(shu)入格(ge)式(shi)(shi)。 DER 選項使(shi)用(yong)與(yu) PKCS #1 RSAPrivateKey 或(huo) SubjectPublicKeyInfo 格(ge)式(shi)(shi)兼容的 ASN1 DER 編(bian)碼(ma)形式(shi)(shi)。 PEM 形式(shi)(shi)是默認格(ge)式(shi)(shi):它由 DER 格(ge)式(shi)(shi) base64 編(bian)碼(ma),并帶有(you)額外(wai)的頁眉和(he)頁腳行。 輸(shu)入 PKCS#8 格(ge)式(shi)(shi)的私鑰(yao)也 接受。 NET 形式(shi)(shi)是一種在注釋部分中(zhong)描述(shu)的格(ge)式(shi)(shi)。

-outform DER|NET|PEM
#> 這指定了輸(shu)出格式,選項(xiang)與(yu) -inform 選項(xiang)具有相(xiang)同的含(han)義(yi)。

-in filename
#> 如果未(wei)指定(ding)此選項,這將(jiang)指定(ding)要從(cong)中讀取密(mi)鑰的輸(shu)入文件(jian)名或標(biao)準輸(shu)入。 如果密(mi)鑰被加密(mi),將(jiang)提示輸(shu)入密(mi)碼。

-passin arg
#> 輸入(ru)文件密碼(ma)源(yuan)。有關(guan) arg 格式的(de)更(geng)多信息,請參閱(yue) openssl 中的(de) PASS PHRASE ARGUMENTS 部分(fen)。

-out filename
#> 如(ru)果(guo)未指(zhi)定(ding)此(ci)選項,這將(jiang)指(zhi)定(ding)要(yao)寫入密鑰的輸(shu)(shu)(shu)出文件名或標準輸(shu)(shu)(shu)出。如(ru)果(guo)設置了任(ren)何加密選項,則會提示輸(shu)(shu)(shu)入密碼。輸(shu)(shu)(shu)出文件名不應與輸(shu)(shu)(shu)入文件名相同。

-passout password
#> 輸出(chu)文件密碼源(yuan)。有關(guan) arg 格(ge)式的更(geng)多信(xin)息,請參閱 openssl 中的 PASS PHRASE ARGUMENTS 部分。

-aes128|-aes192|-aes256|-camellia128|-camellia192|-camellia256|-des|-des3|-idea
#> 這些(xie)選(xuan)(xuan)項在輸出(chu)之前使用指定(ding)的密(mi)(mi)(mi)(mi)碼加(jia)密(mi)(mi)(mi)(mi)私(si)鑰。提(ti)示(shi)輸入密(mi)(mi)(mi)(mi)碼。如果未指定(ding)這些(xie)選(xuan)(xuan)項,則密(mi)(mi)(mi)(mi)鑰將以純(chun)文(wen)本(ben)形式寫入。這意(yi)味著使用 rsa 實(shi)用程序讀取沒有加(jia)密(mi)(mi)(mi)(mi)選(xuan)(xuan)項的加(jia)密(mi)(mi)(mi)(mi)密(mi)(mi)(mi)(mi)鑰可用于(yu)從密(mi)(mi)(mi)(mi)鑰中刪除密(mi)(mi)(mi)(mi)碼短(duan)語,或者(zhe)通過設置可用于(yu)添(tian)加(jia)或更(geng)改密(mi)(mi)(mi)(mi)碼短(duan)語的加(jia)密(mi)(mi)(mi)(mi)選(xuan)(xuan)項。這些(xie)選(xuan)(xuan)項只能用于(yu) PEM 格式的輸出(chu)文(wen)件。

-text
#> 除了編碼版本之外,還以純文本形式打印出各種公鑰(yao)或私(si)鑰(yao)組件。

-noout
#> 此選項可防止(zhi)輸(shu)出密鑰(yao)的編碼版本(ben)。

-modulus
#> 此(ci)選項打印出密(mi)鑰(yao)模數的(de)值。

-check
#> 此選項檢查 RSA 私(si)鑰的(de)一致性。

-pubin
#> 默認情況下,從輸入文件中讀取私(si)鑰:使用此選項,改為讀取公(gong)鑰。

-pubout
#> 默認情況下(xia)輸(shu)出私鑰:使用(yong)此選項將(jiang)輸(shu)出公(gong)鑰。 如果輸(shu)入(ru)是公(gong)鑰,則會自動設置此選項。

-RSAPublicKey_in, -RSAPublicKey_out
#> 類似于(yu) -pubin 和 -pubout,除(chu)了使用 RSAPublicKey 格式(shi)。

-engine id
#> 指定(ding)引擎(通過(guo)其(qi)唯(wei)一(yi) ID 字符(fu)串)將(jiang)導致 rsa 嘗試獲(huo)取對指定(ding)引擎的(de)(de)功(gong)能引用,從而在需要時對其(qi)進行初(chu)始(shi)化。 然后引擎將(jiang)被設置為(wei)所有(you)可用算法(fa)的(de)(de)默認值。

支持以下加密算法

  • -aes128
  • -aes192
  • -aes256
  • -des3
  • -des

示例

要刪除 RSA 私鑰(yao)上的密碼短(duan)語:

$ openssl rsa -in key.pem -out keyout.pem

要使用三重 DES 加密(mi)私鑰:

$ openssl rsa -in key.pem -des3 -out keyout.pem

要將私鑰從 PEM 格式轉換為 DER 格式:

$ openssl rsa -in key.pem -outform DER -out keyout.der

將私鑰的組件打印(yin)到標準輸出:

$ openssl rsa -in key.pem -text -noout

僅輸出私鑰的公共部分:

$ openssl rsa -in key.pem -pubout -out pubkey.pem

以 RSAPublicKey 格式(shi)輸出私鑰的公共(gong)部(bu)分:

$ openssl rsa -in key.pem -RSAPublicKey_out -out pubkey.pem

格式

RSA 公鑰

-----BEGIN RSA PUBLIC KEY-----
-----END RSA PUBLIC KEY-----

加密的 PEM 私鑰

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
-----END RSA PRIVATE KEY-----

識別為 PEM 格式

為了(le)讓(rang) OpenSSL 將其識別為 PEM 格式,它必須使用 Base64 進行編碼(ma),并帶有以下標頭(tou):

-----BEGIN CERTIFICATE-----
and footer :
-----END CERTIFICATE-----

此外,每行的(de)長度不得(de)超過 79 個字符。 否(fou)則你會(hui)收(shou)到(dao)錯誤(wu):

2675996:error:0906D064:PEM routines:PEM_read_bio:bad base64 decode:pem_lib.c:818:

注意:PEM 標準 (RFC1421) 要求(qiu)行長度為 64 個字符。 可以使用 UNIX 命(ming)令行實用程序(xu)轉換存儲(chu)為單(dan)行的(de) PEM 證書:

$ fold -w 64

  • PKCS#1 RSAPublicKey (PEM header: BEGIN RSA PUBLIC KEY)
  • PKCS#8 EncryptedPrivateKeyInfo (PEM header: BEGIN ENCRYPTED PRIVATE KEY)
  • PKCS#8 PrivateKeyInfo (PEM header: BEGIN PRIVATE KEY)
  • X.509 SubjectPublicKeyInfo (PEM header: BEGIN PUBLIC KEY)
  • CSR PEM header : (PEM header:—-BEGIN NEW CERTIFICATE REQUEST—–)
  • DSA PrivateKeyInfo (PEM header: (—–BEGIN DSA PRIVATE KEY—-)

CRL

-----BEGIN X509 CRL-----
-----END X509 CRL-----

CRT

-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----

CSR

-----BEGIN CERTIFICATE REQUEST-----
-----END CERTIFICATE REQUEST-----

NEW CSR

-----BEGIN NEW CERTIFICATE REQUEST-----
-----END NEW CERTIFICATE REQUEST-----

PEM

-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----

PKCS7

-----BEGIN PKCS7-----
-----END PKCS7-----

私鑰

-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----

DSA密鑰

-----BEGIN DSA PRIVATE KEY-----
-----END DSA PRIVATE KEY-----

橢圓曲線

-----BEGIN EC PRIVATE KEY-----
-----BEGIN EC PRIVATE KEY-----

PGP 私鑰

-----BEGIN PGP PRIVATE KEY BLOCK-----
-----END PGP PRIVATE KEY BLOCK-----

PGP 公鑰

-----BEGIN PGP PUBLIC KEY BLOCK-----
-----END PGP PUBLIC KEY BLOCK-----

校驗

介紹

在建(jian)立(li) SSL/TLS 連接之前,客(ke)戶(hu)端需要確(que)保收到的證(zheng)書有效。為了做到這(zhe)一點(dian),客(ke)戶(hu)端不僅要驗證(zheng)其公鑰的真實性,還(huan)要驗證(zheng)與(yu)之相關的其他(ta)元(yuan)數據(ju)(了解(jie)這(zhe)一點(dian)對于了解(jie)典(dian)型數字證(zheng)書的內(nei)容(rong)很重要):

  • 簽名驗證 這確保了證書沒有以任何方式被更改
  • 證書尚未過期 當證書由 CA 頒發時,它會指定一個到期日期
  • 證書主題與主機名匹配 證書是為特定服務器頒發的。因此,證書主題名稱需要與客戶端嘗試連接的 URL 相匹配
  • 它沒有被撤銷 有時證書可以在任何需要的情況下被其頒發者撤銷(例如,關聯的私鑰已被公開,因此證書無效)
  • 它由受信任的 CA 簽名 為了證明證書的真實性,我們需要獲取 CA 證書并驗證其可信度。然而在 PKI 中有一個信任鏈的概念,因此 CA 證書可能是由另一個 CA 頒發的。因此我們需要獲得另一個 CA 的證書并驗證它。依此類推……因此,為了信任證書,我們需要一直導航到根 CA。最后,如果我們信任根 CA,可以肯定地說我們信任整個鏈

驗證信任鏈

a) 您的(de)整個 CA 鏈在(zai)一(yi)個文(wen)件中,實際的(de)網絡服(fu)務(wu)器或(huo)客戶端證書在(zai)另一(yi)個文(wen)件中

$ openssl verify -untrusted ca-chain.pem 客戶端證書.pem

b) 單(dan)獨(du)文(wen)件(jian)中的根證(zheng)書(shu)和中間(jian)證(zheng)書(shu)以及(ji)另一個文(wen)件(jian)中的實際網絡服務器或客(ke)戶端(duan)證(zheng)書(shu)

$ openssl verify -CAfile root.pem -untrusted intermediate-chain.pem client-cert.pem

如果您有多個中間 CA(例如 root.pem -> intermediate1.pem -> intermediate2.pem -> client-cert.pem),將它們連接到一個文件中并通過:-untrusted intermediate-chain.pem 或執行它與 cat:

$ openssl verify -CAfile root.pem -untrusted <(cat intermediate1.pem intermediate2.pem) client-cert.pem

實例

$ openssl verify -CAfile letsencrypt-root-cert/isrgrootx1.pem.txt -untrusted letsencrypt-intermediate-cert/letsencryptauthorityx3.pem.txt /etc/letsencrypt/live/sitename.tld/cert.pem 
/etc/letsencrypt/live/sitename.tld/cert.pem: OK

截止日期

$ openssl x509 -enddate -noout -in file.pem

驗證本地證書文件

這(zhe)是我的 bash 命令行,用于按過期順序列出多個證書,最近過期的證書最先過期。

for pem in /etc/ssl/certs/*.pem; do 
    printf '%s: %s\n' \
      "$(date --date="$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" --iso-8601)" \
      "$pem"
done | sort

示例輸出:

2014-12-16: /etc/ssl/certs/Staat_der_Nederlanden_Root_CA.pem
2015-03-22: /etc/ssl/certs/CA_Disig.pem
2015-08-14: /etc/ssl/certs/EBG_Elektronik_Sertifika_Hizmet_S.pem

驗證遠程服務器

這是一個 bash 函(han)數(shu),它(ta)會檢查你(ni)(ni)所(suo)有(you)的(de)服務器,假設你(ni)(ni)正在使用 DNS 循環法。 請(qing)注意,這需要 GNU 日期并且不能(neng)在 Mac OS 上運行

function check_certs () {
  if [ -z "$1" ]
  then
    echo "domain name missing"
    exit 1
  fi
  name="$1"
  shift

  now_epoch=$( date +%s )

  dig +noall +answer $name | while read _ _ _ _ ip;
  do
    echo -n "$ip:"
    expiry_date=$( echo | openssl s_client -showcerts -servername $name -connect $ip:443 2>/dev/null | openssl x509 -inform pem -noout -enddate | cut -d "=" -f 2 )
    echo -n " $expiry_date";
    expiry_epoch=$( date -d "$expiry_date" +%s )
    expiry_days="$(( ($expiry_epoch - $now_epoch) / (3600 * 24) ))"
    echo "    $expiry_days days"
  done
}

輸出示例:

$ check_certs stackoverflow.com
151.101.1.69: Aug 14 12:00:00 2019 GMT    603 days
151.101.65.69: Aug 14 12:00:00 2019 GMT    603 days
151.101.129.69: Aug 14 12:00:00 2019 GMT    603 days
151.101.193.69: Aug 14 12:00:00 2019 GMT    603 days

驗證 curl

curl --insecure -v //www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'

* Server certificate:
*  subject: C=US; ST=California; L=Mountain View; O=Google LLC; CN=www.google.com
*  start date: Mar  1 09:46:35 2019 GMT
*  expire date: May 24 09:25:00 2019 GMT
*  issuer: C=US; O=Google Trust Services; CN=Google Internet Authority G3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7ff5dc803600)
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
* Connection #0 to host www.google.com left intact

您需要為 curl 提供整個證書鏈,因為 curl 不再附帶任何 CA 證(zheng)(zheng)書(shu)。 由于 cacert 選項(xiang)只能(neng)使(shi)用(yong)一個(ge)文件,因此您(nin)需(xu)要將完整(zheng)的鏈信息(xi)連接(jie)到 1 個(ge)文件中(zhong)。 從(cong) 獲(huo)取(qu)根(gen) CA 證(zheng)(zheng)書(shu)包。

$ curl --cacert certRepo -u user:passwd -X GET -H 'Content-Type: application/json' "https//somesecureserver.com/rest/field"

驗證 openssl s_client

使用 SNI

如果遠程服務器使用 SNI(即在一個 IP 地址上共享多個 SSL 主機),您將需要發送正確的主機名以獲得正確的證書(-servername 選項用(yong)于啟用(yong) SNI 支持)。

$ openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null

沒有 SNI

如果遠程服務器沒有使用 SNI,那么你可以跳過 -servername 參數:

openssl s_client -showcerts -connect www.example.com:443 </dev/null

要(yao)查看站點(dian)證書(shu)的完整詳細信息,您也可以使(shi)用以下命令鏈:

$ echo | \
    openssl s_client -servername www.example.com -connect www.example.com:443 2>/dev/null | \
    openssl x509 -text

對于帶有 starttls 的 SMTP,請使用(yong):

$ openssl s_client -connect server:port -starttls smtp

對于(yu) Client Auth 保(bao)護的資源,請使用:

$ openssl s_client -connect host:port -key our_private_key.pem -showcerts \
    -cert our_server-signed_cert.pem

-prexit 也會返回數據:

$ openssl s_client -connect host:port -prexit

使用私鑰驗證 TLS 證書

希望您(nin)永遠不(bu)會遇到不(bu)知(zhi)道用于(yu)生成 TLS 證書(shu)的私鑰的情況,但(dan)如果(guo)您(nin)知(zhi)道……這里是您(nin)可以檢查的方法。

注意:這比將證書上(shang)傳到生(sheng)產(chan)環(huan)境以檢查它(ta)們更好??

假(jia)設我(wo)們已經生成了一(yi)個名為 example.com.key 的私鑰(yao)和一(yi)個名為 example.com.crt 的證書,我(wo)們可以使(shi)用 openssl 檢(jian)查 MD5 哈(ha)希值(zhi)是否相(xiang)同(tong):

$ openssl x509 -noout -modulus -in example.com.crt | openssl md5
$ openssl rsa -noout -modulus -in example.com.key | openssl md5

為(wei)了讓事情變(bian)得更好,你可以寫一個腳本:

#!/bin/bash
CERT_MD5=$(openssl x509 -noout -modulus -in example.com.crt | openssl md5)
 KEY_MD5=$(openssl rsa  -noout -modulus -in example.com.key | openssl md5)

if [ "$CERT_MD5" == "$KEY_MD5" ]; then
  echo "Private key matches certificate"
else
  echo "Private key does not match certificate"
fi

Java Key store

Java 密鑰庫

$ keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 
$ ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer
$ keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit

創建

使用 certstrap 創建開發證書

$ brew install certstrap
$ certstrap init --common-name "ExampleDevCA" --expires "10 years" -o "My Tech Inc." -c "DE" -l "Muenchen" --st "Bayern" --stdout
$ certstrap request-cert --common-name "example.localhost" -o "My Tech Inc." -c "DE" -l "Muenchen" --st "Bayern" --stdout --domain "*.example.localhost","example.localhost","localhost"
$ certstrap sign "example.localhost" --CA ExampleDevCA

使用 mkcert 創建開發證書

$ brew install mkcert
$ mkcert "*.example.localhost"

# Clean up with:
$ rm -vrf "$HOME/Library/Application Support/mkcert"  _wildcard.example*

另見

  • (openssl.org)
  • (cheatography.com)
  • (megamorf.gitlab.io)