国产成人精品999视频&日本一区二区亚洲人妻精品&久久久精品国产99久久精&99热这里只有成人精品国产&精品国产剧情av一区二区&成人亚洲精品久久久久app&国产精品美女高潮抽搐A片

OpenSSL 備忘清單

這個(gè) OpenSSL 快速參考備忘單展示了它的常用命令使用清單

入門

基礎(chǔ)

檢查版本

$ openssl version -a

它在使用四個(gè) CPU 內(nèi)核并測試 RSA 算法的系統(tǒng)上運(yùn)行速度有多快

$ openssl speed -multi 4 rsa

獲得基本幫助

$ openssl help

生成 20 個(gè)隨機(jī)字節(jié)并將它們顯示在屏幕上

$ openssl rand -hex 20

編碼/解碼

使用 Base64 編碼文件

$ openssl base64 -in file.data

使用 Base64 編碼一些文本

$ echo -n "some text" | openssl base64

Base64 解碼一個(gè)文件并輸出到另一個(gè)文件

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

使用哈希

列出可用的摘要算法

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

使用 SHA256 散列文件

$ openssl dgst -sha256 file.data

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

$ openssl dgst -binary -sha256 file.data

使用 SHA3-512 的哈希文本

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

創(chuàng)建 HMAC - 使用特定密鑰(以字節(jié)為單位)的文件的 SHA384

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

創(chuàng)建 HMAC - 一些文本的 SHA512

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

非對稱加密

列出可用的橢圓曲線

$ openssl ecparam -list_-curves

創(chuàng)建 4096 位 RSA 公私密鑰對

$ openssl genrsa -out pub_pr-iv.key 4096

顯示詳細(xì)的私鑰信息

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

使用 AES-256 算法加密公私鑰對

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

刪除密鑰文件加密并將它們保存到另一個(gè)文件

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

將公私鑰對文件的公鑰復(fù)制到另一個(gè)文件中

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

使用 RSA 公鑰加密文件

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

使用 RSA 私鑰解密文件

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

使用 P-224 橢圓曲線創(chuàng)建私鑰

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

使用 3DES 算法加密私鑰

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

對稱加密

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

$ openssl enc -list

使用提供的 ASCII 編碼密碼和 AES-128-ECB 算法加密文件

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

使用 AES-256-CBC 和密鑰文件解密文件

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

使用以十六進(jìn)制數(shù)字形式提供的特定加密密鑰 (K) 加密文件

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

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

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

使用提供的密鑰和 iv 在 COUNTER 塊密碼模式下使用 Camellia 192 算法加密文件

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

數(shù)字簽名

為私鑰生成 DSA 參數(shù)。 2048 位長度

$ openssl dsaparam -out dsaparam.pem 2048

生成用于簽署文檔的 DSA 公私密鑰并使用 AES128 算法對其進(jìn)行保護(hù)

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

將DSA公私鑰文件的公鑰復(fù)制到另一個(gè)文件中

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

打印出 DSA 密鑰對文件的內(nèi)容

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

使用 RSA 私鑰對文件的 sha-256 哈希進(jìn)行簽名

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

使用公鑰驗(yàn)證 SHA-256 文件簽名

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

使用 DSA 私鑰對文件的 sha3-512 哈希進(jìn)行簽名

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

驗(yàn)證 DSA 簽名

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

使用 P-384 橢圓曲線創(chuàng)建私鑰

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

使用3DES算法加密私鑰

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

使用帶有生成密鑰的橢圓曲線對 PDF 文件進(jìn)行簽名

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

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

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

數(shù)字證書

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

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

顯示證書簽名請求 ( CSR ) 內(nèi)容

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

顯示 CSR 文件中包含的公鑰

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

使用現(xiàn)有私鑰創(chuàng)建證書簽名請求 ( CSR )。 當(dāng)您需要在不更改私鑰的情況下更新公共數(shù)字證書時(shí),這會很有用

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

創(chuàng)建 EC P384 曲線參數(shù)文件以在下一步中使用橢圓曲線生成 CSR

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

使用在上一步中創(chuàng)建的橢圓曲線 P384 參數(shù)文件創(chuàng)建 CSR 文件。 而不是使用 RSA 密鑰。

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

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

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

