OpenSSL

密码学和 SSL/TLS 工具包

openssl-s_client

名称

openssl-s_client - SSL/TLS 客户端程序

概要

openssl s_client [-help] [-ssl_config section] [-connect host:port] [-host hostname] [-port port] [-bind host:port] [-proxy host:port] [-proxy_user userid] [-proxy_pass arg] [-unix path] [-4] [-6] [-quic] [-servername name] [-noservername] [-verify depth] [-verify_return_error] [-verify_quiet] [-verifyCAfile filename] [-verifyCApath dir] [-verifyCAstore uri] [-cert filename] [-certform DER|PEM|P12] [-cert_chain filename] [-build_chain] [-CRL filename] [-CRLform DER|PEM] [-crl_download] [-key filename|uri] [-keyform DER|PEM|P12|ENGINE] [-pass arg] [-chainCAfile filename] [-chainCApath directory] [-chainCAstore uri] [-requestCAfile filename] [-dane_tlsa_domain domain] [-dane_tlsa_rrdata rrdata] [-dane_ee_no_namechecks] [-reconnect] [-showcerts] [-prexit] [-no-interactive] [-debug] [-trace] [-nocommands] [-adv] [-security_debug] [-security_debug_verbose] [-msg] [-timeout] [-mtu size] [-no_etm] [-no_ems] [-keymatexport label] [-keymatexportlen len] [-msgfile filename] [-nbio_test] [-state] [-nbio] [-crlf] [-ign_eof] [-no_ign_eof] [-psk_identity identity] [-psk key] [-psk_session file] [-quiet] [-sctp] [-sctp_label_bug] [-fallback_scsv] [-async] [-maxfraglen len] [-max_send_frag] [-split_send_frag] [-max_pipelines] [-read_buf] [-ignore_unexpected_eof] [-bugs] [-no_tx_cert_comp] [-no_rx_cert_comp] [-comp] [-no_comp] [-brief] [-legacy_server_connect] [-no_legacy_server_connect] [-allow_no_dhe_kex] [-prefer_no_dhe_kex] [-sigalgs sigalglist] [-curves curvelist] [-cipher cipherlist] [-ciphersuites val] [-serverpref] [-starttls protocol] [-name hostname] [-xmpphost hostname] [-name hostname] [-tlsextdebug] [-no_ticket] [-sess_out filename] [-serverinfo types] [-sess_in filename] [-serverinfo types] [-status] [-alpn protocols] [-nextprotoneg protocols] [-ct] [-noct] [-ctlogfile] [-keylogfile file] [-early_data file] [-enable_pha] [-use_srtp value] [-srpuser value] [-srppass value] [-srp_lateuser] [-srp_moregroups] [-srp_strength number] [-ktls] [-tfo] [-nameopt option] [-no_ssl3] [-no_tls1] [-no_tls1_1] [-no_tls1_2] [-no_tls1_3] [-ssl3] [-tls1] [-tls1_1] [-tls1_2] [-tls1_3] [-dtls] [-dtls1] [-dtls1_2] [-xkey infile] [-xcert file] [-xchain file] [-xchain_build file] [-xcertform DER|PEM]> [-xkeyform DER|PEM]> [-CAfile file] [-no-CAfile] [-CApath dir] [-no-CApath] [-CAstore uri] [-no-CAstore] [-bugs] [-no_comp] [-comp] [-no_ticket] [-serverpref] [-client_renegotiation] [-legacy_renegotiation] [-no_renegotiation] [-no_resumption_on_reneg] [-legacy_server_connect] [-no_legacy_server_connect] [-no_etm] [-allow_no_dhe_kex] [-prefer_no_dhe_kex] [-prioritize_chacha] [-strict] [-sigalgs algs] [-client_sigalgs algs] [-groups groups] [-curves curves] [-named_curve curve] [-cipher ciphers] [-ciphersuites 1.3ciphers] [-min_protocol minprot] [-max_protocol maxprot] [-record_padding padding] [-debug_broken_protocol] [-no_middlebox] [-rand files] [-writerand file] [-provider name] [-provider-path path] [-propquery propq] [-engine id] [-ssl_client_engine id] [-allow_proxy_certs] [-attime timestamp] [-no_check_time] [-check_ss_sig] [-crl_check] [-crl_check_all] [-explicit_policy] [-extended_crl] [-ignore_critical] [-inhibit_any] [-inhibit_map] [-partial_chain] [-policy arg] [-policy_check] [-policy_print] [-purpose purpose] [-suiteB_128] [-suiteB_128_only] [-suiteB_192] [-trusted_first] [-no_alt_chains] [-use_deltas] [-auth_level num] [-verify_depth num] [-verify_email email] [-verify_hostname hostname] [-verify_ip ip] [-verify_name name] [-x509_strict] [-issuer_checks] [-enable_server_rpk] [-enable_client_rpk] [host:port]

