Telnet 缺乏加密,這使得 OpenSSL 成為連接遠程系統的更安全的選擇。
telnet命令是最受歡迎的網絡故障排除工具之一,從系統管理員到網絡愛好者都可以使用。在網絡計算的早期,telnet
被用來連接到一個遠程系統。你可以用telnet
訪問一個遠程系統的端口,登錄并在該主機上運行命令。
由于 telnet
缺乏加密功能,它在很大程度上已經被 OpenSSL 取代了這項工作。然而,作為一種智能的ping
,telnet
的作用仍然存在(甚至在某些情況下至今仍然存在)。雖然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
的數據:
[...]
Example Domain
This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.
More information...
Email 服務器
你也可以使用 OpenSSL 的 s_client
來測試一個加密的 Email 服務器。要做到這點,你必須把你的測試用戶的用戶名和密碼用 Base64 編碼。
這里有一個簡單的方法來做到:
$ perl -MMIME::Base64 -e 'print encode_base64("username");'
$ perl -MMIME::Base64 -e 'print encode_base64("password");'
當你記錄了這些值,你就可以通過 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中國榮譽推出