为 OS X 构建 OpenSSH?

为 OS X 构建 OpenSSH?

我有一台用于测试的 OS X 10.5 PowerMac (PowerPC)。Apple 已放弃对它的支持。其他人想要访问该机器进行测试,因此我需要构建并安装更新的 OpenSSH。

我访问了 openssh.com 并通过 FTP 获取了最新版本 (7.1)。链接在左侧边栏。主页上没有下载链接;你得费劲去找。

不幸的是,OpenSSH 似乎缺少有关该过程的文档。configure(所以没有configure --help),没有安装,并且没有关于它的主题OpenSSH 常见问题解答

有一个自述这让我http://www.openssh.com/portable.html。不幸的是,它没有提供构建说明。有趣的是,它确实谈到了configureautoreconf不是存在于 tarball 中。

我需要使用更新版本的 OpenSSL。OpenSSL 1.0.2d 已在 中构建并安装/usr/local。我还需要确保 OpenSSH 静态链接到备用 OpenSSL,这样它就不会使用 Apple 提供的低级版本的 OpenSSL 0.9.8。

如何在 OS X 上使用更新的 OpenSSL 构建 OpenSSH?在哪里可以找到说明?

答案1

如何在 OS X 上使用更新的 OpenSSL 构建 OpenSSH?在哪里可以找到说明?

Grawity 是正确的 - 我下载了错误的 OpenSSH。我需要一个便携式的,而不是 FTP 链接提供的那个。便携式的列在便携式 OpenSSH

获得便携式版本后,解压并执行以下操作。以下假设您已libcrypto在 安装了更新的 OpenSSL,并在/usr/local/ssl/darwin安装了更新的 Zlib 。调整它们以适合您的喜好。libz/usr/local

将 -lz 替换为档案的绝对路径

这是为了确保静态链接所必需的,因为在 中没有明显的选项configure。构建二进制文件时,otool -L将显示没有外部 Zlib 依赖项。

$ grep "\-lz" *
configure:{ echo "$as_me:$LINENO: checking for deflate in -lz" >&5
configure:echo $ECHO_N "checking for deflate in -lz... $ECHO_C" >&6; }
configure:LIBS="-lz  $LIBS"
configure:  LIBS="-lz $LIBS"
configure:      LIBS="$LIBS -lz"
configure.ac:       LIBS="$LIBS -lz"

然后:

$ sed -i "" 's|-lz|/usr/local/lib/libz.a|g' config.h.in configure configure.ac
$

将 -lcrypto 替换为档案的绝对路径

这是为了确保静态链接所必需的,因为 中没有明显的选项configure。构建二进制文件时,otool -L将显示没有外部 OpenSSL 依赖项。

$ grep "\-lcrypto" *
configure:  LIBS="-lcrypto $LIBS"
configure.ac:   LIBS="-lcrypto $LIBS"

然后:

$ sed -i "" 's|-lcrypto|/usr/local/ssl/darwin/lib/libcrypto.a|g' configure configure.ac
$

在上面,我在构建 OpenSSL 库时使用了/usr/local/ssl/darwinas 。通常只是。根据需要进行调整。--openssldir/usr/local/ssl

配置 OpenSSH

使用所需路径配置 OpenSSH。您可能还需要包含 OS X 库。

如果find /usr/lib/ -name libsandbox*返回libsandbox.dylib,则需要包含--with-libs="-lsandbox。OS X 10.5 上缺少 ,但 OS X 10.8 上有 。如果库存在但--with-libs被省略,则会导致类似于riemann.local sshd[15748]: fatal: ssh_sandbox_child: sandbox_init: dlopen(/usr/lib/libsandbox.1.dylib, 261): image not found [preauth]

$ ./configure --without-ssh1 --with-ssl-dir=/usr/local/ssl/darwin --with-zlib=/usr/local \
  --with-libs="-lsandbox" --prefix=/usr/local
checking for gcc... gcc
checking for C compiler default output file name... a.out
...

OpenSSH has been configured with the following options:
                     User binaries: /usr/local/bin
                   System binaries: /usr/local/sbin
               Configuration files: /usr/local/etc
...

Host: x86_64-apple-darwin12.6.0
Compiler: gcc
Compiler flags: -g -O2 -Qunused-arguments -Wunknown-warning-option -Wall -Wpointer-arith 
    -Wuninitialized -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess
    -Wno-pointer-sign -Wno-unused-result -fno-strict-aliasing -D_FORTIFY_SOURCE=2
    -ftrapv -fno-builtin-memset -fstack-protector-all -fPIE 
Preprocessor flags: -I/usr/local/ssl/darwin/include -I/usr/local/include 
Linker flags: -L/usr/local/ssl/darwin/lib -L/usr/local/lib  -fstack-protector-all -pie
Libraries: /usr/local/ssl/darwin/lib/libcrypto.a /usr/local/lib/libz.a -lsandbox -lresolv

您可能需要--with-pam让密码验证正常工作。我不关心该功能,因此没有添加配置选项。

构建并安装 OpenSSH

在高完整性软件中出现这种情况时,这-fwrapv有点令人不安。这通常意味着存在具有未定义行为的非法 C 程序正在进行中。开发人员还没有修复它,所以他们使用-fwrapv作为创可贴

