Имейте простой сервер и клиент, использующий openssl. Прикладная программа написана на C++ и использует исходный код openssl-1.1.0g, который я создал сам. Простой случай, когда я предоставляю сертификаты клиента и сервера и закрытые ключи, работает нормально. Рукопожатие происходит нормально, и передача данных тоже отлично работает. Теперь у меня есть еще два требования:
Необходимо отключить аутентификацию клиента на сервере. у клиента будет сертификат CA, но не будет закрытого ключа. Клиент выполнит аутентификацию сервера.
Не знаю, как сказать openssl api не запрашивать сертификат клиента
[Обновлять] Это исправлено. В файле conf в разделе клиента попытался использовать ключевое слово VerifyCAFile для сертификата CA и удалил PrivateKey. Успешное рукопожатие без изменения кода.
Отключите аутентификацию клиента и сервера. У обеих сторон нет сертификата или закрытых ключей.
Пытался использовать раздел anon в файле conf, для которого не указан сертификат или ключ. Также установите для строки шифра значение NULL в этом разделе файла conf. aNULL - это список всех анонимных шифров согласно странице здесь:
https://www.openssl.org/docs/man1.1.0/apps/ciphers.html
Но это не работает.
Вот установка -
Сервер:
SSL_CTX_new(TLS_server_method()) - create server ctx
CONF_modules_load_file - load conf file
SSL_CTX_config - get section for server
BIO_new_socket((int)socket, BIO_CLOSE) - create socket BIO
SSL_new(ctx) - create ssl
SSL_set_bio - set bio in ssl
SSL_set_accept_state(_ssl); - set accept for server
SSL_do_handshake - do handshake
Клиент:
SSL_CTX_new(TLS_client_method()) - create server ctx
CONF_modules_load_file - load conf file
SSL_CTX_config - get section for client
BIO_new_socket((int)socket, BIO_CLOSE) - create socket BIO
SSL_new(ctx) - create ssl
SSL_set_bio - set bio in ssl
SSL_set_connect_state(ssl) - set connect for client
SSL_do_handshake - do handshake
Файл конфигурации:
testApp = test_sect
[test_sect]
# list of configuration modules
ssl_conf = ssl_sect
[ssl_sect]
server = server_section
client = client_section
anon = anon_section
[server_section]
CipherString = DEFAULT
Certificate = <path to server.cer>
PrivateKey = <path to server.key>
[client_section]
CipherString = DEFAULT
Certificate = <path to client.cer>
PrivateKey = <path to client.key>
[anon_section]
CipherString = aNULL





На сервере вам нужно что-то вроде:
SSL_set_verify(ssl, SSL_VERIFY_NONE, NULL);
Однако я думал, что это значение по умолчанию.
Пробовал этот SSL_set_verify (_ssl, SSL_VERIFY_NONE, NULL); SSL_verify_cb кажется указателем
Простите. SSL-set_verify - правильный вызов. Фиксированный. Следует сделать до рукопожатия.
Как вы и подозревали, SSL_VERIFY_NONE по умолчанию. Первоначальная проблема с моим файлом conf заключалась в том, что отсутствовали VerifyCAFile и VerifyMode. Как только я указал VerifyCAFile и установил для VerifyMode значение Peer на стороне клиента, первое требование было выполнено. Остается только одна проблема - как удалить VerifyCAFile, Certificate и PrivateKey как с клиента, так и с сервера и при этом добиться успешного установления связи. Любые предложения приветствуются. Спасибо за ваши предложения ..
Проверить это