描述

此命令实现了一个通用的 SSL/TLS 客户端,它使用 SSL/TLS 连接到远程主机。它是一个非常有用的 SSL 服务器诊断工具。

选项

除了以下选项外,此命令还支持在 SSL_CONF_cmd(3) 手册页的“支持的命令行命令”部分中记录的常见选项和客户端专用选项。

-help

打印出用法消息。

-ssl_config section

使用配置文件中指定的节来配置 SSL_CTX 对象。

-connect host:port

这指定了要连接的主机和可选端口。可以使用可选的目标位置参数来选择主机和端口。如果既没有这个参数,也没有目标位置参数,则尝试连接到端口 4433 上的本地主机。

-host hostname

要连接的主机;使用 -connect 代替。

-port port

连接到指定的端口;使用 -connect 代替。

-bind host:port

这指定了作为连接源的绑定主机地址或端口。对于 Unix 域套接字,端口被忽略,主机用作源套接字地址。

-proxy host:port

-connect 标志一起使用时,程序使用此标志指定的 host 和 port,并发出 HTTP CONNECT 命令以连接到所需服务器。

-proxy_user userid

-proxy 标志一起使用时,程序将尝试使用基本(base64)身份验证对指定的代理进行身份验证。注意:基本身份验证是不安全的;凭据在建立任何 TLS/SSL 会话之前被发送到代理,并且采用易于反转的 base64 编码。因此,这些凭据可以被任何能够嗅探/跟踪网络的人轻松恢复。请谨慎使用。

-proxy_pass arg

代理密码来源,与 -proxy_user 标志一起使用。有关 arg 格式的更多信息,请参见 openssl-passphrase-options(1)

-unix path

通过指定的 Unix 域套接字连接。

-4

仅使用 IPv4。

-6

仅使用 IPv6。

-quic

使用 QUIC 协议连接。如果指定,则还必须提供 -alpn 选项。

-servername name

将 ClientHello 消息中的 TLS SNI(服务器名称指示)扩展设置为给定值。如果未提供 -servername,则 TLS SNI 扩展将使用提供给 -connect 的名称填充,如果该名称遵循 DNS 名称格式。如果既没有提供 -connect,也没有提供 SNI,则将其设置为“localhost”。这是 OpenSSL 1.1.1 后的默认设置。

即使 SNI 通常应该是一个 DNS 名称而不是一个 IP 地址,如果提供了 -servername,则无论它是否是 DNS 名称,都会发送该名称。

此选项不能与 -noservername 结合使用。

-noservername

禁止在 ClientHello 消息中发送 SNI(服务器名称指示)扩展。不能与 -servername-dane_tlsa_domain 选项结合使用。

-cert filename

要使用的客户端证书,如果服务器请求的话。默认情况下不使用证书。

可以使用 -cert_chain 指定客户端证书的链。

-certform DER|PEM|P12

要使用的客户端证书文件格式;默认情况下未指定。有关详细信息,请参见 openssl-format-options(1)

-cert_chain

在尝试构建与通过 -cert 选项指定的证书相关的证书链时要使用的未经信任的证书的文件或 URI。输入可以是 PEM、DER 或 PKCS#12 格式。

-build_chain

指定应用程序是否应该构建要提供给服务器的客户端证书链。

-CRL filename

用于检查服务器证书的 CRL 文件。

-CRLform DER|PEM

CRL 文件格式;默认情况下未指定。有关详细信息,请参见 openssl-format-options(1)

-crl_download

从证书中的分发点下载 CRL。

-key filename|uri

要使用的客户端私钥。如果未指定,则证书文件也将用于读取密钥。