$ make
conffile=`echo sshd_config.out | sed 's/.out$//'`; \
...

gcc -g -O2 -Qunused-arguments -Wunknown-warning-option -Wall -Wpointer-arith -Wuninitialized
  -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign
  -Wno-unused-result -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -ftrapv -fno-builtin-memset
  -fstack-protector-all -fPIE  -I. -I.. -I. -I./.. -I/usr/local/ssl/darwin/include
-I/usr/local/include  -DHAVE_CONFIG_H -c arc4random.c
gcc -g -O2 -Qunused-arguments -Wunknown-warning-option -Wall -Wpointer-arith -Wuninitialized
  -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign
  -Wno-unused-result -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -ftrapv -fno-builtin-memset
  -fstack-protector-all -fPIE  -I. -I.. -I. -I./.. -I/usr/local/ssl/darwin/include
  -I/usr/local/include  -DHAVE_CONFIG_H -c bsd-asprintf.c
...

可以使用以下方法验证外部依赖性(或缺乏依赖性):

$ otool -L ./sshd 
./sshd:
    /usr/lib/libsandbox.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

不幸的是,没有make checkmake test目标,因此在安装之前没有明显的方法来测试软件。

$ sudo make install
...

Generating public/private ed25519 key pair.
Your identification has been saved in /usr/local/etc/ssh_host_ed25519_key.
Your public key has been saved in /usr/local/etc/ssh_host_ed25519_key.pub.
The key fingerprint is:
SHA256:u/xQ6haFqxjG0fBgSMt0W58N8zmhu+NmyQxNMkMcwPc [email protected]
The key's randomart image is:
+--[ED25519 256]--+
| .ooooo.o .      |
| o.o=o+. B o     |
|  o..B .+.=      |
|    . * E...     |
|   . . *So.      |
|    + . +=       |
|   . o =*o       |
|    . .+B+       |
|       +=..      |
+----[SHA256]-----+
...

为新的 SSH 二进制文件创建 Plist

以下使用现有的ssh.plist,删除 Apple 包装器脚本,并更改​​端口号。将其复制到/System/Library/LaunchDaemons/ssh-7.1.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <true/>
    <key>Label</key>
    <string>com.openssh.sshd.7-1</string>
    <key>Program</key>
    <string>/usr/local/sbin/sshd</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/sbin/sshd</string>
        <string>-i</string>
        <string>-e</string>
        <string>-f</string>
        <string>/usr/local/etc/sshd_config</string>
        <string>-o</string>
        <string>PidFile=/var/run/sshd-7.1.pid</string>
    </array>
    <key>Sockets</key>
    <dict>
            <key>Listeners</key>
            <dict>
                    <key>SockServiceName</key>
                    <string>1522</string>
            </dict>
    </dict>
    <key>inetdCompatibility</key>
    <dict>
        <key>Wait</key>
        <false/>
    </dict>
    <key>StandardErrorPath</key>
    <string>/var/log/sshd-7.1.log</string>
    <key>SHAuthorizationRight</key>
    <string>system.preferences</string>
</dict>
</plist>

plist 中发生了一些事情:

  • 服务标签已更改为com.openssh.sshd.7-1避免与 Apple 的com.openssh.sshd
  • PID 文件被更改为var/run/sshd-7.1.pid避免与 Apple 的var/run/sshd.pid
  • 由于ProgramArgumentssshd re-exec requires execution with an absolute path在服务客户端连接时
  • sshd_config被特别提及以避免开放式问题和混淆。但它被默认使用
  • 使用 -i选项,即使它是一个inetd(8)选项。根据OS X 上的 sshd 和 -i 选项,应该使用

启动新的 SSH 服务

使用 launchd 启动服务。注意使用-w以避免“未找到任何可加载的内容”由于服务被禁用,因此出现错误消息。

$ sudo launchctl load -w /System/Library/LaunchDaemons/ssh-7.1.plist

最后,验证新的 SSH 服务器是否正在运行:

$ netstat -an | grep 1522
tcp6       0      0  *.1522                 *.*                    LISTEN     
tcp4       0      0  *.1522                 *.*                    LISTEN  

答案2

我访问了 openssh.com 并通过 FTP 获取了最新版本 (7.1)。

正如名称所示,“对于 OpenBSD:FTP / HTTP”下的链接是,仅适用于 OpenBSD. 它需要使用 OpenBSD“Ports”工具来构建。

由于您运行的是 OS X,而不是 OpenBSD,因此您必须从“其他操作系统 → 其他…”下载它。(向下滚动到“下载”部分。)官方的 OpenSSH 可移植版本7.1p1tarball 中肯定包含configure脚本和INSTALL文档。

静态链接不是必需的;OS X 二进制文件依赖于绝对路径上的库。(我认为这甚至可能是默认的?)

主页上没有下载链接;你得自己去寻找。

我同意这个网站有点停留在 1990 年代,但我不会说点击两次而不是一次算翻找...如果它有一个下载页面,它只会包含相同的操作系统链接,已经在侧边栏,不是吗?

我在哪里可以找到该说明?

看看 Homebrew,尤其是它的openssh 公式。 还:

相关内容