我想用密码EDH-RSA-DES-CBC3-SHA测试TLS 1.0连接.
我用openssl s_server和s_client测试.工作良好.连接和数据交换都很好.
openssl s_server -accept 4433 -cert server.pem -key serverkey.pem -cipher EDH-RSA-DES-CBC3-SHA -tls1
openssl s_client -connect 127.0.0.1:443 -cipher EDH-RSA-DES-CBC3-SHA -tls1
共享密码:EDH-RSA-DES-CBC3-SHA
现在,我有另一个简单的OpenSSL服务器代码.使用this和s_client连接失败,服务器抛出以下内容:
3077613304:错误:1408A0C1:SSL例程:SSL3_GET_CLIENT_HELLO:无共享密码:s3_srvr.c:1361
我检查s_server/s_client使用的库和我的服务器应用程序使用的库是否相同如下:
cat /proc/9515/maps | awk '{print $6}' | grep '\.so' | sort | uniq | grep -e ssl -e libcrypto
/usr/lib/libcrypto.so.1.0.1e
/usr/lib/libssl.so.1.0.1e
但是,对于像AES128-SHA这样的其他密码,从s_client到我的服务器应用程序的连接也没问题.
以下是我ctx在服务器代码中设置的方式:
SSL_CTX* InitServerCTX(void)
{
SSL_CTX *ctx = NULL;
SSL_library_init();
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
ctx = SSL_CTX_new(TLSv1_server_method());
SSL_CTX_set_cipher_list(ctx,"EDH-RSA-DES-CBC3-SHA"); // Returns 1
SSL_CTX_use_certificate_chain_file(ctx, "server.pem");
SSL_CTX_use_PrivateKey_file(ctx, "serverkey.pem", SSL_FILETYPE_PEM);
return ctx;
}
Run Code Online (Sandbox Code Playgroud)
为什么我的服务器应用程序抛出'No shared cipher'错误,s_server对同一个客户端没问题?
您需要创建一个 DH 对象并设置DHssl 上下文的参数ctx。更具体地说,一旦分配了 DH 对象,就需要设置 primp p 和生成器 g。
一种方法是使用下面的示例伪代码
这里dh512_p dh512_g分别是primo p和generator g
DH* get_dh512(const unsigned char *dh512_p,const unsigned char *dh512_g)
{
DH *dh=NULL;
if ((dh=DH_new()) == NULL) return(NULL);
dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL);
dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL);
if ((dh->p == NULL) || (dh->g == NULL))
return(NULL);
return(dh);
}
Run Code Online (Sandbox Code Playgroud)
然后使用回调在函数中设置参数
//if key exchange is based on diffie hellman
DH *dh = get_dh512(dh512_p,dh512_g)
SSL_CTX_set_tmp_dh(ctx,dh);
SSL_CTX_set_cipher_list(ctx,ciphers);
Run Code Online (Sandbox Code Playgroud)
请查看以下链接以获取回调详细信息 http://linux.die.net/man/3/ssl_ctx_set_tmp_dh
| 归档时间: |
|
| 查看次数: |
1169 次 |
| 最近记录: |