Chinaunix首页 | 论坛 | 博客
  • 博客访问: 315380
  • 博文数量: 66
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 509
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-29 13:56
文章分类
文章存档

2018年(2)

2017年(6)

2016年(34)

2015年(24)

我的朋友

分类: 嵌入式

2016-11-23 10:41:32


在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) |
给主人留下些什么吧!~~