C 没有服务器证书和;“无共享密码”;当客户端连接时
我正在编写用于通信的SSL服务器和客户端。我有以下服务器代码C 没有服务器证书和;“无共享密码”;当客户端连接时,c,security,ssl,openssl,tls1.2,C,Security,Ssl,Openssl,Tls1.2,我正在编写用于通信的SSL服务器和客户端。我有以下服务器代码 SSL_CTX* InitServerCTX(void) { SSL_METHOD *method; SSL_CTX *ctx; SSL_library_init(); OpenSSL_add_all_algorithms(); /* load & register all cryptos, etc. */ SSL_load_error_strings(); ER
SSL_CTX* InitServerCTX(void)
{
SSL_METHOD *method;
SSL_CTX *ctx;
SSL_library_init();
OpenSSL_add_all_algorithms(); /* load & register all cryptos, etc. */
SSL_load_error_strings();
ERR_load_crypto_strings();
OpenSSL_add_all_ciphers();
ctx = SSL_CTX_new(SSLv23_server_method()); /* Create new context */
if ( ctx == NULL )
{
ERR_print_errors_fp(stderr);
abort();
}
SSL_CTX_set_cipher_list(ctx, "HIGH:MEDIUM:!eNULL:!aNULL:!RC4");
return ctx; }
在此之后,accept的代码为
int client = accept(server, (sockaddr*)&addr, &len); /* accept connection as usual */
printf("Connection: %s:%d\n",
inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
ssl = SSL_new(ctx); /* get new SSL state with context */
SSL_set_fd(ssl, client);
int ret = SSL_accept(ssl);
这是客户端代码
SSL_CTX* InitCTX(void)
{
SSL_METHOD *method;
SSL_CTX *ctx;
SSL_library_init();
OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */
SSL_load_error_strings(); /* Bring in and register error messages */
ctx = SSL_CTX_new(SSLv23_client_method()); /* Create new context */
if ( ctx == NULL )
{
ERR_print_errors_fp(stderr);
abort();
}
SSL_CTX_set_cipher_list(ctx, "HIGH:MEDIUM:!eNULL:!aNULL:!RC4");
return ctx;
}
用于连接它是
ssl = SSL_new(ctx); /* create new SSL connection state */
SSL_set_fd(ssl, server); /* attach the socket descriptor */
int ret = SSL_connect(ssl) ;
我没有使用任何证书或密钥
当我尝试使用这种方法连接时,服务器端没有收到任何共享密码错误。我认为这是关于密码的一些配置问题。谁能给我指一下正确的方向吗
谢谢
我没有使用任何证书或密钥
由于您既不使用证书也不使用SRP,因此唯一可能的密码是不进行服务器身份验证的密码。但您确实使用明确排除了这些密码!A客户端和服务器中的所有
。这意味着客户端提供的或服务器接受的密码都不能在没有身份验证的情况下工作,这将导致“没有共享密码”。根据以下文件:
aNULL密码套件不提供身份验证。这是目前的趋势 匿名DH算法。这些密码套件容易受到“人在里面”的攻击 中间的“攻击”,因此通常不鼓励使用它们。 我没有使用任何证书或密钥 由于您既不使用证书也不使用SRP,因此唯一可能的密码是不进行服务器身份验证的密码。但您确实使用
明确排除了这些密码!A客户端和服务器中的所有
。这意味着客户端提供的或服务器接受的密码都不能在没有身份验证的情况下工作,这将导致“没有共享密码”。根据以下文件:
aNULL密码套件不提供身份验证。这是目前的趋势 匿名DH算法。这些密码套件容易受到“人在里面”的攻击 中间的“攻击”,因此通常不鼓励使用它们。
为了扩展这一点,openssl不会对许多错误的配置出错。当您的证书/密码列表/密码特定配置不匹配时,您将获得“无共享密码”。如果您只是在进行一些快速测试,然后制作一些证书,然后将它们传递到
SSL\u CTX\u use\u certificate\u chain\u文件
,SSL\u CTX\u使用私钥\u文件
和SSL\u CTX\u加载\u验证\u位置
因此,如果我允许所有密码,但不指定上面的行..它允许我连接吗?@kunal:如果您允许所有密码或仅允许客户端和服务器中的所有密码,它可能会工作,或者至少不会导致此错误(未仔细查看代码的其余部分)但是要小心,这是高度不安全的,即中间人攻击是很容易的,除非你添加某种适当的服务器认证。你需要通过在代码前删除<代码> <代码> > AULUL/<代码>密码组来具体地启用它们,因为这些密码在默认情况下被禁用。用于内部测试的证书,或使用预共享密钥密码。@SteffenUllrich我只想测试支持的最高协议的会话协商,而不使用任何版本特定的方法。.一旦我能够建立密码,我将更新代码以保护密码。要扩展此功能,openssl不会因为许多错误配置而出错。您将当您的证书/密码列表/密码特定配置不匹配时,请不要使用“无共享密码”。如果您只是在做一些快速测试,然后制作一些证书,然后将它们传递到SSL\u CTX\u use\u certificate\u chain\u file
,SSL\u CTX\u use\u PrivateKey\u file
和SSL\u CTX\u load\u验证\u位置
,因此如果我允许所有ciphers,不指定上面的行。它允许我连接吗?@kunal:如果你允许客户端和服务器中的所有密码或只允许一个all,它可能会工作,或者至少不会导致此错误(没有仔细查看代码的其余部分)但是要小心,这是高度不安全的,即中间人攻击是很容易的,除非你添加某种适当的服务器认证。你需要通过在代码前删除<代码> <代码> > AULUL/<代码>密码组来具体地启用它们,因为这些密码在默认情况下被禁用。证书用于内部测试,或使用预共享密钥密码。@SteffenUllrich我只想测试支持的最高协议的会话协商,而不使用任何版本特定的方法。.一旦我能够建立密码,我将更新代码以保护密码。通常,在这种情况下(无服务器身份验证),您使用匿名Diffie Hellman(ADH)或EC Anonymous Diffie Hellman(ECADH)。您应该从客户端和服务器上的密码套件列表中删除!aNULL
。某些用户代理(如浏览器)将不接受它。相关主题为。它用于MTA和邮件服务器等用例,并且可能适用于您的用例。通常,在本用例中(无服务器身份验证),使用匿名Diffie-Hellman(ADH)或EC匿名Diffie-Hellman(ECADH)。您应该从客户端和服务器的密码套件列表中删除!aNULL
。某些用户代理(如浏览器)将不接受该密码套件。相关主题为。它用于MTA和邮件服务器等用例,可能适用于您的用例。
SSL_CTX_set_cipher_list(ctx, "HIGH:MEDIUM:!eNULL:!aNULL:!RC4");