使用 CSR 文件和用于簽名的私鑰創(chuàng)建并簽署新證書(您必須準(zhǔn)備好 openssl.cnf 文件)

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

顯示PEM格式證書信息

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

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

$ openssl asn1parse -in cert.crt

提取證書的公鑰

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

在證書中提取公鑰的模數(shù)

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

從 HTTPS/TLS 連接中提取域證書

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

將證書從 PEM 格式轉(zhuǎn)換為 DER 格式

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

檢查證書公鑰是否與私鑰和請求文件匹配。 每個(gè)文件一步。 必須在輸出哈希中匹配

$ 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 協(xié)議

列出所有支持的密碼套件

$ openssl ciphers -V 'ALL'

列出 AES 支持的所有密碼套件

$ openssl ciphers -V 'AES'

列出所有支持 CAMELLIA 和 SHA256 算法的密碼套件。

$ openssl ciphers -V 'CAMELLIA+SHA256'

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

$ openssl s_client -connect domain.com:443

使用 v1.2 與服務(wù)器的 TLS 連接

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

TLS 連接和禁用 v1.0

$ openssl s_client -no_tls1 domain.com:443

使用特定密碼套件的 TLS 連接

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

顯示服務(wù)器提供的所有證書的 TLS 連接

$ openssl s_client -showcerts domain.com:443

使用證書、私鑰和僅支持 TLS 1.2 設(shè)置監(jiān)聽端口以接收 TLS 連接

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

從 HTTPS/TLS 連接中提取域證書

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

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

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

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

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

個(gè)人安全環(huán)境 (PSE)

將證書從 PEM (base64) 格式轉(zhuǎn)換為 DER(二進(jìn)制)格式

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

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

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

顯示 PKCS #12 文件的內(nèi)容

$ openssl pkcs12 -in cert_k-ey.p12

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

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

將 PEM 證書轉(zhuǎn)換為 PKCS #7 格式

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

將 PKCS #7 文件從 PEM 轉(zhuǎn)換為 DER

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

查看

查看 PEM 編碼證書

使用具有證書擴(kuò)展名的命令將 cert.xxx 替換為證書名稱

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

如果您收到以下錯(cuò)誤,則表示您正在嘗試查看 DER 編碼的證書,并且需要使用下面“查看 DER 編碼的證書”部分中的命令:

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

如果您收到以下錯(cuò)誤,則表示您正在嘗試使用用于 DER 編碼證書的命令查看 PEM 編碼證書。 使用上面“查看 PEM 編碼證書”部分中的命令:

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

轉(zhuǎn)換

轉(zhuǎn)換示例

將 DER 文件 (.crt .cer .der) 轉(zhuǎn)換為 PEM

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

將 PEM 文件轉(zhuǎn)換為 DER

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

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

openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes
# 您可以添加 -nocerts 以僅輸出私鑰或添加 -nokeys 以僅輸出證書

將 PEM 證書文件和私鑰轉(zhuǎn)換為 PKCS#12 (.pfx .p12)

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

將 PEM 轉(zhuǎn)換為 CRT(.CRT 文件)

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

OpenSSL 轉(zhuǎn)換 PEM

將 PEM 轉(zhuǎn)換為 DER

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

將 PEM 轉(zhuǎn)換為 P7B

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

將 PEM 轉(zhuǎn)換為 PFX

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

OpenSSL 轉(zhuǎn)換 DER

將 DER 轉(zhuǎn)換為 PEM

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

OpenSSL 轉(zhuǎn)換 PFX

將 PFX 轉(zhuǎn)換為 PEM

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

OpenSSL 轉(zhuǎn)換 P7B

將 P7B 轉(zhuǎn)換為 PEM

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

將 P7B 轉(zhuǎn)換成 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 您首先需要生成公鑰和私鑰。 您應(yīng)該使用 -passout 參數(shù)對這個(gè)文件進(jìn)行密碼保護(hù),這個(gè)參數(shù)可以采用許多不同的形式,因此請查閱 OpenSSL 文檔

$ openssl genrsa -out private.pem 4096