-keyform DER|PEM|P12|ENGINE

密钥格式;默认情况下未指定。有关详细信息,请参见 openssl-format-options(1)

-pass arg

私钥和证书文件密码源。有关 arg 格式的更多信息,请参见 openssl-passphrase-options(1)

-verify depth

要使用的验证深度。这指定了服务器证书链的最大长度,并开启服务器证书验证。目前,验证操作在发生错误后继续进行,因此可以查看证书链的所有问题。作为副作用,连接永远不会因服务器证书验证失败而失败。

-verify_return_error

返回验证错误而不是继续。这通常会以致命错误中止握手。

-verify_quiet

将验证输出限制为仅错误。

-verifyCAfile filename

一个 PEM 格式的文件,其中包含用于验证服务器证书的可信证书。

-verifyCApath dir

包含用于验证服务器证书的可信证书的目录。此目录必须采用“哈希格式”,有关更多信息,请参见 openssl-verify(1)

-verifyCAstore uri

存储的 URI,其中包含用于验证服务器证书的可信证书。

-chainCAfile file

一个 PEM 格式的文件,其中包含用于尝试构建客户端证书链的可信证书。

-chainCApath directory

包含用于构建提供给服务器的客户端证书链的可信证书的目录。此目录必须采用“哈希格式”,有关更多信息,请参见 openssl-verify(1)

-chainCAstore uri

存储的 URI,其中包含用于尝试构建客户端证书链的可信证书。URI 可以指示单个证书,也可以指示一组证书。对于 file: 方案中的 URI,它会根据 URI 是否指示目录或单个文件,分别充当 -chainCAfile-chainCApath。有关 file: 方案的更多信息,请参见 ossl_store-file(7)

-requestCAfile file

包含证书列表的文件,这些证书的主题名称将被发送到服务器的 certificate_authorities 扩展中。仅支持 TLS 1.3

-dane_tlsa_domain domain

启用 RFC6698/RFC7671 DANE TLSA 身份验证并指定 TLSA 基本域,该域将成为默认的 SNI 提示,并作为主机名检查的主要参考标识符。这必须与至少一个 -dane_tlsa_rrdata 选项一起使用,如下所示。

当 DANE 身份验证成功时,诊断输出将包括 TLSA 记录对链证书进行身份验证的最低(最接近 0)深度。当该 TLSA 记录是一个“2 1 0”信任锚点公钥,该公钥已对链的顶层证书进行签名(而不是匹配)时,结果将报告为“TA 公钥已验证”。否则,要么 TLSA 记录在正深度“匹配 TA 证书”,要么在深度 0“匹配 EE 证书”。

-dane_tlsa_rrdata rrdata

使用一次或多次来指定与目标服务关联的 DANE TLSA RRset 的 RRDATA 字段。rrdata 值以“表示形式”指定,即四个空格分隔的字段,它们指定了用法、选择器、匹配类型和关联数据,最后这些数据以十六进制编码。关联数据字段中的可选空格将被忽略。例如

$ openssl s_client -brief -starttls smtp \
  -connect smtp.example.com:25 \
  -dane_tlsa_domain smtp.example.com \
  -dane_tlsa_rrdata "2 1 1
    B111DD8A1C2091A89BD4FD60C57F0716CCE50FEEFF8137CDBEE0326E 02CF362B" \
  -dane_tlsa_rrdata "2 1 1
    60B87575447DCBA2A36B7D11AC09FB24A9DB406FEE12D2CC90180517 616E8A18"
...
Verification: OK
Verified peername: smtp.example.com
DANE TLSA 2 1 1 ...ee12d2cc90180517616e8a18 matched TA certificate at depth 1
...
-dane_ee_no_namechecks

此选项在通过 DANE-EE(3) TLSA 记录进行身份验证时禁用服务器名称检查。对于某些应用程序,主要是 Web 浏览器,禁用名称检查是不安全的,因为会受到“未知密钥共享”攻击,在这种攻击中,恶意服务器可以使客户端相信与受害者服务器的连接实际上是与恶意服务器的安全连接。然后,恶意服务器可能能够破坏跨域脚本限制。因此,尽管 RFC7671 文本中提到了这一点,但对于 DANE-EE(3) TLSA 记录,名称检查默认情况下是启用的,并且可以在应用程序中禁用,以确保安全。特别是,SMTP 和 XMPP 客户端应设置此选项,因为 SRV 和 MX 记录已经使远程域能够将客户端连接重定向到其选择的任何服务器,而且在任何情况下,SMTP 和 XMPP 客户端都不会执行从远程服务器下载的脚本。

