Я пытаюсь научиться использовать библиотеку OpenSSL (всего newb), и у меня возникают проблемы с выяснением того, как подключить клиента к серверу с правильным сертификатом и потерпеть неудачу, если сертификат неверен. Мой вариант использования — создание p2p-приложения без центрального ЦС, поэтому я не могу полагаться на сертификат ЦС. В частности, у сервера, как обычно, есть сертификат/ключ, и клиент определит сертификат сервера, попросив другие узлы p2p проголосовать.
У меня два конкретных вопроса:
- В приведенных ниже фрагментах кода я ожидаю, что клиент не подключится, если я закомментирую выбор ниже «список шифров». Он все еще работает! Я что-то упускаю, да?
- Есть ли способ просто заставить клиента использовать сертификат сервера и достаточно ли этого для открытия соединения? Т.е. нет ключа, нет CA?
клиент:
ctx = SSL_CTX_new(DTLSv1_client_method());
SSL_CTX_set_cipher_list(ctx, "HIGH:!DSS:!aNULL@STRENGTH");
// If I comment out below stuff, client still connects happily!?
if (!SSL_CTX_use_certificate_file(ctx, "certs/server-cert.pem", SSL_FILETYPE_PEM))
printf("\nERROR: no certificate found!");
if (!SSL_CTX_use_PrivateKey_file(ctx, "certs/server-key.pem", SSL_FILETYPE_PEM))
printf("\nERROR: no private key found!");
if (!SSL_CTX_check_private_key (ctx))
printf("\nERROR: invalid private key!");
сервер:
SSL_CTX_set_cipher_list(ctx, "HIGH:!DSS:!aNULL@STRENGTH"); // high strength ciphers
SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
if (!SSL_CTX_use_certificate_file(ctx, "certs/server-cert.pem", SSL_FILETYPE_PEM))
printf("\nERROR: no certificate found!");
if (!SSL_CTX_use_PrivateKey_file(ctx, "certs/server-key.pem", SSL_FILETYPE_PEM))
printf("\nERROR: no private key found!");
if (!SSL_CTX_check_private_key (ctx))
printf("\nERROR: invalid private key!");
Мой код находится по адресу https://github.com/a34729t/exp/tree/master/tun2udp/dtls; он построен на примерах DTLS Робина Сеггельмана. В частности, я работаю с server3_oo.c.