Я пишу пользовательский клиент и сервер, с которым я хочу безопасно общаться через общедоступный Интернет, поэтому я хочу использовать OpenSSL и сделать так, чтобы оба конца выполняли одноранговую проверку, чтобы убедиться, что мой клиент не был неправильно направлен MITM и также, что неавторизованный клиент не может подключиться к серверу.
Это ошибка, полученная от сервера во время фазы SSL_connect / SSL_accept:
15620:error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca:ssl\record\rec_layer_s3.c:1528:SSL alert number 48
Я работаю под Windows 10, используя OpenSSL 1.1.1. Я использую следующий командный файл для их создания. Я ввожу фразу секретного ключа ca вручную по очевидным причинам.
openssl genrsa -out -des3 ca.key.pem 2048
openssl genrsa -out server.key.pem 2048
openssl genrsa -out client.key.pem 2048
openssl req -x509 -new -nodes -key ca.key.pem -sha256 -days 365 -out ca.cert.pem -subj /C=US/ST=CA/L=Somewhere/O=Someone/CN=Foobar
openssl req -new -sha256 -key server.key.pem -subj /C=US/ST=CA/L=Somewhere/O=Someone/CN=Foobar -out server.csr
openssl x509 -req -in server.csr -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -out server.cert.pem -days 365 -sha256
openssl req -new -sha256 -key client.key.pem -subj /C=US/ST=CA/L=Somewhere/O=Someone/CN=Foobar -out client.csr
openssl x509 -req -in client.csr -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -out client.cert.pem -days 365 -sha256
Намерение заключается в том, чтобы создать самозаверяющий ЦС и затем напрямую подписать ключи клиента и сервера.
ca.key.pem будет храниться в безопасном месте: на зашифрованном томе veracrypt.
И клиент, и сервер используют следующий вызов для включения одноранговой проверки:
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr);
Я вполне уверен, что это проблема с сертификатом, потому что ошибки исчезнут, если я удалю эту строку.