我正在编写用于通信的 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/