用 OpenSSL 替代 Telnet

系统 Linux
Telnet 缺乏加密,这使得 OpenSSL 成为连接远程系统的更安全的选择。

Telnet 缺乏加密,这使得 OpenSSL 成为连接远程系统的更安全的选择。

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 系统上了。如果没有,你可以用你的发行版的软件包管理器安装它:

  1. $ sudo dnf install openssl

在 Debian 或类似的系统上:

  1. $ sudo apt install openssl

安装后,验证它的响应是否符合预期:

  1. $ openssl version
  2. OpenSSL x.y.z FIPS

验证端口访问

最基本的 telnet 用法是一个看起来像这样的任务:

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

在此示例中,这将与正在端口 25(可能是邮件服务器)监听的任意服务打开一个交互式会话。只要你获得访问权限,就可以与该服务进行通信。

如果端口 25 无法访问,连接就会被拒绝。

OpenSSL 也是类似的,尽管通常较少互动。要验证对一个端口的访问:

  1. $ openssl s_client -connect example.com:80
  2. CONNECTED(00000003)
  3. 140306897352512:error:1408F10B:SSL [...]
  4.  
  5. no peer certificate available
  6.  
  7. No client certificate CA names sent
  8.  
  9. SSL handshake has read 5 bytes and written 309 bytes
  10. Verification: OK
  11.  
  12. New, (NONE), Cipher is (NONE)
  13. Secure Renegotiation IS NOT supported
  14. Compression: NONE
  15. Expansion: NONE
  16. No ALPN negotiated
  17. Early data was not sent
  18. Verify return code: 0 (ok)

但是,这仅是目标性 ping。从输出中可以看出,没有交换 SSL 证书,所以连接立即终止。为了充分利用 openssl s_client,你必须连接加密的端口。

交互式 OpenSSL

Web 浏览器和 Web 服务器进行交互,可以使指向 80 端口的流量实际上被转发到 443,这是保留给加密 HTTP 流量的端口。知道了这一点,你就可以用 openssl 命令连接到加密的端口,并与在其上运行的任何网络服务进行交互。

首先,使用 SSL 连接到一个端口。使用 -showcerts 选项会使 SSL 证书打印到你的终端上,一开始的输出要比 telnet 要冗长得多:

  1. $ openssl s_client -connect example.com:443 -showcerts
  2. [...]
  3.     0080 - 52 cd bd 95 3d 8a 1e 2d-3f 84 a0 e3 7a c0 8d 87   R...=..-?...z...
  4.     0090 - 62 d0 ae d5 95 8d 82 11-01 bc 97 97 cd 8a 30 c1   b.............0.
  5.     00a0 - 54 78 5c ad 62 5b 77 b9-a6 35 97 67 65 f5 9b 22   Tx\\.b[w..5.ge.."
  6.     00b0 - 18 8a 6a 94 a4 d9 7e 2f-f5 33 e8 8a b7 82 bd 94   ..j...~/.3......
  7.  
  8.     Start Time: 1619661100
  9.     Timeout   : 7200 (sec)
  10.     Verify return code: 0 (ok)
  11.     Extended master secret: no
  12.     Max Early Data: 0
  13. -
  14. read R BLOCK

你被留在一个交互式会话中。最终,这个会话将关闭,但如果你及时行动,你可以向服务器发送 HTTP 信号:

  1. [...]
  2. GET / HTTP/1.1
  3. HOST: example.com

回车键两次,你会收到 example.com/index.html 的数据:

  1. [...]
  2. <body>
  3. <div>
  4. <h1>Example Domain</h1>
  5. <p>This domain is for use in illustrative examples in documents. You may use this
  6. domain in literature without prior coordination or asking for permission.</p>
  7. <p><a href="https://www.iana.org/domains/example">More information...</a></p>
  8. </div>
  9. </body>
  10. </html>

Email 服务器

你也可以使用 OpenSSL 的 s_client 来测试一个加密的 Email 服务器。要做到这点,你必须把你的测试用户的用户名和密码用 Base64 编码。

这里有一个简单的方法来做到:

  1. $ perl -MMIME::Base64 -e 'print encode_base64("username");'
  2. $ perl -MMIME::Base64 -e 'print encode_base64("password");'

当你记录了这些值,你就可以通过 SSL 连接到邮件服务器,它通常在 587 端口:

  1. $ openssl s_client -starttls smtp \
  2. -connect email.example.com:587
  3. > ehlo example.com
  4. > auth login
  5. ##paste your user base64 string here##
  6. ##paste your password base64 string here##
  7.  
  8. > mail from: noreply@example.com
  9. > rcpt to: admin@example.com
  10. > data
  11. > Subject: Test 001
  12. This is a test email.
  13. .
  14. > quit

检查你的邮件(在这个示例代码中,是 admin@example.com),查看来自 noreply@example.com 的测试邮件。

OpenSSL 还是 Telnet?

telnet 仍然有用途,但它已经不是以前那种不可缺少的工具了。该命令在许多发行版上被归入 “遗留” 网络软件包,而且还没有 telnet-ng 之类的明显的继任者,管理员有时会对它被排除在默认安装之外感到疑惑。答案是,它不再是必不可少的,它的作用越来越小,这 很好。网络安全很重要,所以要适应与加密接口互动的工具,这样你就不必在排除故障时禁用你的保护措施。 

 

责任编辑:庞桂玉 来源: Linux中国
相关推荐

2010-07-15 10:00:40

2009-11-23 17:10:35

2010-07-16 11:10:50

telnet批处理TCLEXPECT脚本

2009-09-10 11:11:07

pem密钥文件

2013-08-02 15:23:11

2010-04-01 14:14:56

Oracle绑定变量

2019-10-26 14:11:36

GoPython知乎

2009-08-21 09:28:28

IP PBX统一通信

2023-02-13 15:03:33

JDKJavaHotSpot

2013-08-02 10:39:59

AndroidAPPOS

2023-01-28 13:39:31

Linuxzram

2010-07-21 15:50:24

2010-05-26 14:16:45

替代MySQL

2020-09-17 06:19:05

InDesign

2020-09-17 06:15:04

InDesignScribus 开源

2011-11-11 18:55:21

2010-07-20 14:55:16

Telnet端口

2010-07-26 13:03:23

Telnet会话

2010-07-26 13:44:33

Ubuntu teln

2010-07-25 14:37:40

telnet命令
点赞
收藏

51CTO技术栈公众号