如何使用NSS或GnuTLS而不是OpenSSL构建openSSH?

如何使用NSS或GnuTLS而不是OpenSSL构建openSSH?,openssl,openssh,nss,gnutls,libressl,Openssl,Openssh,Nss,Gnutls,Libressl,由于OpenSSL的安全问题,我想改用NSS或GnuTLS。对于Apache服务器需求,这很容易,因为每个服务器都有一个模块。但是对于SSH来说,这看起来很困难,如果不是不可能的话 Dropbear嵌入了自己的算法,不对外开放。OpenSSH已经习惯于使用OpenSSL构建,但几个月后,由于新选项: make OPENSSL=no 但随后软件加密算法被D.J.Bernstein的作品所使用。这很好,但对我来说不是,因为我将使用TPM,因此可以访问pkcs11层。因此,正确的解决方案是使用NSS

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

Dropbear嵌入了自己的算法,不对外开放。OpenSSH已经习惯于使用OpenSSL构建,但几个月后,由于新选项:

make OPENSSL=no
但随后软件加密算法被D.J.Bernstein的作品所使用。这很好,但对我来说不是,因为我将使用TPM,因此可以访问pkcs11层。因此,正确的解决方案是使用NSS或GnuTLS构建OpenSSH

我不能在Linux上等待,也不能使用刚刚发布的OpenBSD并将其作为SSL默认层

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


注意:由于资源有限,我无法将OpenSSL与OpenSSH结合使用,而将NSS与Apache结合使用。我绝对需要最小化嵌入式库。

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

在我的系统上,我可以通过在
makesshd
之后手动运行以下命令来实现这一点:

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
(这是替换
libcrypto.a
的完整路径的
-lcrypto
,并从
make
生成的链接器命令中删除
-pie
标志的结果)

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


显然,如果您只打算在设备上装运
sshd
,这是有意义的。如果您还需要
ssh
,它将变得无用。

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

  • 与提供80%兼容的OpenSSL API一起使用
  • 与its一起使用(我没有检查覆盖范围)
  • 继续使用OpenSSL,并在可用时转到OpenBSD或Google。第一个版本已经在OpenBSD上可用,他们管理着一个面向其他nx发行版的可移植性项目,因此我认为它将在几个月后在Linux上可用。已经完成了大量的工作

  • 谢谢你,萨尔瓦。关键是我想避免使用OpenSSL。我正在研究交付OpenSSL API的GNUTL和NSS包装器。但它们只提供了一个子集。我必须检查它是否足以满足我的需要。我知道这个答案很旧,但你能描述一下你最终选择了哪种解决方案吗?我也面临着同样的问题,我想和你一起去,但我就是不知道该怎么做。不幸的是,我搬家了。但是当你有工作时请发邮件。