c - 客户端连接时没有服务器证书和 "no shared cipher"

标签 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();

  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;  }

在此之后接受的代码是

 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) ;

我没有使用任何证书或 key 。

当我尝试使用这种方法连接时,我在服务器端没有收到共享密码错误。我认为这是关于密码的一些配置问题。有人能给我指出正确的方向吗?

谢谢

最佳答案

 SSL_CTX_set_cipher_list(ctx, "HIGH:MEDIUM:!eNULL:!aNULL:!RC4");

I am not using any certificates or keys.

由于您既不使用证书也不使用 SRP,因此唯一可能的密码是没有对服务器进行身份验证的地方。但是您确实在客户端和服务器中使用 !aNULL 明确排除了这些密码。这意味着客户端提供的或服务器接受的密码都无法在没有身份验证的情况下工作,这会导致“无共享密码”。来自 ciphers 的文档:

aNULL
the cipher suites offering no authentication. This is currently the anonymous DH algorithms. These cipher suites are vulnerable to a "man in the middle" attack and so their use is normally discouraged.

关于c - 客户端连接时没有服务器证书和 "no shared cipher",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39569183/

相关文章:

客户端通过身份验证时的安全性和 TLS 握手

ruby-on-rails - rails : Is that safe to store data in "session"?

java - Volley SSL - 主机名未验证

c - undefined reference ,gmp 库

c - 没有这样的文件或目录: Cygwin + Gcc

c - GCC 别名在翻译单元之外运行 -AKA- 这甚至是完成这项工作的正确工具吗?

.net - 使用 SSLStream 的客户端/服务器身份验证

java - 在 Java 和 C 上重现相同 HMAC MD5 的问题

php - 应该清理按钮中的 _post 数据吗?

java - org.jolokia.client.exception.J4pException : IO-Error while contacting the server: javax.net.ssl.SSLException:证书中的主机名不匹配