«неизвестный случай» с самостоятельно сгенерированным CA, сертификатами и клиентом / сервером

Я пишу собственный клиент & сервер, с которым я хочу безопасно общаться через общедоступный Интернет, поэтому я хочу использовать 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);

Я вполне уверен, что это проблема с сертификатом, потому что ошибки исчезнут, если я удалю эту строку.

1

Решение

$ openssl req -x509 -new ... -addext basicConstraints=critical,CA:TRUE

По сути, это создает сертификат, который имеет 2 основных противопоказаний CA:TRUE расширения:

$ openssl x509 -in ca.cert.pem -text
X509v3 extensions:
...
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Basic Constraints: critical
CA:TRUE

Попытка использовать CA для проверки сертификата сервера не будет работать:

$ openssl verify -CAfile ca.cert.pem server.cert.pem
C = XX, ST = XX, L = XX, O = XX, CN = CA
error 24 at 1 depth lookup: invalid CA certificate
error server.cert.pem: verification failed

Учитывая, что эта простая проверка не работает, клиент также не сможет проверить сертификат сервера, что приведет к unknown ca предупреждения:

...:tlsv1 alert unknown ca:...

При пропуске -addext он создаст самозаверяющий сертификат в соответствии с документацией, который уже имеет CA:TRUE

$ openssl req -x509 -new ...
...
$ openssl x509 -in ca.cert.pem -text
X509v3 extensions:
...
X509v3 Basic Constraints: critical
CA:TRUE

И используя это для проверки работоспособности сертификата сервера:

$ openssl verify -CAfile ca.cert.pem server.cert.pem
server.cert.pem: OK

Этот сертификат также должен быть успешно подтвержден вашим клиентом, что больше не приведет к unknown ca,

2

Другие решения

Отвечаю на это сам, чтобы помочь кому-либо, кто мог бы приехать сюда в поисках решения этой проблемы. Ответ был найден в другом вопросе SO, но его стоит повторить: общее имя для CA не может совпадать с общим именем для сертификатов клиента и сервера.

Таким образом, изменив четвертую строку командного файла на это:

openssl req -x509 -новые -узлы -key ca.key.pem -sha256 -days 365 -out ca.cert.pem -subj / C = US / ST = CA / L = где-то / O = кто-то / CN = FoobarCA

исправил проблему.

0

По вопросам рекламы [email protected]