在ssh6.0p1配置sshd的配置文件,设置Ciphers的时候,
Ciphers ,,chacha20-poly1305@openssh.com,aes128-ctr,aes256-ctr
提示如下错误,
/etc/ssh/sshd_config line 23: Bad SSH2 cipher spec 'aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes128-ctr,aes256-ctr'.
1. 于是把openssh升级到sshd6.7p1, 下载了开源的openssh压缩包(openssh官网下载:),并编译(zlib, openssl没变),生成了sshd运行,还是提示同样的错误。
查看openssh的源码,发现sshd在启动的时候,会读取配置文件sshd_config内容,然后和代码里面的数组ciphers(文件cipher.c)比较, 如果sshd_config里面
配置的cipher内容没有在数组ciphers里面配置,则会抱怨Bad SSH2 cipher spec.
而ciphers数组定义如下:
static const struct sshcipher ciphers[] = {
#ifdef WITH_OPENSSL,
{ "rijndael-cbc@lysator.liu.se",
SSH_CIPHER_SSH2, 16, 32, 0, 0, 0, 1, EVP_aes_256_cbc },
{ "aes128-ctr", SSH_CIPHER_SSH2, 16, 16, 0, 0, 0, 0, EVP_aes_128_ctr },
{ "aes192-ctr", SSH_CIPHER_SSH2, 16, 24, 0, 0, 0, 0, EVP_aes_192_ctr },
{ "aes256-ctr", SSH_CIPHER_SSH2, 16, 32, 0, 0, 0, 0, EVP_aes_256_ctr },
# ifdef OPENSSL_HAVE_EVPGCM
{ "aes128-gcm@openssh.com",
SSH_CIPHER_SSH2, 16, 16, 12, 16, 0, 0, EVP_aes_128_gcm },
{ "aes256-gcm@openssh.com",
SSH_CIPHER_SSH2, 16, 32, 12, 16, 0, 0, EVP_aes_256_gcm },
# endif /* OPENSSL_HAVE_EVPGCM */
#else /* WITH_OPENSSL */
{ "aes128-ctr", SSH_CIPHER_SSH2, 16, 16, 0, 0, 0, CFLAG_AESCTR, NULL },
{ "aes192-ctr", SSH_CIPHER_SSH2, 16, 24, 0, 0, 0, CFLAG_AESCTR, NULL },
{ "aes256-ctr", SSH_CIPHER_SSH2, 16, 32, 0, 0, 0, CFLAG_AESCTR, NULL },
{ "none", SSH_CIPHER_NONE, 8, 0, 0, 0, 0, CFLAG_NONE, NULL },
#endif /* WITH_OPENSSL */
{ "chacha20-poly1305@openssh.com",
SSH_CIPHER_SSH2, 8, 64, 0, 16, 0, CFLAG_CHACHAPOLY, NULL },
{ NULL, SSH_CIPHER_INVALID, 0, 0, 0, 0, 0, 0, NULL }
};
可以看到要支持aes128-gcm@openssh.com,aes256-gcm@openssh.com, 必须打开宏OPENSSL_HAVE_EVPGCM
所以问题变成了,这个宏是关闭的,如何打开这个宏,从openssh6.0p1到openssh6.7p1, openssh已经很新了,网上很多通过openssh6.7p1成功支持了cipher aes128-gcm@openssh.com,aes256-gcm@openssh.com. 所以openssh源码应该没有问题。
在openssh源码目录下面 grep OPENSSL_HAVE_EVPGCM , 发现这个宏在config.h里面是undef的,并有注释
/* libcrypto has EVP AES GCM */
#undef OPENSSL_HAVE_EVPGCM
正式这个注释提示了我, 由于libcrypto是通过编译openssl生成的,所以推测,要支持这个cipher, 需要更新openssl版本。
当前用的openSSL是1.0.0j, 于是下载了openssl源码(openssl官方下载:),编译生成了库文件,
test@ubuntu:~/sshd/openssl-1.0.2j$ ls -l lib*
-rw-rw-r-- 1 test test 2525522 Nov 22 15:10 libcrypto.a
-rw-rw-r-- 1 test test 297 Nov 22 15:10 libcrypto.pc
lrwxrwxrwx 1 test test 18 Nov 22 15:12 libcrypto.so -> libcrypto.so.1.0.0
-rwxrwxr-x 1 test test 1527136 Nov 22 15:12 libcrypto.so.1.0.0
-rw-rw-r-- 1 test test 437810 Nov 22 15:11 libssl.a
-rw-rw-r-- 1 test test 298 Nov 22 15:10 libssl.pc
lrwxrwxrwx 1 test test 15 Nov 22 15:12 libssl.so -> libssl.so.1.0.0
-rwxrwxr-x 1 test test 325958 Nov 22 15:12 libssl.so.1.0.0
我们使用的是动态链接库,也可以使用静态库。
于是重新configure openssh, make, 生成了sshd.
此时在查看OPENSSL_HAVE_EVPGCM是否打开,
在openssh源码目录下面 grep OPENSSL_HAVE_EVPGCM , 发现这个宏在config.h里面已经变成了define,
config.h:#define OPENSSL_HAVE_EVPGCM 1
把openssl, sshd上传到ARM板卡,发现sshd可以正常启动,没有报错Bad SSH2 Cipher spec, 问题解决了。
这次移植过程中,没有改变zlib,因为不需要更新。
支持cipher aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com, 则需要更新openssh 和openssl.
openssh6.0p1和openssl 1.0.0j 不支持,升级到了openssh6.7p1和openssl 1.0.2j
阅读(21107) | 评论(0) | 转发(0) |