-reconnect

使用相同的会话 ID,重新连接到同一服务器 5 次,这可以作为测试会话缓存是否正常工作的测试。

-showcerts

显示服务器发送的服务器证书列表:它仅包含服务器发送的证书(按服务器发送的顺序)。它不是经过验证的链。

-prexit

在程序退出时打印会话信息。即使连接失败,这也将始终尝试打印出信息。通常,只有在连接成功时才会打印一次信息。此选项很有用,因为所使用的密码可能会重新协商,或者连接可能会失败,因为在尝试访问特定 URL 后才需要或请求客户端证书。注意:此选项产生的输出并不总是准确的,因为连接可能从未建立过。

-no-interactive

此标志可用于在非交互模式下运行客户端。

-state

打印出 SSL 会话状态。

-debug

打印详细的调试信息,包括所有流量的十六进制转储。

-nocommands

不使用交互式命令字母。

-adv

使用高级命令模式。

-security_debug

启用安全调试消息。

-security_debug_verbose

输出更多安全调试输出。

-msg

显示协议消息。

-timeout

在 DTLS 连接上启用发送/接收超时。

-mtu size

将链路层的 MTU 设置为指定的大小。

-no_etm

禁用加密后 MAC 协商。

-no_ems

禁用扩展主密钥协商。

-keymatexport label

使用指定标签导出密钥材料。

-keymatexportlen len

导出指定数量的密钥材料字节;默认为 20。

显示所有带有十六进制转储的协议消息。

-trace

显示协议消息的详细跟踪输出。

-msgfile filename

-msg-trace 的输出发送到的文件,默认为标准输出。

-nbio_test

测试非阻塞 I/O

-nbio

打开非阻塞 I/O

-crlf

此选项将来自终端的换行符转换为 CR+LF,这是某些服务器所需的。

-ign_eof

在输入中遇到文件结尾时,禁止关闭连接。

-quiet

禁止打印会话和证书信息。这也隐式地打开了-ign_eof

-no_ign_eof

在输入中遇到文件结尾时关闭连接。可用于在-quiet 之后覆盖隐式-ign_eof

-psk_identity identity

在使用 PSK 密码套件时,使用 PSK 标识identity。默认值为“Client_identity”(不带引号)。

-psk key

在使用 PSK 密码套件时,使用 PSK 密钥key。密钥以十六进制数字给出,不带前导 0x,例如 -psk 1a2b3c4d。为了使用 PSK 密码,必须提供此选项。

-psk_session file

使用存储在file 中的 pem 编码的 SSL_SESSION 数据作为 PSK 的基础。请注意,这仅在协商 TLSv1.3 时才有效。

-sctp

在 DTLS 中使用 SCTP 作为传输协议,而不是 UDP。必须与-dtls-dtls1-dtls1_2 结合使用。此选项仅在 OpenSSL 支持 SCTP 时可用。

-sctp_label_bug

在为 DTLS/SCTP 计算端点对共享密钥时,使用旧版 OpenSSL 实现的错误行为。这允许与旧的错误实现进行通信,但破坏了与正确实现的互操作性。必须与-sctp 结合使用。此选项仅在 OpenSSL 支持 SCTP 时可用。

-fallback_scsv

在 ClientHello 中发送 TLS_FALLBACK_SCSV。

-async

打开异步模式。加密操作将异步执行。这只有在通过-engine 选项也使用异步支持的引擎时才会生效。出于测试目的,可以使用虚拟异步引擎(dasync)(如果可用)。

-maxfraglen len

启用最大片段长度协商;允许的值为512102420484096

-max_send_frag int

要发送的数据片段的最大大小。有关更多信息,请参阅SSL_CTX_set_max_send_fragment(3)

-split_send_frag int

用于拆分加密管道数据的尺寸。如果一次写入的数据量大于此值,则它将被拆分为多个管道,最多可达 max_pipelines 定义的最大管道数。这只有在协商了合适的密码套件、加载了支持管道的引擎且 max_pipelines 大于 1 时才有效。有关更多信息,请参阅SSL_CTX_set_split_send_fragment(3)

