用 OpenSSL 替代 Telnet
Telnet 缺乏加密,這使得 OpenSSL 成為連接遠(yuǎn)程系統(tǒng)的更安全的選擇。
telnet 命令是最受歡迎的網(wǎng)絡(luò)故障排除工具之一,從系統(tǒng)管理員到網(wǎng)絡(luò)愛好者都可以使用。在網(wǎng)絡(luò)計(jì)算的早期,telnet
被用來連接到一個(gè)遠(yuǎn)程系統(tǒng)。你可以用 telnet
訪問一個(gè)遠(yuǎn)程系統(tǒng)的端口,登錄并在該主機(jī)上運(yùn)行命令。
由于 telnet
缺乏加密功能,它在很大程度上已經(jīng)被 OpenSSL 取代了這項(xiàng)工作。然而,作為一種智能的 ping
,telnet
的作用仍然存在(甚至在某些情況下至今仍然存在)。雖然 ping
命令是一個(gè)探測(cè)主機(jī)響應(yīng)的好方法,但這是它能做的 全部。另一方面,telnet
不僅可以確認(rèn)一個(gè)活動(dòng)端口,而且還可以與該端口的服務(wù)進(jìn)行交互。即便如此,由于大多數(shù)現(xiàn)代網(wǎng)絡(luò)服務(wù)都是加密的,telnet
的作用可能要小得多,這取決于你想實(shí)現(xiàn)什么。
OpenSSL s_client
對(duì)于大多數(shù)曾經(jīng)需要 telnet
的任務(wù),我現(xiàn)在使用 OpenSSL 的 s_client
命令。(我在一些任務(wù)中使用 curl,但那些情況下我可能無論如何也不會(huì)使用 telnet
)。大多數(shù)人都知道 OpenSSL 是一個(gè)加密的庫(kù)和框架,但不是所有人都意識(shí)到它也是一個(gè)命令。openssl
命令的 s_client
組件實(shí)現(xiàn)了一個(gè)通用的 SSL 或 TLS 客戶端,幫助你使用 SSL 或 TLS 連接到遠(yuǎn)程主機(jī)。它是用來測(cè)試的,至少在內(nèi)部使用與該庫(kù)相同的功能。
安裝 OpenSSL
OpenSSL 可能已經(jīng)安裝在你的 Linux 系統(tǒng)上了。如果沒有,你可以用你的發(fā)行版的軟件包管理器安裝它:
$ sudo dnf install openssl
在 Debian 或類似的系統(tǒng)上:
$ sudo apt install openssl
安裝后,驗(yàn)證它的響應(yīng)是否符合預(yù)期:
$ openssl version
OpenSSL x.y.z FIPS
驗(yàn)證端口訪問
最基本的 telnet
用法是一個(gè)看起來像這樣的任務(wù):
$ telnet mail.example.com 25
Trying 98.76.54.32...
Connected to example.com.
Escape character is '^]'.
在此示例中,這將與正在端口 25(可能是郵件服務(wù)器)監(jiān)聽的任意服務(wù)打開一個(gè)交互式會(huì)話。只要你獲得訪問權(quán)限,就可以與該服務(wù)進(jìn)行通信。
如果端口 25 無法訪問,連接就會(huì)被拒絕。
OpenSSL 也是類似的,盡管通常較少互動(dòng)。要驗(yàn)證對(duì)一個(gè)端口的訪問:
$ openssl s_client -connect example.com:80
CONNECTED(00000003)
140306897352512:error:1408F10B:SSL [...]
no peer certificate available
No client certificate CA names sent
SSL handshake has read 5 bytes and written 309 bytes
Verification: OK
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
但是,這僅是目標(biāo)性 ping
。從輸出中可以看出,沒有交換 SSL 證書,所以連接立即終止。為了充分利用 openssl s_client
,你必須連接加密的端口。
交互式 OpenSSL
Web 瀏覽器和 Web 服務(wù)器進(jìn)行交互,可以使指向 80 端口的流量實(shí)際上被轉(zhuǎn)發(fā)到 443,這是保留給加密 HTTP 流量的端口。知道了這一點(diǎn),你就可以用 openssl
命令連接到加密的端口,并與在其上運(yùn)行的任何網(wǎng)絡(luò)服務(wù)進(jìn)行交互。
首先,使用 SSL 連接到一個(gè)端口。使用 -showcerts
選項(xiàng)會(huì)使 SSL 證書打印到你的終端上,一開始的輸出要比 telnet 要冗長(zhǎng)得多:
$ openssl s_client -connect example.com:443 -showcerts
[...]
0080 - 52 cd bd 95 3d 8a 1e 2d-3f 84 a0 e3 7a c0 8d 87 R...=..-?...z...
0090 - 62 d0 ae d5 95 8d 82 11-01 bc 97 97 cd 8a 30 c1 b.............0.
00a0 - 54 78 5c ad 62 5b 77 b9-a6 35 97 67 65 f5 9b 22 Tx\\.b[w..5.ge.."
00b0 - 18 8a 6a 94 a4 d9 7e 2f-f5 33 e8 8a b7 82 bd 94 ..j...~/.3......
Start Time: 1619661100
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
Max Early Data: 0
-
read R BLOCK
你被留在一個(gè)交互式會(huì)話中。最終,這個(gè)會(huì)話將關(guān)閉,但如果你及時(shí)行動(dòng),你可以向服務(wù)器發(fā)送 HTTP 信號(hào):
[...]
GET / HTTP/1.1
HOST: example.com
按回車鍵兩次,你會(huì)收到 example.com/index.html
的數(shù)據(jù):
[...]
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents. You may use this
domain in literature without prior coordination or asking for permission.</p>
<p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
Email 服務(wù)器
你也可以使用 OpenSSL 的 s_client
來測(cè)試一個(gè)加密的 Email 服務(wù)器。要做到這點(diǎn),你必須把你的測(cè)試用戶的用戶名和密碼用 Base64 編碼。
這里有一個(gè)簡(jiǎn)單的方法來做到:
$ perl -MMIME::Base64 -e 'print encode_base64("username");'
$ perl -MMIME::Base64 -e 'print encode_base64("password");'
當(dāng)你記錄了這些值,你就可以通過 SSL 連接到郵件服務(wù)器,它通常在 587 端口:
$ openssl s_client -starttls smtp \
-connect email.example.com:587
> ehlo example.com
> auth login
##paste your user base64 string here##
##paste your password base64 string here##
> mail from: noreply@example.com
> rcpt to: admin@example.com
> data
> Subject: Test 001
This is a test email.
.
> quit
檢查你的郵件(在這個(gè)示例代碼中,是 admin@example.com
),查看來自 noreply@example.com
的測(cè)試郵件。
OpenSSL 還是 Telnet?
telnet
仍然有用途,但它已經(jīng)不是以前那種不可缺少的工具了。該命令在許多發(fā)行版上被歸入 “遺留” 網(wǎng)絡(luò)軟件包,而且還沒有 telnet-ng
之類的明顯的繼任者,管理員有時(shí)會(huì)對(duì)它被排除在默認(rèn)安裝之外感到疑惑。答案是,它不再是必不可少的,它的作用越來越小,這 很好。網(wǎng)絡(luò)安全很重要,所以要適應(yīng)與加密接口互動(dòng)的工具,這樣你就不必在排除故障時(shí)禁用你的保護(hù)措施。