OpenSSL 命令行速查指南:密钥生成、证书管理、加密与 TLS 诊断实战(reference 项目版)
文档知识库教程开发工具【免费下载链接】reference为开发人员分享快速参考备忘清单(速查表)项目地址https://gitcode.com/jaywcjlove/reference点击查看免费下载本文是基于 reference 开源速查表仓库中 OpenSSL 备忘清单 整理而成的深度实战指南。文章覆盖 OpenSSL 命令行在版本诊断、Base64 编码、摘要与 HMAC、RSA/EC/DSA 密钥管理、对称加密、数字签名、数字证书签发与转换、TLS 协议诊断、证书信任链校验以及 Java 密钥库迁移等场景下的完整用法并在仓库中对应的 README 条目与 Netcat 速查表 的加密传输示例中给出了交叉印证。读完本文你将能够独立完成从密钥生成、证书签发、格式转换到 TLS 连接诊断与证书链验证的完整工作流。一、入门与基础诊断在开始一切密钥与证书操作前先确认环境中的 OpenSSL 版本与能力。检查版本$ openssl version -a-a参数会输出完整的版本信息包括编译选项、默认目录如OPENSSLDIR、引擎支持等是排查为什么行为与文档不一致的第一手依据。性能基准测试$ openssl speed -multi 4 rsa-multi 4表示使用 4 个 CPU 内核并行测试rsa指定测试 RSA 算法。该命令用于评估当前机器上 RSA 加解密与签名验签的吞吐量可作为选型例如决定密钥位数与 TLS 握手开销的参考。获得基本帮助$ openssl helpopenssl help会列出所有可用的子命令标准命令、消息摘要命令、密码命令等。生成随机数$ openssl rand -hex 20生成 20 个随机字节并以十六进制显示常用于生成随机会话密钥、盐值或一次性口令。二、编码与哈希Base64、摘要与 HMACBase64 编码 / 解码对文件做 Base64 编码输出到标准输出$ openssl base64 -in file.data对文本做 Base64 编码$ echo -n some text | openssl base64将编码后的文件解码输出到另一个文件$ openssl base64 -d -in encoded.data -out decoded.data-d为解码模式。PEM 格式本质就是 Base64 编码加上头尾行见下文格式章节因此掌握base64子命令有助于理解证书文件的内部形态。使用哈希摘要算法列出当前 OpenSSL 支持的所有摘要算法$ openssl list -digest-algorithms使用 SHA256 对文件取哈希$ openssl dgst -sha256 file.data输出二进制形式不做十六进制编码控制台只出现纯字节可接| xxd查看$ openssl dgst -binary -sha256 file.data对文本取 SHA3-512 哈希$ echo -n some text | openssl dgst -sha3-512创建 HMAC带密钥的消息认证码HMAC 用于在共享密钥场景下同时保证数据完整性与来源可信。以十六进制字节形式提供密钥HMAC-SHA384$ openssl dgst -SHA384 -mac HMAC -macopt hexkey:369bd7d655 file.data对文本计算 HMAC-SHA512$ echo -n some text | openssl dgst -mac HMAC -macopt hexkey:369bd7d655 -sha512注意-macopt hexkey:...直接以十六进制字面量传入密钥字节比口令字符串更精确适合脚本化场景。三、非对称加密与密钥管理列出可用椭圆曲线$ openssl ecparam -list_curves输出所有内建命名曲线如secp224k1、secp384r1、prime256v1后续 EC 相关命令的-name参数取值即来源于此。RSA 密钥对生成、查看与导出公钥创建 4096 位 RSA 公私密钥对$ openssl genrsa -out pub_priv.key 4096显示详细的私钥信息-text输出各组成部分-noout抑制编码版本输出$ openssl rsa -text -in pub_priv.key -noout使用 AES-256 算法加密公私钥对提示输入口令$ openssl rsa -in pub_priv.key -out encrypted.key -aes256删除密钥文件的口令加密并另存为明文文件$ openssl rsa -in encrypted.key -out cleartext.key将公私钥对文件中的公钥复制到另一个文件$ openssl rsa -in pub_priv.key -pubout -out pubkey.key使用 RSA 公钥加密 / 私钥解密文件$ openssl rsautl -encrypt -inkey pubkey.key -pubin -in cleartext.file -out ciphertext.file $ openssl rsautl -decrypt -inkey pub_priv.key -in ciphertext.file -out decrypted.file-pubin告诉rsautl输入的是公钥解密侧使用含私钥的密钥对文件。RSA 加密适合小数据块密钥交换、数字信封大文件加密应使用下文对称加密章节的方案。椭圆曲线EC密钥使用 P-224 曲线secp224k1创建私钥$ openssl ecparam -name secp224k1 -genkey -out ecpriv.key使用 3DES 算法加密 EC 私钥$ openssl ec -in ecP384priv.key -des3 -out ecP384priv_enc.key四、对称加密列出所有支持的对称加密密码$ openssl enc -list输出包含aes-128-ecb、aes-256-cbc、aria-256-cbc、camellia-192-ctr、des3等全部可用算法名。使用 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-pass支持pass:明文口令、file:从文件读取口令、env:、fd:等多种口令来源。以十六进制形式提供特定密钥K加密文件不产生盐$ openssl enc -aes-128-ecb -in cleartext.file -out ciphertext.file -K 1881807b2d1b3d22f14e9ec52563d981 -nosalt以指定 256 位密钥K与 128 位初始化向量IV在 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要点ECB 模式无需 IVCBC/CTR 模式需要 IV-K与-iv均按十六进制字节传入生产场景优先 CBC/CTR/GCM 等带扩散或带认证的模式-nosalt仅在需要与固定密钥/向量严格对应时使用。在仓库中的实战交叉印证Netcat 加密传输本仓库的 Netcat 速查表 展示了openssl enc与nc组合的加密传输工作流服务器端192.168.1.9监听并解密$ nc -l 8000 | openssl enc -d -des3 -pass pass:password file.txt客户端加密后发送$ openssl enc -des3 -pass pass:password | nc 192.168.1.9 8000可见openssl enc既能作用于本地文件也能与管道配合实现先加密再传输的流式加密这是本指南对称加密章节的典型落地场景。五、数字签名DSA 密钥体系为私钥生成 DSA 参数2048 位$ openssl dsaparam -out dsaparam.pem 2048生成用于签署文档的 DSA 公私密钥并使用 AES128 算法保护$ openssl gendsa -out dsaprivatekey.pem -aes-128-cbc dsaparam.pem将 DSA 公私钥文件的公钥复制到另一个文件$ openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem打印 DSA 密钥对文件内容$ openssl dsa -in dsaprivatekey.pem -text -noout用 RSA 签名与验签使用 RSA 私钥对文件的 sha-256 哈希进行签名$ openssl dgst -sha256 -sign rsakey.key -out signature.data document.pdf使用公钥验证 SHA-256 文件签名$ openssl dgst -sha256 -verify publickey.pem -signature signature.data original.file用 pkeyutl 签名与验签DSA / EC使用 DSA 私钥对文件的 sha3-512 哈希进行签名$ 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 椭圆曲线创建私钥$ openssl ecparam -name secp384r1 -genkey -out ecP384priv.key使用 3DES 算法加密该私钥$ openssl ec -in ecP384priv.key -des3 -out ecP384priv_enc.key使用带生成密钥的椭圆曲线对 PDF 文件签名$ openssl pkeyutl -sign -inkey ecP384priv_enc.key -pkeyopt digest:sha3-512 -in document.pdf -out signature.data验证该文件的签名成功后收到签名验证成功$ openssl pkeyutl -verify -in document.pdf -sigfile signature.data -inkey ecP384priv_enc.key六、数字证书全流程生成 CSR 与密钥生成 CSR 文件和 4096 位 RSA 密钥对$ openssl req -newkey rsa:4096 -keyout private.key -out request.csr显示证书签名请求CSR内容$ openssl req -text -noout -in request.csr显示 CSR 文件中包含的公钥$ openssl req -pubkey -noout -in request.csr使用现有私钥创建 CSR适合在不更换私钥的情况下更新公共数字证书$ openssl req -new -key private.key -out request.csr使用椭圆曲线生成 CSR创建 EC P384 曲线参数文件$ openssl genpkey -genparam -algorithm EC -out EC_params.pem -pkeyopt ec_paramgen_curve:secp384r1 -pkeyopt ec_param_enc:named_curve使用上述参数文件创建 CSR以 EC 替代 RSA 密钥$ openssl req -newkey ec:EC_params.pem -keyout EC_P384_priv.key -out EC_request.csr自签名证书创建自签名证书新 2048 位 RSA 密钥对有效期一年$ openssl req -newkey rsa:2048 -nodes -keyout priv.key -x509 -days 365 -out cert.crt-nodesno DES表示私钥不做口令加密适合本地开发与测试-x509直接输出自签名证书而非 CSR。使用 CA 签署 CSR使用 CSR 文件和用于签名的私钥创建并签署新证书需要事先准备好openssl.cnf$ openssl ca -in request.csr -out certificate.crt -config ./CA/config/openssl.cnf查看证书信息显示 PEM 格式证书信息$ openssl x509 -text -noout -in cert.crt以 ASN.1Abstract Syntax Notation One语法显示证书的底层结构$ openssl asn1parse -in cert.crt提取证书中的公钥$ openssl x509 -pubkey -noout -in cert.crt提取证书中公钥的模数$ openssl x509 -modulus -noout -in cert.crt从 HTTPS/TLS 连接中直接提取域证书$ openssl s_client -connect domain.com:443 | openssl x509 -out certificate.crt将证书从 PEM 格式转换为 DER 格式$ openssl x509 -inform PEM -outform DER -in cert.crt -out cert.der校验证书、私钥与请求是否匹配分别对证书、私钥、CSR 求模数哈希三者的输出哈希必须一致$ 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 协议诊断密码套件查询列出所有支持的密码套件-V输出详细说明$ openssl ciphers -V ALL列出 AES 支持的所有密码套件$ openssl ciphers -V AES列出支持 CAMELLIA 和 SHA256 的密码套件$ openssl ciphers -V CAMELLIASHA256s_clientTLS 客户端诊断与服务器的 TLS 连接端口 443/HTTPS$ openssl s_client -connect domain.com:443强制使用 TLS 1.2 连接$ openssl s_client -tls1_2 -connect domain.com:443连接并禁用 TLS 1.0$ openssl s_client -no_tls1 domain.com:443使用特定密码套件连接$ openssl s_client -cipher DHE-RSA-AES256-GCM-SHA384 domain.com:443显示服务器提供的所有证书$ openssl s_client -showcerts domain.com:443s_server搭建临时 TLS 服务端使用证书、私钥仅支持 TLS 1.2监听端口接收 TLS 连接$ openssl s_server -port 443 -cert cert.crt -key priv.key -tls1_2结合 nmap 枚举远程启用的密码套件$ nmap --script ssl-enum-ciphers -p 443 domain.com使用 SNI 枚举启用密码套件替换为实际 IP 与域名$ nmap --script ssl-enum-ciphers --script-argstls.servernamedomain.com 172.67.129.11八、个人安全环境PSE与密钥库格式将证书从 PEMbase64转换为 DER二进制$ openssl x509 -in certificate.pem -outform DER -out certificate.der将证书和私钥打包为 PKCS #12 文件可导入 Windows 证书管理器或 Java Key Store$ openssl pkcs12 -export -out cert_key.p12 -inkey private.key -in certificate.crt显示 PKCS #12 文件内容$ openssl pkcs12 -in cert_key.p12将.p12文件转换为 Java Key Store使用 Java keytool 而非 openssl$ keytool -importkeystore -destkeystore javakeystore.jks -srckeystore cert_key.p12 -srcstoretype pkcs12将 PEM 证书转换为 PKCS #7 格式$ openssl crl2pkcs7 -nocrl -certfile certificate.crt -out cert.p7b将 PKCS #7 文件从 PEM 转换为 DER$ openssl pkcs7 -in cert.p7b -outform DER -out p7.der九、证书查看技巧查看 PEM 编码证书将cert.xxx替换为实际证书文件名$ openssl x509 -in cert.pem -text -noout $ openssl x509 -in cert.cer -text -noout $ openssl x509 -in cert.crt -text -noout若收到如下错误说明当前文件实为 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若反过来报错则说明文件实为 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:TypeX509查看证书链中的所有证书仅打印 subject 与 issuer$ openssl crl2pkcs7 -nocrl -certfile host.domain.tld-ca-chain.pem | openssl pkcs7 -print_certs -noout打印完整公钥信息$ openssl crl2pkcs7 -nocrl -certfile host.domain.tld-ca-chain.pem | openssl pkcs7 -print_certs -text -noout十、证书格式转换全集通用转换示例DER 文件.crt/.cer/.der转 PEM$ openssl x509 -inform der -in certificate.cer -out certificate.pemPEM 转 DER$ openssl x509 -outform der -in certificate.pem -out certificate.derPKCS#12.pfx/.p12含私钥与证书转 PEM$ openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes # 可加 -nocerts 仅输出私钥或加 -nokeys 仅输出证书PEM 证书与私钥转 PKCS#12$ openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crtPEM 转 CRT$ openssl x509 -outform der -in certificate.pem -out certificate.crt按目标格式速查PEM → DERopenssl x509 -outform der -in certificate.pem -out certificate.derPEM → P7Bopenssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CACert.cerPEM → PFXopenssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crtDER → PEMopenssl x509 -inform der -in certificate.cer -out certificate.pemPFX → PEMopenssl pkcs12 -in certificate.pfx -out certificate.cer -nodesP7B → PEMopenssl pkcs7 -print_certs -in certificate.p7b -out certificate.cerP7B → PFX先用openssl pkcs7 -print_certs导出 cer再openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CACert.cer通过 OpenSSL 生成 RSA 密钥完整流程首先生成受口令保护的公私钥文件建议用-passout指定口令来源其取值形式参见 OpenSSL 文档的 PASS PHRASE ARGUMENTS 部分$ openssl genrsa -out private.pem 4096该private.pem实际同时包含私钥与公钥因此需要从中提取公钥$ openssl rsa -in private.pem -out public.pem -outform PEM -pubout # 或 $ openssl rsa -in private.pem -pubout public.pem # 或 $ openssl rsa -in private.pem -pubout -out public.pempublic.pem仅含公钥可放心与第三方共享。自测加解密流程$ echo too many secrets file.txt $ openssl rsautl -encrypt -inkey public.pem -pubin -in file.txt -out file.ssl $ openssl rsautl -decrypt -inkey private.pem -in file.ssl -out decrypted.txt $ cat decrypted.txt |output - too many secrets十一、rsa 命令完整选项参考NAME / SYNOPSISrsa - RSA key processing tool$ 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]DESCRIPTIONrsa命令处理 RSA 密钥可在多种格式间转换并可打印其组成部分。注意该命令使用传统的 SSLeay 兼容格式进行私钥加密较新的应用程序应使用pkcs8实用程序以更安全的 PKCS#8 格式处理。COMMAND OPTIONS 选项速查选项说明-help打印使用信息-inform DER\|NET\|PEM指定输入格式。DER 为与 PKCS#1 RSAPrivateKey 或 SubjectPublicKeyInfo 兼容的 ASN1 DER 编码PEM 为默认格式DER 的 Base64 编码加头尾行也接受 PKCS#8 私钥NET 为历史格式-outform DER\|NET\|PEM指定输出格式含义同-inform-in filename输入文件名缺省读标准输入密钥已加密时会提示输入口令-passin arg输入文件口令来源参见 PASS PHRASE ARGUMENTS-out filename输出文件名缺省写标准输出设置了加密选项会提示输入口令输出文件不应与输入文件同名-passout password输出文件口令来源-aes128/-aes192/-aes256/-camellia128/-camellia192/-camellia256/-des/-des3/-idea输出前用指定密码加密私钥并提示输入口令不指定则明文输出。仅对 PEM 输出有效。用它读取加密密钥可删除口令配合加密选项可新增或更换口令-text除编码版本外以纯文本打印公钥/私钥各组成部分-noout禁止输出密钥的编码版本-modulus打印密钥模数的值-check检查 RSA 私钥的一致性-pubin默认读私钥使用此选项改为读取公钥-pubout默认输出私钥使用此选项输出公钥输入为公钥时自动设置-RSAPublicKey_in, -RSAPublicKey_out类似-pubin/-pubout但使用 RSAPublicKey 格式-engine id指定引擎 ID使 rsa 获取该引擎的功能引用并将其设为所有可用算法的默认值支持的内置加密算法-aes128、-aes192、-aes256、-des3、-des。典型示例删除 RSA 私钥上的口令短语$ openssl rsa -in key.pem -out keyout.pem使用三重 DES 加密私钥$ openssl rsa -in key.pem -des3 -out keyout.pem私钥从 PEM 转 DER$ openssl rsa -in key.pem -outform DER -out keyout.der将私钥组件打印到标准输出$ 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十二、PEM 格式识别要让 OpenSSL 识别为 PEM 格式文件必须是 Base64 编码并带固定头尾行例如-----BEGIN CERTIFICATE----- and footer : -----END CERTIFICATE-----此外每行长度不得超过 79 个字符否则报错2675996:error:0906D064:PEM routines:PEM_read_bio:bad base64 decode:pem_lib.c:818:PEM 标准RFC1421要求行长为 64 字符可用 UNIX 命令将单行 PEM 证书折叠为合规格式$ fold -w 64常见 PEM 头一览PKCS#1 RSAPublicKeyBEGIN RSA PUBLIC KEYPKCS#8 EncryptedPrivateKeyInfoBEGIN ENCRYPTED PRIVATE KEYPKCS#8 PrivateKeyInfoBEGIN PRIVATE KEYX.509 SubjectPublicKeyInfoBEGIN PUBLIC KEYCSRBEGIN NEW CERTIFICATE REQUESTDSA PrivateKeyInfoBEGIN DSA PRIVATE KEYCRLBEGIN X509 CRL证书CRTBEGIN CERTIFICATECSRBEGIN CERTIFICATE REQUESTPKCS7BEGIN PKCS7EC 私钥BEGIN EC PRIVATE KEYPGP 私钥BEGIN PGP PRIVATE KEY BLOCKPGP 公钥BEGIN PGP PUBLIC KEY BLOCK加密的 PEM 私钥还会出现Proc-Type: 4,ENCRYPTED头-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED -----END RSA PRIVATE KEY-----十三、证书校验实战证书验证的背景客户端在建立 SSL/TLS 连接前需要确认收到的证书有效验证点包括签名验证确保证书未被篡改证书尚未过期CA 颁发时指定到期日期证书主题与主机名匹配证书主题需与客户端连接的目标 URL 匹配未被撤销私钥泄露等原因下证书可能被颁发者提前撤销由受信任的 CA 签名PKI 中存在信任链CA 证书可能由更上层的 CA 签发需逐级追溯到根 CA信任根 CA 即信任整条链。验证信任链a) 完整 CA 链在同一文件、服务器/客户端证书在另一文件$ openssl verify -untrusted ca-chain.pem 客户端证书.pemb) 根证书与中间证书分离、服务器/客户端证书单独存放$ 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传入或用进程替换$ openssl verify -CAfile root.pem -untrusted (cat intermediate1.pem intermediate2.pem) client-cert.pem实际示例Lets Encrypt 证书链$ 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按过期顺序列出本地全部证书最近过期的排最前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检查远程服务器假设使用 DNS 轮询需 GNU dateMac 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 https://www.google.com 21 | awk BEGIN { cert0 } /^\* Server certificate:/ { cert1 } /^\*/ { if (cert) print }输出示例* Server certificate: * subject: CUS; STCalifornia; LMountain View; OGoogle LLC; CNwww.google.com * start date: Mar 1 09:46:35 2019 GMT * expire date: May 24 09:25:00 2019 GMT * issuer: CUS; OGoogle Trust Services; CNGoogle 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: len0 * 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 证书由于cacert选项只能使用一个文件需将完整链信息合并到 1 个文件中$ curl --cacert certRepo -u user:passwd -X GET -H Content-Type: application/json https//somesecureserver.com/rest/field使用 openssl s_client 验证使用 SNI同一 IP 共享多个 SSL 主机时需用-servername发送正确主机名$ openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 /dev/null不使用 SNI 时跳过-servername$ openssl s_client -showcerts -connect www.example.com:443 /dev/null查看站点证书的完整详细信息$ 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 保护的资源携带客户端证书与私钥$ 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 证书通过比较证书与私钥的 MD5 哈希判断是否匹配$ openssl x509 -noout -modulus -in example.com.crt | openssl md5 $ openssl rsa -noout -modulus -in example.com.key | openssl md5脚本化版本#!/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 密钥库JKS操作$ 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 # 清理 $ rm -vrf $HOME/Library/Application Support/mkcert _wildcard.example*结语从版本诊断、密钥生成、格式转换到 TLS 连接诊断与信任链验证OpenSSL 命令行覆盖了 PKI 生命周期中的每一个环节。本文以 OpenSSL 备忘清单 为主体并交叉引用了仓库中 README 的条目归属、Netcat 速查表 的管道加密传输示例以及 curl 备忘清单 的证书链验证约定。建议将本指南与上述仓库文档配合使用先在本机跑通生成密钥 → 签发自签名证书 → 搭建 s_server → s_client 验证的最小闭环再逐步扩展到 CA 签发、格式互转与生产级信任链校验。赞分享文档知识库教程开发工具【免费下载链接】reference为开发人员分享快速参考备忘清单(速查表)项目地址https://gitcode.com/jaywcjlove/reference点击查看免费下载相关推荐OpenSSL 命令行实战速查从密钥生成、证书管理到 TLS 排查Quick Reference 开源速查清单OpenSSL 命令行实战速查从密钥生成、证书管理到 TLS 排查Quick Reference 开源速查清单 本篇技术指南以开源速查清单仓库中的 Ope文档教程使用OpenSSL生成SAML密钥证书对的技术指南使用OpenSSL生成SAML密钥证书对的技术指南 前言 在现代身份验证和授权系统中SAML安全断言标记语言扮演着重要角色。作为技术人员我们经常需要为S文档教程知识库Envoy 密钥发现服务SDS完整指南从静态密钥到按需证书的 TLS 密钥管理实战Envoy 密钥发现服务SDS完整指南从静态密钥到按需证书的 TLS 密钥管理实战 导读 本文档围绕 Envoy 的 Secret Discovery S云原生服务网格网络微服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考