-max_pipelines int

要使用的加密/解密管道的最大数量。这只有在加载了支持管道的引擎(例如 dasync 引擎)且协商了合适的密码套件时才有效。默认值为 1。有关更多信息,请参阅SSL_CTX_set_max_pipelines(3)

-read_buf int

用于连接的默认读取缓冲区大小。这只有在缓冲区大小大于否则将使用的尺寸且使用管道时才会生效(有关更多信息,请参阅SSL_CTX_set_default_read_buffer_len(3))。

-ignore_unexpected_eof

某些 TLS 实现不会在关闭时发送强制性的 close_notify 警告。如果应用程序试图等待 close_notify 警告,但对等方在没有发送警告的情况下关闭了连接,则会生成错误。启用此选项后,对等方无需发送 close_notify 警告,并且关闭的连接将被视为收到了 close_notify 警告。有关关闭连接的更多信息,请参阅SSL_shutdown(3)

-bugs

SSL 和 TLS 实现中存在一些已知错误。添加此选项将启用各种解决方法。

-no_tx_cert_comp

禁用对发送 TLSv1.3 压缩证书的支持。

-no_rx_cert_comp

禁用对接收 TLSv1.3 压缩证书的支持。

-comp

启用对 SSL/TLS 压缩的支持。此选项是在 OpenSSL 1.1.0 中引入的。从 OpenSSL 1.1.0 开始,TLS 压缩不推荐使用,并且默认情况下处于关闭状态。TLS 压缩只能在安全级别 1 或更低级别使用。从 OpenSSL 3.2.0 及更高版本开始,默认安全级别为 2,因此此选项在不更改安全级别的情况下不会生效。使用-cipher 选项更改安全级别。有关更多信息,请参阅openssl-ciphers(1)

-no_comp

禁用对 SSL/TLS 压缩的支持。从 OpenSSL 1.1.0 开始,TLS 压缩不推荐使用,并且默认情况下处于关闭状态。

-brief

仅提供连接参数的简要摘要,而不是正常的详细输出。

-sigalgs sigalglist

指定客户端发送的签名算法列表。服务器根据其首选项从列表中选择一个条目。例如字符串,请参阅SSL_CTX_set1_sigalgs(3)

-curves curvelist

指定客户端发送的受支持曲线列表。曲线最终由服务器选择。要查看所有曲线的列表,请使用

$ openssl ecparam -list_curves
-cipher cipherlist

这允许修改客户端发送的 TLSv1.2 及以下密码列表。此列表将与已配置的任何 TLSv1.3 密码套件相结合。尽管服务器决定使用哪个密码套件,但它应该采用客户端发送的列表中的第一个支持的密码。有关更多信息,请参阅openssl-ciphers(1)

-ciphersuites val

这允许修改客户端发送的 TLSv1.3 密码套件列表。此列表将与已配置的任何 TLSv1.2 及以下密码套件相结合。尽管服务器决定使用哪个密码套件,但它应该采用客户端发送的列表中的第一个支持的密码。有关更多信息,请参阅openssl-ciphers(1)。此列表的格式是简单的冒号 (:) 分隔的 TLSv1.3 密码套件名称列表。

-starttls protocol

发送特定于协议的消息以切换到 TLS 以进行通信。protocol 是目标协议的关键字。目前,唯一支持的关键字是“smtp”、“pop3”、“imap”、“ftp”、“xmpp”、“xmpp-server”、“irc”、“postgres”、“mysql”、“lmtp”、“nntp”、“sieve”和“ldap”。

-xmpphost hostname

此选项在与“-starttls xmpp”或“-starttls xmpp-server”一起使用时,指定流元素的“to”属性的主机。如果未指定此选项,则将使用“-connect”指定的host。

此选项是“xmpp”和“xmpp-server”的-name 选项的别名。

-name hostname

此选项用于为与-starttls 选项一起使用的各种协议指定主机名信息。目前,只有“xmpp”、“xmpp-server”、“smtp”和“lmtp”可以使用此-name 选项。