這將創(chuàng)建一個(gè)名為 private.pem 的密鑰文件,它使用 4096 位。 這個(gè)文件實(shí)際上有私鑰和公鑰,所以你應(yīng)該從這個(gè)文件中提取公鑰:

$ 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

您現(xiàn)在將擁有僅包含您的公鑰的 public.pem,您可以與第 3 方自由共享。 您可以通過使用您的公鑰自己加密一些東西然后使用您的私鑰解密來測試這一切,首先我們需要一些數(shù)據(jù)來加密:

示例文件:

$ echo 'too many secrets' > file.txt

您現(xiàn)在在 file.txt 中有一些數(shù)據(jù),讓我們使用 OpenSSL 和公鑰對其進(jìn)行加密:

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

這會創(chuàng)建一個(gè) file.txt 的加密版本,稱為 file.ssl,如果你看這個(gè)文件,它只是二進(jìn)制垃圾,對任何人都沒有什么用處。 現(xiàn)在您可以使用私鑰對其進(jìn)行解密:

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

您現(xiàn)在將在 decrypted.txt 中有一個(gè)未加密的文件:

cat decrypted.txt
 |output -> too many secrets

OpenSSL 中的 RSA 工具選項(xiàng)

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 密鑰。 它們可以在各種形式之間轉(zhuǎn)換,并且可以打印出它們的組成部分。
請注意,此命令使用傳統(tǒng)的 SSLeay 兼容格式進(jìn)行私鑰加密:較新的應(yīng)用程序
應(yīng)該使用 pkcs8 實(shí)用程序使用更安全的 PKCS#8 格式。

COMMAND OPTIONS 命令選項(xiàng)

-help
#> 打印出使用信息。

-inform DER|NET|PEM
#> 這指定了輸入格式。 DER 選項(xiàng)使用與 PKCS #1 RSAPrivateKey 或 SubjectPublicKeyInfo 格式兼容的 ASN1 DER 編碼形式。 PEM 形式是默認(rèn)格式:它由 DER 格式 base64 編碼,并帶有額外的頁眉和頁腳行。 輸入 PKCS#8 格式的私鑰也 接受。 NET 形式是一種在注釋部分中描述的格式。

-outform DER|NET|PEM
#> 這指定了輸出格式,選項(xiàng)與 -inform 選項(xiàng)具有相同的含義。

-in filename
#> 如果未指定此選項(xiàng),這將指定要從中讀取密鑰的輸入文件名或標(biāo)準(zhǔn)輸入。 如果密鑰被加密,將提示輸入密碼。

-passin arg
#> 輸入文件密碼源。有關(guān) arg 格式的更多信息,請參閱 openssl 中的 PASS PHRASE ARGUMENTS 部分。

-out filename
#> 如果未指定此選項(xiàng),這將指定要寫入密鑰的輸出文件名或標(biāo)準(zhǔn)輸出。如果設(shè)置了任何加密選項(xiàng),則會提示輸入密碼。輸出文件名不應(yīng)與輸入文件名相同。

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

-aes128|-aes192|-aes256|-camellia128|-camellia192|-camellia256|-des|-des3|-idea
#> 這些選項(xiàng)在輸出之前使用指定的密碼加密私鑰。提示輸入密碼。如果未指定這些選項(xiàng),則密鑰將以純文本形式寫入。這意味著使用 rsa 實(shí)用程序讀取沒有加密選項(xiàng)的加密密鑰可用于從密鑰中刪除密碼短語,或者通過設(shè)置可用于添加或更改密碼短語的加密選項(xiàng)。這些選項(xiàng)只能用于 PEM 格式的輸出文件。

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

-noout
#> 此選項(xiàng)可防止輸出密鑰的編碼版本。

-modulus
#> 此選項(xiàng)打印出密鑰模數(shù)的值。

-check
#> 此選項(xiàng)檢查 RSA 私鑰的一致性。

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

-pubout
#> 默認(rèn)情況下輸出私鑰:使用此選項(xiàng)將輸出公鑰。 如果輸入是公鑰,則會自動(dòng)設(shè)置此選項(xiàng)。

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

