«неизвестный ЦС» с самостоятельно созданным центром сертификации, сертификатами и клиент-сервером - PullRequest
0 голосов
/ 01 ноября 2018

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

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

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

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

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

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

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

0 голосов
/ 01 ноября 2018
$ 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

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

$ 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.

...