如果此选项与“-starttls xmpp”或“-starttls xmpp-server”一起使用,则指定流元素的“to”属性的主机。如果未指定此选项,则将使用“-connect”指定的host。

如果此选项与“-starttls lmtp”或“-starttls smtp”一起使用,则分别指定“LMTP LHLO”或“SMTP EHLO”消息中要使用的名称。如果未指定此选项,则将使用“mail.example.com”。

-tlsextdebug

打印出从服务器接收到的任何 TLS 扩展的十六进制转储。

-no_ticket

禁用 RFC4507bis 会话票证支持。

-sess_out filename

将 SSL 会话输出到filename

-sess_in filename

filename 加载 SSL 会话。客户端将尝试从该会话恢复连接。

-serverinfo types

逗号分隔的 TLS 扩展类型的列表(0 到 65535 之间的数字)。每个类型都将作为空的 ClientHello TLS 扩展发送。服务器的响应(如果有)将被编码并显示为 PEM 文件。

-status

向服务器发送证书状态请求(OCSP 钉扎)。服务器的响应(如果有)将被打印出来。

-alpn protocols, -nextprotoneg protocols

这些标志分别启用应用程序层协议协商或下一协议协商 (NPN) 扩展。ALPN 是 IETF 标准,它取代了 NPN。protocols 列表是客户端应该宣传支持的协议名称的逗号分隔列表。列表应该首先包含最理想的协议。协议名称是可打印的 ASCII 字符串,例如“http/1.1”或“spdy/3”。空协议列表将被特殊对待,并且会导致客户端宣传对 TLS 扩展的支持,但在接收包含服务器支持的协议列表的 ServerHello 后立即断开连接。如果使用了-tls1_3,则不能指定标志-nextprotoneg

-ct, -noct

使用以下两个选项之一来控制是否启用证书透明度 (CT) (-ct) 或禁用 (-noct)。如果启用 CT,则会从服务器请求签名的证书时间戳 (SCT),并在握手完成时报告。

启用 CT 也会启用 OCSP 装订,因为这是一种可能的 SCT 传递方式。

-ctlogfile

包含已知证书透明度日志列表的文件。有关预期的文件格式,请参阅 SSL_CTX_set_ctlog_list_file(3)

-keylogfile file

将 TLS 密钥追加到指定的关键日志文件中,以便外部程序(如 Wireshark)可以解密 TLS 连接。

-early_data file

读取指定文件的内容,并尝试将其作为早期数据发送到服务器。这仅在支持早期数据的恢复会话中,并且当服务器接受早期数据时才有效。

-enable_pha

仅针对 TLSv1.3,发送后握手身份验证扩展。无论是否通过 -cert 提供证书,这都会发生。

-use_srtp value

提供 SRTP 密钥管理,其中 value 是一个冒号分隔的配置文件列表。

-srpuser value

将 SRP 用户名设置为指定的值。此选项已弃用。

-srppass value

将 SRP 密码设置为指定的值。此选项已弃用。

-srp_lateuser

第二个 ClientHello 消息的 SRP 用户名。此选项已弃用。

-srp_moregroups 此选项已弃用。

容忍除已知的 gN 值之外的值。

-srp_strength number

设置 N 的最小可接受长度(以位为单位)。此选项已弃用。

-ktls

启用内核 TLS 用于发送和接收。此选项是在 OpenSSL 3.2.0 中引入的。在 OpenSSL 3.2.0 中,内核 TLS 默认情况下处于关闭状态。

-tfo

启用通过 TCP 快速打开(RFC7413)创建连接。

-no_ssl3, -no_tls1, -no_tls1_1, -no_tls1_2, -no_tls1_3, -ssl3, -tls1, -tls1_1, -tls1_2, -tls1_3

请参阅 openssl(1) 中的“TLS 版本选项”

-dtls, -dtls1, -dtls1_2

这些指定使用 DTLS 而不是 TLS。请参阅 openssl(1) 中的“TLS 版本选项”

-nameopt option

这指定了主题或颁发者名称的显示方式。有关详细信息,请参阅 openssl-namedisplay-options(1)

-xkey infile, -xcert file, -xchain file, -xchain_build file, -xcertform DER|PEM, -xkeyform DER|PEM

设置扩展证书验证选项。有关详细信息,请参阅 openssl-verification-options(1) 中的“扩展验证选项”

