使用 OpenSSL 测试 SSL 连接的指南

什么是 OpenSSL?

OpenSSL 是一个开源软件加密库,应用程序广泛使用它来使用传输层安全 (TLS) 和安全套接字层 (SSL) 协议对计算机网络上的通信进行加密。 获得许可 Apache License 2.0,因此您可以将其用于商业和非商业目的。

OpenSSL 可用于大多数类 Unix 操作系统(Solaris、LinuxmacOS 和 BSD)、OpenVMS 和 Windows. 您可以使用它来生成证书签名请求 (CSR) 或私钥,以及安装和转换 SSL 证书。 它还包括带有非常有用的工具的命令行实用程序。 本文报告了如何利用 OpenSSL 来验证与服务器的安全连接。

使用 OpenSSL 测试 SSL 连接

以前的要求

  • 网络连接。
  • 终端接入。
  • OpenSSL 安装在您选择的操作系统上。
  • 服务器的域名或主机名。

如果您使用的是 Unix/,默认情况下将安装 OpenSSLLinux 操作系统平台。 但是,如果您想在 Windows 上使用 OpenSSL,您应该查看 Cygwin 或 Windows 子系统用于 Linux.

Cygwin 是 GNU 和开源工具的一个大集合,允许您拥有类似于 Linux 分布在你的 Windows 安装。 Windows 子系统用于 Linux (WSL) 是一个官方实现 Microsoft 它允许开发人员运行大部分 GNU/Linux 环境设施和应用 Windows 直接无需虚拟机或双启动。

使用 OpenSSL 测试网络连接

首先,检查您的 OpenSSL 版本。 为此,请运行以下命令。

$ openssl version

您将收到以下结果。

freddy@freddy-vm:~$ openssl version
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

如果需要更多详细信息,可以添加 -a 标志。

freddy@freddy-vm:~$ openssl version -a
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
built on: Mon Jul  4 11:20:23 2022 UTC
platform: debian-amd64
options:  bn(64,64)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -ffile-prefix-map=/build/openssl-Q8dQt3/openssl-3.0.2=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_TLS_SECURITY_LEVEL=2 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_BUILDING_OPENSSL -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-3"
MODULESDIR: "/usr/lib/x86_64-linux-gnu/ossl-modules"
Seeding source: os-specific
CPUINFO: OPENSSL_ia32cap=0xfffa32034f8bffff:0x27ab

该服务器正在运行 Ubuntu 22.04 LTS 操作系统和 OpenSSL 版本 3.0.2,但以下命令也适用于旧版本的 OpenSSL。

要查看所有可用选项,请通过运行 openssl help 命令使用帮助工具。

freddy@freddy-vm:~$ openssl help
help:

Standard commands
asn1parse         ca                ciphers           cmp               
cms               crl               crl2pkcs7         dgst              
dhparam           dsa               dsaparam          ec                
ecparam           enc               engine            errstr            
fipsinstall       gendsa            genpkey           genrsa            
help              info              kdf               list              
mac               nseq              ocsp              passwd            
pkcs12            pkcs7             pkcs8             pkey              
pkeyparam         pkeyutl           prime             rand              
rehash            req               rsa               rsautl            
s_client          s_server          s_time            sess_id           
smime             speed             spkac             srp               
storeutl          ts                verify            version           
x509              