-engine id
#> 指定引擎(通過其唯一 ID 字符串)將導(dǎo)致 rsa 嘗試獲取對指定引擎的功能引用,從而在需要時(shí)對其進(jìn)行初始化。 然后引擎將被設(shè)置為所有可用算法的默認(rèn)值。

支持以下加密算法

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

示例

要?jiǎng)h除 RSA 私鑰上的密碼短語:

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

要使用三重 DES 加密私鑰:

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

要將私鑰從 PEM 格式轉(zhuǎn)換為 DER 格式:

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

將私鑰的組件打印到標(biāo)準(zhǔn)輸出:

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

僅輸出私鑰的公共部分:

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

以 RSAPublicKey 格式輸出私鑰的公共部分:

$ 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 格式

為了讓 OpenSSL 將其識別為 PEM 格式,它必須使用 Base64 進(jìn)行編碼,并帶有以下標(biāo)頭:

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

此外,每行的長度不得超過 79 個(gè)字符。 否則你會收到錯(cuò)誤:

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

注意:PEM 標(biāo)準(zhǔn) (RFC1421) 要求行長度為 64 個(gè)字符。 可以使用 UNIX 命令行實(shí)用程序轉(zhuǎn)換存儲為單行的 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-----

校驗(yàn)

介紹

在建立 SSL/TLS 連接之前,客戶端需要確保收到的證書有效。為了做到這一點(diǎn),客戶端不僅要驗(yàn)證其公鑰的真實(shí)性,還要驗(yàn)證與之相關(guān)的其他元數(shù)據(jù)(了解這一點(diǎn)對于了解典型數(shù)字證書的內(nèi)容很重要):

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

驗(yàn)證信任鏈

a) 您的整個(gè) CA 鏈在一個(gè)文件中,實(shí)際的網(wǎng)絡(luò)服務(wù)器或客戶端證書在另一個(gè)文件中

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

b) 單獨(dú)文件中的根證書和中間證書以及另一個(gè)文件中的實(shí)際網(wǎng)絡(luò)服務(wù)器或客戶端證書

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

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

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

實(shí)例

$ 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

驗(yàn)證本地證書文件

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

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

示例輸出:

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

驗(yàn)證遠(yuǎn)程服務(wù)器

這是一個(gè) bash 函數(shù),它會檢查你所有的服務(wù)器,假設(shè)你正在使用 DNS 循環(huán)法。 請注意,這需要 GNU 日期并且不能在 Mac OS 上運(yùn)行

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

驗(yàn)證 curl

curl --insecure -v https://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 提供整個(gè)證書鏈,因?yàn)?curl 不再附帶任何 CA 證書。 由于 cacert 選項(xiàng)只能使用一個(gè)文件,因此您需要將完整的鏈信息連接到 1 個(gè)文件中。 從 https://curl.haxx.se/ca/cacert.pem 獲取根 CA 證書包。

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

驗(yàn)證 openssl s_client

使用 SNI

如果遠(yuǎn)程服務(wù)器使用 SNI(即在一個(gè) IP 地址上共享多個(gè) SSL 主機(jī)),您將需要發(fā)送正確的主機(jī)名以獲得正確的證書(-servername 選項(xiàng)用于啟用 SNI 支持)。

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

沒有 SNI

如果遠(yuǎn)程服務(wù)器沒有使用 SNI,那么你可以跳過 -servername 參數(shù):

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

要查看站點(diǎn)證書的完整詳細(xì)信息,您也可以使用以下命令鏈:

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

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

$ openssl s_client -connect server:port -starttls smtp

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

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

-prexit 也會返回?cái)?shù)據(jù):

$ openssl s_client -connect host:port -prexit

使用私鑰驗(yàn)證 TLS 證書

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

注意:這比將證書上傳到生產(chǎn)環(huán)境以檢查它們更好??

假設(shè)我們已經(jīng)生成了一個(gè)名為 example.com.key 的私鑰和一個(gè)名為 example.com.crt 的證書,我們可以使用 openssl 檢查 MD5 哈希值是否相同:

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

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

#!/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

創(chuàng)建

使用 certstrap 創(chuàng)建開發(fā)證書

$ 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 創(chuàng)建開發(fā)證書

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

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

另見