-CAfile file, -no-CAfile, -CApath dir, -no-CApath, -CAstore uri, -no-CAstore

有关详细信息,请参阅 openssl-verification-options(1) 中的“受信任证书选项”

-bugs, -comp, -no_comp, -no_ticket, -serverpref, -client_renegotiation, -legacy_renegotiation, -no_renegotiation, -no_resumption_on_reneg, -legacy_server_connect, -no_legacy_server_connect, -no_etm -allow_no_dhe_kex, -prefer_no_dhe_kex, -prioritize_chacha, -strict, -sigalgs algs, -client_sigalgs algs, -groups groups, -curves curves, -named_curve curve, -cipher ciphers, -ciphersuites 1.3ciphers, -min_protocol minprot, -max_protocol maxprot, -record_padding padding, -debug_broken_protocol, -no_middlebox

有关详细信息,请参阅 SSL_CONF_cmd(3) 中的“支持的命令行命令”

-rand files, -writerand file

有关详细信息,请参阅 openssl(1) 中的“随机状态选项”

-provider name
-provider-path path
-propquery propq

请参阅 openssl(1) 中的“提供程序选项”provider(7)property(7)

-engine id

请参阅 openssl(1) 中的“引擎选项”。此选项已弃用。

-ssl_client_engine id

指定用于客户端证书操作的引擎。

-allow_proxy_certs, -attime, -no_check_time, -check_ss_sig, -crl_check, -crl_check_all, -explicit_policy, -extended_crl, -ignore_critical, -inhibit_any, -inhibit_map, -no_alt_chains, -partial_chain, -policy, -policy_check, -policy_print, -purpose, -suiteB_128, -suiteB_128_only, -suiteB_192, -trusted_first, -use_deltas, -auth_level, -verify_depth, -verify_email, -verify_hostname, -verify_ip, -verify_name, -x509_strict -issuer_checks

设置证书链验证的各种选项。有关详细信息,请参阅 openssl-verification-options(1) 中的“验证选项”

为了调试,将显示验证错误,但除非使用 -verify_return_error 选项,否则命令将继续执行。

-enable_server_rpk

启用支持从服务器接收原始公钥(RFC7250)。服务器使用 X.509 证书成为可选的,支持原始公钥的服务器可以选择使用它们。不支持原始公钥或更愿意使用 X.509 证书的服务器仍然可以选择像往常一样发送 X.509 证书。

-enable_client_rpk

启用支持将原始公钥(RFC7250)发送到服务器。如果服务器请求,则客户端将发送原始公钥,前提是配置了合适的密钥和公钥证书对。一些服务器可能仍然不请求任何客户端凭据,或者可能请求证书。

host:port

除了提供 -connect 之外,目标主机名和可选端口可以作为所有选项之后的单个位置参数提供。如果既没有提供此选项,也没有提供 -connect,则将回退到尝试连接到端口 4433 上的 localhost

连接的命令 (基本)

如果与 SSL/TLS 服务器建立连接,则会显示从服务器接收的任何数据,并且任何按键都会发送到服务器。如果到达文件末尾,则连接将关闭。

当以交互方式使用(这意味着没有给出 -quiet-ign_eof),并且没有给出 -adv-nocommands 时,将进入“基本”命令模式。在此模式下,会识别执行特殊操作的某些命令。这些命令是必须出现在行开头的字母。行中初始字母后的所有其他数据都将被忽略。这些命令列在下面。

Q

结束当前 SSL 连接并退出。

R

重新协商 SSL 会话(仅限 TLSv1.2 及更低版本)。

C

尝试使用恢复握手重新连接到服务器。

k

向服务器发送密钥更新消息(仅限 TLSv1.3)。

K

向服务器发送密钥更新消息并请求返回密钥更新消息(仅限 TLSv1.3)。

连接的命令 (高级)

如果已给出 -adv,则将进入“高级”命令模式。与基本模式一样,如果与 SSL/TLS 服务器建立连接,则会显示从服务器接收的任何数据,并且任何按键都会发送到服务器。如果到达文件末尾,则连接将关闭。