Message Digest commands (see the `dgst' command for more details)
blake2b512        blake2s256        md4               md5               
rmd160            sha1              sha224            sha256            
sha3-224          sha3-256          sha3-384          sha3-512          
sha384            sha512            sha512-224        sha512-256        
shake128          shake256          sm3               

Cipher commands (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       
aes-256-cbc       aes-256-ecb       aria-128-cbc      aria-128-cfb      
aria-128-cfb1     aria-128-cfb8     aria-128-ctr      aria-128-ecb      
aria-128-ofb      aria-192-cbc      aria-192-cfb      aria-192-cfb1     
aria-192-cfb8     aria-192-ctr      aria-192-ecb      aria-192-ofb      
aria-256-cbc      aria-256-cfb      aria-256-cfb1     aria-256-cfb8     
aria-256-ctr      aria-256-ecb      aria-256-ofb      base64            
bf                bf-cbc            bf-cfb            bf-ecb            
bf-ofb            camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  
camellia-192-ecb  camellia-256-cbc  camellia-256-ecb  cast              
cast-cbc          cast5-cbc         cast5-cfb         cast5-ecb         
cast5-ofb         des               des-cbc           des-cfb           
des-ecb           des-ede           des-ede-cbc       des-ede-cfb       
des-ede-ofb       des-ede3          des-ede3-cbc      des-ede3-cfb      
des-ede3-ofb      des-ofb           des3              desx              
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc           
rc2-cfb           rc2-ecb           rc2-ofb           rc4               
rc4-40            seed              seed-cbc          seed-cfb          
seed-ecb          seed-ofb          sm4-cbc           sm4-cfb           
sm4-ctr           sm4-ecb           sm4-ofb 

如需其他帮助,请参阅使用以下命令之一的信息和手册页。

freddy@freddy-vm:~$ man openssl
freddy@freddy-vm:~$ info openssl

使用 OpenSSL 测试服务器连接

测试连接到端口 443

s_client 命令用于分析客户端到服务器的通信。 例如,它有助于确定端口是否打开、是否可以接受安全连接、存在哪种类型的 SSL 证书以及何时过期。

这是最基本的语法。

$ openssl s_client -connect <URL or IP>:<port>

对于 URL 或 IP 部分,请使用您的 URL 或 IP 地址。 该端口应该是您要测试的端口。 所以,对于域 example.org,命令和后续输出如下所示。

freddy@freddy-vm:~$ openssl s_client -connect example.org:443    
CONNECTED(00000003)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert TLS RSA SHA256 2020 CA1
verify return:1
depth=0 C = US, ST = California, L = Los Angeles, O = InternetC2A0CorporationC2A0forC2A0AssignedC2A0NamesC2A0andC2A0Numbers, CN = www.example.org
verify return:1
---
Certificate chain
 0 s:C = US, ST = California, L = Los Angeles, O = InternetC2A0CorporationC2A0forC2A0AssignedC2A0NamesC2A0andC2A0Numbers, CN = www.example.org
   i:C = US, O = DigiCert Inc, CN = DigiCert TLS RSA SHA256 2020 CA1
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Mar 14 00:00:00 2022 GMT; NotAfter: Mar 14 23:59:59 2023 GMT
 1 s:C = US, O = DigiCert Inc, CN = DigiCert TLS RSA SHA256 2020 CA1
   i:C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Apr 14 00:00:00 2021 GMT; NotAfter: Apr 13 23:59:59 2031 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIHRzCCBi+gAwIBAgIQD6pjEJMHvD1BSJJkDM1NmjANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSkwJwYDVQQDEyBE
aWdpQ2VydCBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTAeFw0yMjAzMTQwMDAwMDBa
Fw0yMzAzMTQyMzU5NTlaMIGWMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZv
cm5pYTEUMBIGA1UEBxMLTG9zIEFuZ2VsZXMxQjBABgNVBAoMOUludGVybmV0wqBD
b3Jwb3JhdGlvbsKgZm9ywqBBc3NpZ25lZMKgTmFtZXPCoGFuZMKgTnVtYmVyczEY
MBYGA1UEAxMPd3d3LmV4YW1wbGUub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAlV2WY5rlGn1fpwvuBhj0nVBcNxCxkHUG/pJG4HvaJen7YIZ1mLc7
/P4snOJZiEfwWFTikHNbcUCcYiKG8JkFebZOYMc1U9PiEtVWGU4kuYuxiXpD8oMP
in1B0SgrF7gKfO1//I2weJdAUjgZuXBCPAlhz2EnHddzXUtwm9XuOLO/Y6LATVMs
bp8/lXnfo/bX0UgJ7C0aVqOu07A0Vr6OkPxwWmOvF3cRKhVCM7U4B51KK+IsWRLm
8cVW1IaXjwhGzW7BR6EI3sxCQ4Wnc6HVPSgmomLWWWkIGFPAwcWUB4NC12yhCO5i
W/dxNMWNLMRVtnZAyq6FpZ8wFK6j4OMwMwIDAQABo4ID1TCCA9EwHwYDVR0jBBgw
FoAUt2ui6qiqhIx56rTaD5iyxZV2ufQwHQYDVR0OBBYEFPcqCdAkWxFx7rq+9D4c
PVYSiBa7MIGBBgNVHREEejB4gg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUubmV0
ggtleGFtcGxlLmVkdYILZXhhbXBsZS5jb22CC2V4YW1wbGUub3Jngg93d3cuZXhh
bXBsZS5jb22CD3d3dy5leGFtcGxlLmVkdYIPd3d3LmV4YW1wbGUubmV0MA4GA1Ud
DwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwgY8GA1Ud
HwSBhzCBhDBAoD6gPIY6aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0
VExTUlNBU0hBMjU2MjAyMENBMS00LmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGln
aWNlcnQuY29tL0RpZ2lDZXJ0VExTUlNBU0hBMjU2MjAyMENBMS00LmNybDA+BgNV
HSAENzA1MDMGBmeBDAECAjApMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3LmRpZ2lj
ZXJ0LmNvbS9DUFMwfwYIKwYBBQUHAQEEczBxMCQGCCsGAQUFBzABhhhodHRwOi8v
b2NzcC5kaWdpY2VydC5jb20wSQYIKwYBBQUHMAKGPWh0dHA6Ly9jYWNlcnRzLmRp
Z2ljZXJ0LmNvbS9EaWdpQ2VydFRMU1JTQVNIQTI1NjIwMjBDQTEtMS5jcnQwCQYD
VR0TBAIwADCCAXwGCisGAQQB1nkCBAIEggFsBIIBaAFmAHUA6D7Q2j71BjUy51co
vIlryQPTy9ERa+zraeF3fW0GvW4AAAF/ip6hdQAABAMARjBEAiAxePNT60Z/vTJT
PVryiGzXrLxCNJQqteULkguBEMbG/gIgR3QwvILJIWAUfvSfJQ/zMmqr2JDanWE8
uzbC4EWbcwAAdQA1zxkbv7FsV78PrUxtQsu7ticgJlHqP+Eq76gDwzvWTAAAAX+K
nqF8AAAEAwBGMEQCIDspTxwkUBpEoeA+IolNYwOKl9Yxmwk816yd0O2IJPZcAiAV
8TWhoOLiiqGKnY02CdcGXOzAzC7tT6m7OtLAku2+WAB2ALNzdwfhhFD4Y4bWBanc
EQlKeS2xZwwLh9zwAw55NqWaAAABf4qeoYcAAAQDAEcwRQIgKR7qwPLQb6UT2+S7
w7uQsbsDZfZVX/g8FkBtAltaTpACIQDLdtedRNGNhuzYpB6gmBBydhtSQi5YZLsp
FvaVHpeW1zANBgkqhkiG9w0BAQsFAAOCAQEAqp++XZEbreROTsyPB2RENbStOxM/
wSnYtKvzQlFJRjvWzx5Bg+ELVy+DaXllB29ZA4xRlIkYED4eXO26PY5PGhSS0yv/
1JjLp5MOvLcbk6RCQkbZ5bEaa2gqmy5IqS8dKrDj+CCUVIFQLu7X4CB6ey5n+/rY
F6Rb3MoAYu8jr3pY8Hp0DL1NQ/GMAofc464J0vf6NzzSS6sE5UOl0lURDkGHXzio
5XpeTEa4tvo/w0vNQDX/4KRxdArBIIvjVEeE1Ri9UZtAXd1CMBLROqVjmq+QCNYb
0XELBnGQ666tr7pfx9trHniitNEGI6dj87VD+laMUBd7HBtOEGsiDoRSlA==
-----END CERTIFICATE-----
subject=C = US, ST = California, L = Los Angeles, O = InternetC2A0CorporationC2A0forC2A0AssignedC2A0NamesC2A0andC2A0Numbers, CN = www.example.org
issuer=C = US, O = DigiCert Inc, CN = DigiCert TLS RSA SHA256 2020 CA1
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: ECDH, prime256v1, 256 bits
---
SSL handshake has read 3772 bytes and written 739 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: 24DCEA127E089EC6D5935D6CFB78B37E77DEFC7A653B2308D11146FBF05CDB32
    Session-ID-ctx: 
    Resumption PSK: C5A6FF368C81F70319AF99E8377B63BC4CADF3E131D61F112F8CB751BBB623DE96B4662C876C3A39351509B0DEEFACEE
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - a1 c7 6a d7 5b 6c 83 5c-f3 92 f6 0f 23 c8 c5 c3   ..j.[l.....#...
    0010 - 29 d3 5b a4 50 6d b7 93-96 e2 68 40 93 52 22 54   ).[[email protected]"T
    0020 - 8d 4a cf bf cb 02 56 6f-1b 4b 08 05 af bf 1b dd   .J....Vo.K......
    0030 - 52 0d 3e 2a d5 4a 90 de-d9 1b f4 5d f8 06 d4 db   R.>*.J.....]....
    0040 - a4 66 7c 77 b2 73 72 02-5a ae 68 3d 61 54 c0 62   .f|w.sr.Z.h=aT.b
    0050 - 00 74 81 b1 47 38 cd fc-4a 14 d4 7c 83 43 f8 9c   .t..G8..J..|.C..
    0060 - ce 08 f2 a0 68 52 f5 66-37 c5 4f 9d 88 c4 93 c1   ....hR.f7.O.....
    0070 - 18 61 c1 b5 01 1c 3a 6e-9c 53 0f eb cd ed da a7   .a....:n.S......
    0080 - af f5 84 ed 4b fb c5 fd-98 e4 ed dd e2 44 e5 51   ....K........D.Q
    0090 - 0e d9 f5 0d 6b f5 11 75-88 c8 2c da 74 dc d1 a8   ....k..u..,.t...
    00a0 - 65 10 4b e0 df 1e c7 2e-b0 16 8e dc 06 19 1d 34   e.K............4
    00b0 - 19 04 b7 10 d6 95 6d 2b-64 b4 ea e3 99 d8 0b c1   ......m+d.......

    Start Time: 1666844343
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: D23A9980357E2CF2B9DAA63C022E57C06C588022E981A86D0997D15DFED3DFC5
    Session-ID-ctx: 
    Resumption PSK: A31A023F56B24CA274F6267C496A72E0777BCB5EC8C2590275531FB26B23E86736CE59C40ABB52556B81120FB46BA105
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - a1 c7 6a d7 5b 6c 83 5c-f3 92 f6 0f 23 c8 c5 c3   ..j.[l.....#...
    0010 - 46 94 9b 6f 98 3f 52 72-e4 06 c4 51 24 78 5e 62   F..o.?Rr...Q$x^b
    0020 - fa 63 aa 37 ad 09 ea b9-38 16 14 85 10 85 1e 2d   .c.7....8......-
    0030 - b0 89 44 97 63 f3 08 5b-6a f8 bc 99 31 8d 1b 81   ..D.c..[j...1...
    0040 - 2a 29 36 9c 09 5c e6 35-53 8d 30 d5 5a d2 da a4   *)6...5S.0.Z...
    0050 - 04 c6 c7 f5 d8 f7 84 15-02 22 ce 95 72 d5 97 e2   ........."..r...
    0060 - 16 7b e2 06 db e3 2f 27-a7 83 72 67 1a e3 cb 21   .{..../'..rg...!
    0070 - e7 0a 51 d5 fa d8 8e 2f-77 6d 2a 17 49 a8 27 b4   ..Q..../wm*.I.'.
    0080 - 07 c3 f1 d5 ca 49 93 e2-1b 2d c5 d3 95 e2 ea fd   .....I...-......
    0090 - 44 a4 95 9d e0 d9 d8 af-92 b6 d0 ec bc 20 75 a0   D............ u.
    00a0 - 5e 8b 55 2f 5a 31 e5 a6-cc e6 98 7d 5b ac 30 d8   ^.U/Z1.....}[.0.
    00b0 - aa 95 cc c5 1a c2 4b 3a-ff ed d9 bf af 91 ef bd   ......K:........
    00c0 - 82 bf 31 1c d0 21 92 f9-9a 59 08 26 b2 79 4f 9c   ..1..!...Y.&.yO.

    Start Time: 1666844343
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK

您会注意到您的光标位于输出下方,而不是新行。 这是因为 OpenSSL 仍连接到服务器并正在等待更多命令。 你可以在你的 HTTP 请求中发送一个 HEAD 命令,例如 example. 为此,请键入以下内容。

HEAD / HTTP/1.1

Enter 一次,然后以与下面相同的方式再次输入您的域名,交换 example.org 与您的域。

Host: example.org

Enter 再次查看输出。

[truncated for space reasons]

read R BLOCK
HEAD / HTTP/1.1
Host: example.org

HTTP/1.1 200 OK
Content-Encoding: gzip
Accept-Ranges: bytes
Age: 234808
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Thu, 27 Oct 2022 10:54:56 GMT
Etag: "3147526947"
Expires: Thu, 03 Nov 2022 10:54:56 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (dcb/7EA3)
X-Cache: HIT
Content-Length: 648

与端口 443 的成功 OpenSSL 测试连接提供了相当多的信息,例如证书链、正在使用的密码、使用的 TLS 协议版本以及整个 SSL 握手过程。 如果您尝试发送 HEAD 请求并收到 HTTP/1.1 400 错误请求错误,您应该添加 -crlf 标志。 这个标志将帮助服务器了解我们正在尝试做什么。

freddy@freddy-vm:~$ openssl s_client -connect example.org:443 -crlf

你可以按 CTRL + C 退出或插入 echo 命令,这将在验证后立即终止与服务器的 OpenSSL 测试连接。

如果无法建立连接,输出会是什么?

如果端口已关闭或 Web 服务器已关闭,您会得到类似的结果。

freddy@freddy-vm:~$ openssl s_client -connect example.org:443 -tls1_2
4037C54E1A7F0000:error:8000006F:system library:BIO_connect:Connection refused:../crypto/bio/bio_sock2.c:125:calling connect()
4037C54E1A7F0000:error:10000067:BIO routines:BIO_connect:connect error:../crypto/bio/bio_sock2.c:127:
connect:errno=111

您的测试 OpenSSL 连接可以更短吗?

是的。您可以通过添加 -brief 标志来实现此目的,该标志排除了大部分输出。

freddy@freddy-vm:~$ openssl s_client -connect example.org:443 -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.3
Ciphersuite: TLS_AES_256_GCM_SHA384
Peer certificate: C = US, ST = California, L = Los Angeles, O = InternetC2A0CorporationC2A0forC2A0AssignedC2A0NamesC2A0andC2A0Numbers, CN = www.example.org
Hash used: SHA256
Signature type: RSA-PSS
Verification: OK
Server Temp Key: ECDH, prime256v1, 256 bits

所以在这种情况下,端口是打开的,我们可以建立连接。 但连接是通过安全端口建立的这一事实并不意味着证书有效。

如果您的证书已过期,例如证书的主机名与您的域不匹配,它仍会向您显示上述输出,即使您的访问者在他们的浏览器中收到安全警告。

证书到期日期

另一个有用的 OpenSSL 命令是 x509。 如果使用 -date 标志将 s_client 的输出通过管道传输到 x509,则可以获得证书的开始和结束日期。 此外,使用 -noout 标志来抑制加密证书的输出以节省屏幕空间。 它还将添加一个 echo 命令并使用 2>/dev/null 忽略错误以获得更清晰的输出。

freddy@freddy-vm:~$ echo | openssl s_client -connect example.org:443 2>/dev/null | openssl x509 -noout -dates
notBefore=Mar 14 00:00:00 2022 GMT
notAfter=Mar 14 23:59:59 2023 GMT

是否可以使用特定版本的 TLS 建立 OpenSSL 测试连接?

是的。您可以使用标志指定所需的 TLS 版本。 不使用小数分隔符,而是使用下划线。 标志的一些示例是 -tls1_1、-tls1_2 或 -tls1_3。 对于以下命令和后续输出,使用 OpenSSL 建立的测试 SSL 连接使用 TLS 版本 1.2。

freddy@freddy-vm:~$ echo | openssl s_client -connect example.com:443 -tls1_2 -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES128-GCM-SHA256
Peer certificate: C = US, ST = California, L = Los Angeles, O = InternetC2A0CorporationC2A0forC2A0AssignedC2A0NamesC2A0andC2A0Numbers, CN = www.example.org
Hash used: SHA256
Signature type: RSA-PSS
Verification: OK
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, prime256v1, 256 bits
DONE

如何检查证书的 SAN?

证书中的主题备用名称 (SAN) 允许您使用单个证书保护多个域。 您可以通过将 s_client 输出传输到 x509 命令来验证这一点。 这是正确的语法。

$ echo | openssl s_client -connect example.org:443 2>/dev/null | openssl x509 -noout -ext subjectAltName

下面是输出。

freddy@freddy-vm:~$ echo | openssl s_client -connect example.org:443 2>/dev/null | openssl x509 -noout -ext subjectAltName
X509v3 Subject Alternative Name: 
    DNS:www.example.org, DNS:example.net, DNS:example.edu, DNS:example.com, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net

使用 OpenSSL 测试邮件服务器连接

我们可以使用 OpenSSL 来解决使用 IMAP、POP3 和 SMTP 协议的邮件服务器的连接问题。 根据测试的端口,您需要告诉邮件服务器将连接升级为安全连接,这是通过使用 STARTTLS 命令来完成的。

什么是显式端口和隐式端口?

显式端口不会自动受到保护,只有在它们收到 STARTTLS 命令时才会启动 TLS 握手以保护连接。 您可以选择通过安全或非安全连接进行连接。

隐式端口始终受到保护,并将立即启动 TLS 握手以保护连接。 如果这不可能,则连接将被完全拒绝。

IMAP 的 OpenSSL 测试连接

以下是显式端口 143 的语法和输出。更改邮件。example.org 到您的邮件服务器的 URL。

freddy@freddy-vm:~$ openssl s_client -connect mail.example.org:143 -starttls imap -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES256-GCM-SHA384
Peer certificate: CN = example.org
Hash used: SHA256
Signature type: RSA
Verification: OK
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, prime256v1, 256 bits
. OK Pre-login capabilities listed, post-login capabilities have more.

以下是默认端口 993 的语法和输出。更改邮件。example.org 到您的邮件服务器的 URL。

freddy@freddy-vm:~$ openssl s_client -connect mail.example.org:993 -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES256-GCM-SHA384
Peer certificate: CN = example.org
Hash used: SHA256
Signature type: RSA
Verification: OK
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, prime256v1, 256 bits
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE NAMESPACE LITERAL+ AUTH=PLAIN AUTH=LOGIN] Dovecot ready.

POP3 的 OpenSSL 测试连接

这是显式端口 110 的语法和输出。记得更改邮件。example.org 到您的邮件服务器的 URL。

freddy@freddy-vm:~$ openssl s_client -connect mail.example.org:110 -starttls pop3 -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES256-GCM-SHA384
Peer certificate: CN = example.org
Hash used: SHA256
Signature type: RSA
Verification: OK
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, prime256v1, 256 bits
+OK Dovecot ready.

以下是默认端口 993 的语法和输出。更改邮件。example.org 到您的邮件服务器的 URL。

freddy@freddy-vm:~$ openssl s_client -connect mail.example.org:993 -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES256-GCM-SHA384
Peer certificate: CN = example.org
Hash used: SHA256
Signature type: RSA
Verification: OK
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, prime256v1, 256 bits
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE NAMESPACE LITERAL+ AUTH=PLAIN AUTH=LOGIN] Dovecot ready.

用于 SMTP 的测试连接 OpenSSL

以下是显式端口 25 和 587 的语法和输出。更改邮件。example.org 到您的邮件服务器的 URL。

freddy@freddy-vm:~$ openssl s_client -connect mail.example.org:25 -starttls smtp -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES256-GCM-SHA384
Peer certificate: CN = example.org
Hash used: SHA256
Signature type: RSA
Verification: OK
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, prime256v1, 256 bits
250 HELP
freddy@freddy-vm:~$ openssl s_client -connect mail.example.org:587 -starttls smtp -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES256-GCM-SHA384
Peer certificate: CN = example.org
Hash used: SHA256
Signature type: RSA
Verification: OK
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, prime256v1, 256 bits
250 HELP

以下是隐式端口 465 的语法和输出。更改邮件。example.org 到您的邮件服务器的 URL。

freddy@freddy-vm:~$ openssl s_client -connect mail.example.org:465  -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES256-GCM-SHA384
Peer certificate: CN = example.org
Hash used: SHA256
Signature type: RSA
Verification: OK
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, prime256v1, 256 bits
220-host.example.org ESMTP Exim 4.95 #2 Thu, 27 Oct 2022 11:41:44 -0400 
220-We do not authorize the use of this system to transport unsolicited, 
220 and/or bulk e-mail.

结尾

OpenSSL 是一套出色的工具,用于测试您是否与服务器建立了安全连接。 这个功能只是大多数 Unix 平台上预装的这个强大而有用的工具的一小部分。 学习使用 OpenSSL 是测试 SSL 连接的宝贵工具。

您是否希望将您的托管环境提升到一个新的水平? 考虑从 Liquid Web 托管 VPS, Cloud 专用服务器或专用服务器。 我们的托管环境具备提升下一个托管项目所需的一切。 联系我们的销售团队开始吧。