WolfSSL的可嵌入SSH服务器Wolfssh手册
Wolfssh取决于WolfCrypt,这是Wolfssl的一部分。以下是Wolfssl最简单的配置,以启用Wolfssh。
$ cd wolfssl
$ ./configure [OPTIONS] --enable-ssh
$ make check
$ sudo make install
在某些系统上,安装后需要可选的ldconfig命令。
要使用Wolfssh中的密钥生成功能,WolfSSL将需要使用KeyGen配置: --enable-keygen 。
当使用X.509证书进行用户身份验证时,必须使用启用TLS构建WolfSSL。 Wolfssh使用WolfSSL的X.509证书管理器系统,包括OCSP查找。要允许OCSP,请将--enable-ocsp添加到WolfSSL配置中。
如果不需要大部分WolfSSL代码,则可以使用Crypto Option配置WolfSSL: --enable-cryptonly 。
WolfSSL的其他构建选项位于第二章中。沃尔夫斯手册。
从Wolfssh源目录运行:
$ ./autogen.sh
$ ./configure --with-wolfssl=[/usr/local]
$ make
$ make check
autogen.sh脚本仅在克隆存储库后第一次运行。如果您已经运行它或正在使用源存档中的代码,则应跳过它。
有关使用Visual Studio在Windows构建的构建,请参见文件“ IDE/WINVS/README.MD”。
注意:在资源约束设备上,可能需要将DEFAULT_WINDOW_SZ设置为较低的尺寸。在桌面用例中也可以增加它,以帮助进行大型文件传输。默认情况下,将通道设置为在发送通道窗口调整消息之前,最多可接收128KB的数据。设置新频道窗口大小的一个示例如下./configure CPPFLAGS="-DDEFAULT_WINDOW_SZ=16384"
对于32位Linux平台,您可以通过与CFLAGS=-D_FILE_OFFSET_BITS=64添加对文件> 2GB的支持。
目录examples包含一个echoserver,任何客户端都应该能够连接。从终端运行:
$ ./examples/echoserver/echoserver -f
选项-f启用仅回声模式。从另一个终端运行中:
$ ssh jill@localhost -p 22222
当提示密码时,请输入“ Upthehill”。服务器将向客户端发送罐头横幅:
wolfSSH Example Echo Server
服务器将向客户端输入的字符在屏幕上回声。如果字符两次回声,则客户端启用了本地回波。 Echoserver并不是合适的终端,因此CR/LF翻译将无法正常工作。
以下控制字符将触发Echoserver中的特殊操作:
克隆存储库后,请确保为用户读取“只读的私有键”,否则ssh会告诉您这样做。
$ chmod 0600 ./keys/gretel-key-rsa.pem ./keys/hansel-key-rsa.pem
./keys/gretel-key-ecc.pem ./keys/hansel-key-ecc.pem
可以使用密码或公共密钥来完成针对Echoserver的示例验证。使用密码命令行:
$ ssh -p 22222 USER@localhost
用户和密码对在哪里:
jill:upthehill
jack:fetchapail
要使用公共密钥身份验证使用命令行:
$ ssh -i ./keys/USER-key-TYPE.pem -p 22222 USER@localhost
用户可以是gretel或hansel ,并且类型是rsa或ecc 。
请记住,Echoserver在其wsUserAuth()回调函数中具有多个假帐户。 (Jack,Jill,Hansel和Gretel)当启用外壳支持时,这些假帐户将无法正常工作。它们在系统的PassWD文件中不存在。用户将进行身份验证,但是服务器会误导,因为系统中不存在。您可以将自己的用户名添加到Echoserver中的密码或公共密钥列表中。该帐户将登录由Echoserver启动的外壳,并具有运行Echoserver的用户的特权。
Wolfssh包装了一些用于测试目的的示例工具,并与其他SSH实现一起演示了互操作性。
Echoserver是Wolfssh的主力。它最初只允许一个人验证其中一个罐头帐户,并重复输入其中的字符。在启用外壳支持时,它可以产生用户外壳。它将在计算机上需要一个实际的用户名和更新的用户身份验证回调功能来验证凭据。 Echoserver还可以处理SCP和SFTP连接。
Echoserver工具接受以下命令行选项:
-1 exit after a single (one) connection
-e expect ECC public key from client
-E use ECC private key
-f echo input
-p <num> port to accept on, default 22222
-N use non-blocking sockets
-d <string> set the home directory for SFTP connections
-j <file> load in a public key to accept from peer
客户端建立了与SSH服务器的连接。在最简单的模式下,它发送了字符串“ Hello,Wolfssh!”到服务器,打印响应,然后退出。使用伪终端选项,客户端将是真正的客户端。
客户端工具接受以下命令行选项:
-h <host> host to connect to, default 127.0.0.1
-p <num> port to connect on, default 22222
-u <username> username to authenticate as (REQUIRED)
-P <password> password for username, prompted if omitted
-e use sample ecc key for user
-i <filename> filename for the user's private key
-j <filename> filename for the user's public key
-x exit after successful connection without doing
read/write
-N use non-blocking sockets
-t use psuedo terminal
-c <command> executes remote command and pipe stdin/stdout
-a Attempt to use SSH-AGENT
PORTFWD工具建立了与SSH服务器的连接,并为本地端口转发设置侦听器或请求侦听器以进行远程端口转发。连接后,该工具终止。
PortFWD工具接受以下命令行选项:
-h <host> host to connect to, default 127.0.0.1
-p <num> port to connect on, default 22222
-u <username> username to authenticate as (REQUIRED)
-P <password> password for username, prompted if omitted
-F <host> host to forward from, default 0.0.0.0
-f <num> host port to forward from (REQUIRED)
-T <host> host to forward to, default to host
-t <num> port to forward to (REQUIRED)
SCPCLIENT WOLFSCP建立了与SSH服务器的连接,并从本地计算机复制指定的文件。
SCPCLIENT工具接受以下命令行选项:
-H <host> host to connect to, default 127.0.0.1
-p <num> port to connect on, default 22222
-u <username> username to authenticate as (REQUIRED)
-P <password> password for username, prompted if omitted
-L <from>:<to> copy from local to server
-S <from>:<to> copy from server to local
SFTPCLIENT WOLFSFTP建立了与SSH服务器的连接,并允许目录导航,获取和放置文件,制作和删除目录等。
SFTPClient工具接受以下命令行选项:
-h <host> host to connect to, default 127.0.0.1
-p <num> port to connect on, default 22222
-u <username> username to authenticate as (REQUIRED)
-P <password> password for username, prompted if omitted
-d <path> set the default local path
-N use non blocking sockets
-e use ECC user authentication
-l <filename> local filename
-r <filename> remote filename
-g put local filename as remote filename
-G get remote filename as local filename
Wolfssh包括对SCP的服务器端支持,其中包括对“服务器”复制文件的支持,并从“服务器”复制文件。单个文件和递归目录副本都以默认发送和接收回调支持。
要使用SCP支持编译Wolfssh,请使用--enable-scp构建选项或定义WOLFSSH_SCP :
$ ./configure --enable-scp
$ make
有关完整的API使用和实施详细信息,请参阅Wolfssh用户手册。
已设置了Wolfssh示例服务器以接受单个SCP请求,并且在编译Wolfssh库时默认情况下会汇总。要启动示例服务器,请运行:
$ ./examples/server/server
标准SCP命令可以在客户端使用。以下是一些示例,其中scp代表您正在使用的SSH客户端。
要使用默认示例用户“ Jill”将单个文件复制到服务器:
$ scp -P 22222 <local_file> [email protected]:<remote_path>
将同一单个文件复制到服务器,但使用时间戳和详细模式:
$ scp -v -p -P 22222 <local_file> [email protected]:<remote_path>
递归将目录复制到服务器:
$ scp -P 22222 -r <local_dir> [email protected]:<remote_dir>
将单个文件从服务器复制到本地客户端:
$ scp -P 22222 [email protected]:<remote_file> <local_path>
递归将目录从服务器复制到本地客户端:
$ scp -P 22222 -r [email protected]:<remote_dir> <local_path>
Wolfssh为端口转发提供了支持。这使用户可以将加密的隧道设置为另一台服务器,SSH客户端在插座上听着,并将该套接字上的连接转发到服务器上的另一个套接字。
要使用端口转发支持编译Wolfssh,请使用--enable-fwd构建选项或定义WOLFSSH_FWD :
$ ./configure --enable-fwd
$ make
有关完整的API使用和实施详细信息,请参阅Wolfssh用户手册。
PortFWD示例工具将创建一个“ Direct-TCPIP”样式通道。这些说明假定您的Openssh的服务器在后台运行,并启用了端口转发。此示例将WolfSSL客户端的端口转发到服务器作为应用程序。它假设所有程序均在不同终端的同一台机器上运行。
src/wolfssl$ ./examples/server/server
src/wolfssh$ ./examples/portfwd/portfwd -p 22 -u <username>
-f 12345 -t 11111
src/wolfssl$ ./examples/client/client -p 12345
默认情况下,WolfSSL Server在端口11111上听着。客户设置为尝试连接到端口12345。portfwd登录以用户为“用户名”,在端口12345上打开侦听器,并在端口11111上连接到服务器。数据包在客户端和服务器之间进行路由。 “你好,狼!”
PortFWD的来源提供了一个示例,介绍了如何设置和使用Wolfssh中的端口转发支持。
Echoserver将处理本地和远程端口转发。使用以下命令行之一与SSH工具连接。您可以从任何地方运行任何SSH命令行:
src/wolfssl$ ./examples/server/server
src/wolfssh$ ./examples/echoserver/echoserver
anywhere 1$ ssh -p 22222 -L 12345:localhost:11111 jill@localhost
anywhere 2$ ssh -p 22222 -R 12345:localhost:11111 jill@localhost
src/wolfssl$ ./examples/client/client -p 12345
这将允许像上一个示例一样在WolfSSL客户端和服务器之间转发端口。
Wolfssh为SFTP版本3提供服务器和客户端支持。这允许用户设置用于管理文件系统的加密连接。
要用SFTP支持编译Wolfssh,请使用--enable-sftp构建选项或定义WOLFSSH_SFTP :
$ ./configure --enable-sftp
$ make
有关完整的API使用和实施详细信息,请参阅Wolfssh用户手册。
创建的SFTP客户端位于目录示例/ sftpclient/中,示例Echoserver充当SFTP服务器。
src/wolfssh$ ./examples/sftpclient/wolfsftp
连接后,可以通过键入“帮助”来查看支持命令的完整列表。
wolfSSH sftp> help
Commands :
cd <string> change directory
chmod <mode> <path> change mode
get <remote file> <local file> pulls file(s) from server
ls list current directory
mkdir <dir name> creates new directory on server
put <local file> <remote file> push file(s) to server
pwd list current path
quit exit
rename <old> <new> renames remote file
reget <remote file> <local file> resume pulling file
reput <remote file> <local file> resume pushing file
<crtl + c> interrupt get/put cmd
连接到另一个系统的一个示例是
src/wolfssh$ ./examples/sftpclient/wolfsftp -p 22 -u user -h 192.168.1.111
Wolfssh的示例Echoserver现在可以为试图登录的用户分叉一个外壳。当前仅在Linux和MacOS上对此进行了测试。文件echoserver.c必须修改以在用户身份验证回调中使用用户的凭据,或者需要更改用户身份验证回调以验证提供的密码。
要与外壳支撑一起编译Wolfssh,请使用--enable-shell构建选项或定义WOLFSSH_SHELL :
$ ./configure --enable-shell
$ make
要尝试此功能,您可以使用示例Echoserver和客户端。在终端中执行以下操作以启动服务器:
$ ./examples/echoserver/echoserver -P <user>:junk
在另一个终端中,请执行以下启动示例客户端:
$ ./examples/client/client -t -u <user> -P junk
请注意, <user>必须是登录的当前用户的用户名。
默认情况下,Echoserver将尝试启动外壳。要使用回声测试行为,请给Echoserver命令行选项-f 。
$ ./examples/echoserver/echoserver -f
将shell功能与wolfsshd添加--enable-sshd到您的配置命令,并使用以下命令:
$ sudo ./apps/wolfsshd/wolfsshd -D -h keys/gretel-key-ecc.pem -p 11111
如果它抱怨一个不好的sshd_config文件,只需将其复制到另一个文件,然后删除其抱怨的有问题的行,并使用-f命令行参数指向新文件。
然后,您可以使用SSH连接到wolfsshd服务器:
$ ssh <user>@localhost -p 11111
请注意, <user>必须是登录的当前用户的用户名。
Wolfssh现在支持Curve25519用于密钥交换。为了启用此支持,只需在支持Wolfssh和Curve25519的支持下编译WolfSSL。
$ cd wolfssl
$ ./configure --enable-wolfssh --enable-curve25519
构建和安装WolfSSL后,您可以简单地配置没有任何选项。
$ cd wolfssh
$ ./configure
Wolfssh客户端和服务器将使用Curve25519自动协商。
$ ./examples/echoserver/echoserver -f
$ ./examples/client/client -u jill -P upthehill
Wolfssh现在支持Quantum后算法ML-DSA(也称为Kyber)。它使用KYBER512参数集,并在P-256 ECC曲线上与ECDHE杂交。
为了使用此密钥交换,您必须在系统上构建和安装WolfSSL。这是有效配置的示例:
$ ./configure --enable-wolfssh --enable-experimental --enable-kyber
之后,只需像往常一样配置和构建Wolfssh:
$ ./configure
$ make all
Wolfssh客户端和服务器将使用与P-256 ECC曲线杂交的Kyber512自动协商。
$ ./examples/echoserver/echoserver -f
$ ./examples/client/client -u jill -P upthehill
在客户端,您将看到以下输出:
服务器说:您好,Wolfssh!
如果您想与OpenQauntumSafe的OpenSSH叉一起查看互操作性,则可以在运行echoserver时构建和执行叉子。从这里下载版本:
https://github.com/open-quantum-safe/openssh/archive/refs/tags/OQS-OpenSSH-snapshot-2021-08.tar.gz
以下内容足以构建和执行:
$ tar xmvf openssh-OQS-OpenSSH-snapshot-2021-08.tar.gz
$ cd openssh-OQS-OpenSSH-snapshot-2021-08/
$ ./configure --with-liboqs-dir=/usr/local
$ make all
$ ./ssh -o"KexAlgorithms=ecdh-nistp256-kyber-512r3-sha256-d00@openquantumsafe.org"
-o"PubkeyAcceptedAlgorithms +ssh-rsa"
-o"HostkeyAlgorithms +ssh-rsa"
jill@localhost -p 22222
注意:提示时,输入“向上挂”的密码。
您可以键入文本行,然后按Enter,该行将回荡。使用CTRL-C终止连接。
沃尔夫斯(Wolfssh)可以在身份验证用户时接受X.509证书代替仅公开键。
要使用X.509支持编译Wolfssh,请使用--enable-certs构建选项或定义WOLFSSH_CERTS :
$ ./configure --enable-certs CPPFLAGS=-DWOLFSSH_NO_FPKI
$ make
在此示例中,我们将FPKI检查禁用为“ FRED”的随附的证书没有所需的FPKI扩展。如果删除了标志wolfssh_no_fpki,则可以看到证书被拒绝。
要提供CA根证书以验证用户的证书,请给Echoserver命令行选项-a 。
$ ./examples/echoserver/echoserver -a ./keys/ca-cert-ecc.pem
Echoserver和客户端有一个名为“ Fred”的假用户,其证书将用于身份验证。
使用示例证书fred-cert.der的示例echoserver / client连接是:
$ ./examples/echoserver/echoserver -a ./keys/ca-cert-ecc.pem -K fred:./keys/fred-cert.der
$ ./examples/client/client -u fred -J ./keys/fred-cert.der -i ./keys/fred-key.der
Wolfssh配备了服务器守护程序和命令线外壳工具。查看应用程序目录以获取更多信息。