可以通过将特殊命令括在花括号中来提供特殊命令,例如 "{help}" 或 "{quit}"。这些命令可以出现在输入到 s_client 的文本中的任何位置,但不会发送到服务器。某些命令可以通过以“:”结束命令名称并提供参数来接受参数,例如 "{keyup:req}"。某些命令仅在协商了某些协议版本时才可用。

如果换行符出现在输入到 s_client 的行末尾,则它也会发送到服务器。如果命令单独出现在一行上,同一行上没有其他文本,则换行符将被抑制,不会发送到服务器。

识别以下命令。

help

打印有关可用命令的摘要帮助文本。

quit

关闭与对端的连接

reconnect

重新连接到对端并尝试恢复握手

keyup

发送密钥更新消息。仅限 TLSv1.3。此命令接受可选参数。如果提供了参数“req”,则也请求对端更新其密钥。否则,如果提供了“noreq”,则不会请求对端更新其密钥。默认值为“req”。

reneg

与服务器启动重新协商。(D)TLSv1.2 或更低版本。

fin

指示当前流上的 FIN。仅限 QUIC。发送 FIN 后,忽略为此流输入的任何其他文本。

说明

此命令可用于调试 SSL 服务器。要连接到 SSL HTTP 服务器,通常会使用以下命令

openssl s_client -connect servername:443

(https 使用端口 443)。如果连接成功,则可以给出 HTTP 命令,例如“GET /”来检索网页。

如果握手失败,则可能有多种原因,如果它不是明显的原因(例如没有客户端证书),则可以尝试 -bugs-ssl3-tls1-no_ssl3-no_tls1 选项,以防它是一个有错误的服务器。特别是,您应该在将错误报告提交到 OpenSSL 邮件列表之前尝试使用这些选项。

尝试使客户端证书正常工作时遇到的一个常见问题是,网页客户端抱怨它没有证书或给出一个空列表供选择。通常,这是因为服务器在请求证书时未在其“可接受 CA 列表”中发送客户端证书颁发机构。通过使用此命令,可以查看和检查 CA 列表。但是,某些服务器仅在请求特定 URL 后才会请求客户端身份验证。要在此情况下获取列表,需要使用 -prexit 选项并发送对相应页面的 HTTP 请求。

如果使用 -cert 选项在命令行上指定了证书,则除非服务器明确请求客户端证书,否则它不会被使用。因此,仅在命令行上包含客户端证书并不能保证证书有效。

如果验证服务器证书时遇到问题,则可以使用 -showcerts 选项来显示服务器发送的所有证书。

此命令是一个测试工具,旨在在任何证书验证错误后继续握手。因此,它将接受对端发送的任何证书链(受信任的或不受信任的)。非测试应用程序 不应这样做,因为这会使其容易受到中间人攻击。可以通过 -verify_return_error 选项更改此行为:任何验证错误都会被返回,从而中止握手。

如果服务器或防火墙要求连接来自某个特定地址和/或端口,则 -bind 选项可能很有用。

错误

由于此程序有很多选项,并且由于所用的一些技术比较旧,因此此命令的 C 源代码很难阅读,而且不是如何完成工作的模型。典型的 SSL 客户端程序将简单得多。

-prexit 选项是一个小技巧。我们应该在每次重新协商会话时报告信息。

另请参阅

openssl(1)openssl-sess_id(1)openssl-s_server(1)openssl-ciphers(1)SSL_CONF_cmd(3)SSL_CTX_set_max_send_fragment(3)SSL_CTX_set_split_send_fragment(3)SSL_CTX_set_max_pipelines(3)ossl_store-file(7)

历史

-no_alt_chains 选项是在 OpenSSL 1.1.0 中添加的。-name 选项是在 OpenSSL 1.1.1 中添加的。

-certform 选项在 OpenSSL 3.0.0 中已过时,不再起作用。

-engine 选项在 OpenSSL 3.0 中已弃用。

-enable_client_rpk-enable_server_rpk-no_rx_cert_comp-no_tx_cert_comp-tfo 选项在 OpenSSL 3.2 中添加。

版权所有 2000-2023 OpenSSL 项目作者。保留所有权利。

根据 Apache 许可证 2.0 版(“许可证”)许可。除符合许可证的规定外,您不得使用此文件。您可以在源代码分发中的 LICENSE 文件或 https://www.openssl.org/source/license.html 中获取许可证副本。