Linux中國

用 OpenSSL 替代 Telnet

telnet 命令是最受歡迎的網路故障排除工具之一,從系統管理員到網路愛好者都可以使用。在網路計算的早期,telnet 被用來連接到一個遠程系統。你可以用 telnet 訪問一個遠程系統的埠,登錄並在該主機上運行命令。

由於 telnet 缺乏加密功能,它在很大程度上已經被 OpenSSL 取代了這項工作。然而,作為一種智能的 pingtelnet 的作用仍然存在(甚至在某些情況下至今仍然存在)。雖然 ping 命令是一個探測主機響應的好方法,但這是它能做的 全部。另一方面,telnet 不僅可以確認一個活動埠,而且還可以與該埠的服務進行交互。即便如此,由於大多數現代網路服務都是加密的,telnet 的作用可能要小得多,這取決於你想實現什麼。

OpenSSL s_client

對於大多數曾經需要 telnet 的任務,我現在使用 OpenSSL 的 s_client 命令。(我在一些任務中使用 curl,但那些情況下我可能無論如何也不會使用 telnet)。大多數人都知道 OpenSSL 是一個加密的庫和框架,但不是所有人都意識到它也是一個命令。openssl 命令的 s_client 組件實現了一個通用的 SSL 或 TLS 客戶端,幫助你使用 SSL 或 TLS 連接到遠程主機。它是用來測試的,至少在內部使用與該庫相同的功能。

安裝 OpenSSL

OpenSSL 可能已經安裝在你的 Linux 系統上了。如果沒有,你可以用你的發行版的軟體包管理器安裝它:

$ sudo dnf install openssl

在 Debian 或類似的系統上:

$ sudo apt install openssl

安裝後,驗證它的響應是否符合預期:

$ openssl version
OpenSSL x.y.z FIPS

驗證埠訪問

最基本的 telnet 用法是一個看起來像這樣的任務:

$ telnet mail.example.com 25
Trying 98.76.54.32...
Connected to example.com.
Escape character is '^]'.

在此示例中,這將與正在埠 25(可能是郵件伺服器)監聽的任意服務打開一個互動式會話。只要你獲得訪問許可權,就可以與該服務進行通信。

如果埠 25 無法訪問,連接就會被拒絕。

OpenSSL 也是類似的,儘管通常較少互動。要驗證對一個埠的訪問:

$ 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)

但是,這僅是目標性 ping。從輸出中可以看出,沒有交換 SSL 證書,所以連接立即終止。為了充分利用 openssl s_client,你必須連接加密的埠。

互動式 OpenSSL

Web 瀏覽器和 Web 伺服器進行交互,可以使指向 80 埠的流量實際上被轉發到 443,這是保留給加密 HTTP 流量的埠。知道了這一點,你就可以用 openssl 命令連接到加密的埠,並與在其上運行的任何網路服務進行交互。

首先,使用 SSL 連接到一個埠。使用 -showcerts 選項會使 SSL 證書列印到你的終端上,一開始的輸出要比 telnet 要冗長得多:

$ 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

你被留在一個互動式會話中。最終,這個會話將關閉,但如果你及時行動,你可以向伺服器發送 HTTP 信號:

[...]
GET / HTTP/1.1
HOST: example.com

回車鍵兩次,你會收到 example.com/index.html 的數據:

[...]
<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 伺服器

你也可以使用 OpenSSL 的 s_client 來測試一個加密的 Email 伺服器。要做到這點,你必須把你的測試用戶的用戶名和密碼用 Base64 編碼。

這裡有一個簡單的方法來做到:

$ perl -MMIME::Base64 -e &apos;print encode_base64("username");&apos;
$ perl -MMIME::Base64 -e &apos;print encode_base64("password");&apos;

當你記錄了這些值,你就可以通過 SSL 連接到郵件伺服器,它通常在 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

檢查你的郵件(在這個示例代碼中,是 admin@example.com),查看來自 noreply@example.com 的測試郵件。

OpenSSL 還是 Telnet?

telnet 仍然有用途,但它已經不是以前那種不可缺少的工具了。該命令在許多發行版上被歸入 「遺留」 網路軟體包,而且還沒有 telnet-ng 之類的明顯的繼任者,管理員有時會對它被排除在默認安裝之外感到疑惑。答案是,它不再是必不可少的,它的作用越來越小,這 很好。網路安全很重要,所以要適應與加密介面互動的工具,這樣你就不必在排除故障時禁用你的保護措施。

via: https://opensource.com/article/21/5/drop-telnet-openssl

作者:Seth Kenlon 選題:lujun9972 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國