【问题标题】:How to build openSSH with NSS or GnuTLS instead of OpenSSL?如何使用 NSS 或 GnuTLS 而不是 OpenSSL 构建 openSSH?
【发布时间】:2014-12-11 14:06:50
【问题描述】:

由于 OpenSSL 的安全问题,我想改用 NSS 或 GnuTLS。对于 Apache 服务器的需求,这很容易,因为每个模块都有一个模块。但是对于 SSH 来说,即使不是不可能,也很难。

Dropbear 嵌入了自己的算法,不对外开放。 OpenSSH 曾经使用 OpenSSL 构建,但几个月后,it is possible to build it without it 感谢新选项:

make OPENSSL=no

但是随后使用了 D. J. Bernstein 作品中的软件加密算法。这很好,但不适合我,因为我将使用 TPM,因此可以访问 pkcs11 层。因此,正确的解决方案是使用 NSS 或 GnuTLS 构建 OpenSSH。

我不能等待 Linux 上的LibReSSL,也不能使用刚刚发布并使其成为 SSL 默认层的 OpenBSD。

所以我的问题是:是否有人尝试并设法使用 NSS 或 GnuTLS 而不是 OpenSSL 构建 OpenSSH,或者修补 Dropbear 或任何其他解决方案以使 SSH 服务器与 TPM 和 EC 身份验证一起使用?

注意:由于我的资源有限,我不能将 OpenSSL 与 OpenSSH 和 NSS 与 Apache 一起使用。我绝对需要最小化嵌入式库。

【问题讨论】:

    标签: openssl openssh nss gnutls libressl


    【解决方案1】:

    没有。但是您可以通过将 libcrypto(OpenSSH 实际使用的 OpenSSL 的一部分)静态链接到 sshd 来减少与 OpenSSL 相关的磁盘使用量的增加。

    在我的系统上,我可以通过在make sshd 之后手动运行以下命令来做到这一点:

    gcc -o sshd sshd.o auth-rhosts.o auth-passwd.o auth-rsa.o auth-rh-rsa.o audit.o \
      audit-bsm.o audit-linux.o platform.o sshpty.o sshlogin.o servconf.o serverloop.o \
      auth.o auth1.o auth2.o auth-options.o session.o auth-chall.o auth2-chall.o \
      groupaccess.o auth-skey.o auth-bsdauth.o auth2-hostbased.o auth2-kbdint.o \
      auth2-none.o auth2-passwd.o auth2-pubkey.o monitor_mm.o monitor.o monitor_wrap.o \
      kexdhs.o kexgexs.o kexecdhs.o kexc25519s.o auth-krb5.o auth2-gss.o gss-serv.o \
      gss-serv-krb5.o loginrec.o auth-pam.o auth-shadow.o auth-sia.o md5crypt.o \
      sftp-server.o sftp-common.o roaming_common.o roaming_serv.o sandbox-null.o \
      sandbox-rlimit.o sandbox-systrace.o sandbox-darwin.o sandbox-seccomp-filter.o \
      sandbox-capsicum.o -L. -Lopenbsd-compat/  -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack \
      -fstack-protector-strong  -lssh -lopenbsd-compat \
      /usr/lib/x86_64-linux-gnu/libcrypto.a -ldl -lutil -lz -lnsl  -lcrypt -lresolv
    

    (这是将-lcrypto 替换为libcrypto.a 的完整路径并从make 生成的链接器命令中删除-pie 标志的结果。

    然后,在 sshd 上运行 strip 会将其大小减少到大约 2MB。

    如果您只打算在设备上发送sshd,这显然是有道理的。如果你还需要ssh,那就没用了。

    【讨论】:

    • 谢谢萨尔瓦。关键是我想避免使用 OpenSSL 的东西。我正在研究提供 OpenSSL API 的 GnuTLS 和 NSS 包装器。但它们只提供一个子集。我必须检查它是否足以满足我的需求。
    【解决方案2】:

    我已经确定了三个解决方案:

    1. NSSNss compat ossl 结合使用,提供80% 兼容的OpenSSL API。
    2. 使用GnuTLS 和它的OpenSSL compatibility layer(我没有检查覆盖范围)。
    3. 继续使用 OpenSSL 并转到 OpenBSD 的 LibReSSL 或 Google 的 BoringSSL(如果可用)。第一个已经在 OpenBSD 上可用,他们管理着一个针对其他 nx 发行版的可移植性项目,所以我认为它会在几个月后在 Linux 上可用。非常棒的cleaning and improvements 已经执行完毕。

    【讨论】:

    • 我知道这个答案很旧,但你能描述一下你最终选择了哪个解决方案吗?我面临同样的问题,我想选择 2),但我不知道怎么做。
    • 不幸的是,我搬家了。但是,请在您有工作时发布。
    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2011-06-11
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    相关资源
    最近更新 更多