Принудительно Chrome отправлять все сертификаты в цепочке во время TLS - PullRequest
0 голосов
/ 06 сентября 2018

Я написал код TLS, который выполняет взаимную аутентификацию на Java, поэтому клиент отправляет свой сертификат после того, как сервер отправит свой сертификат. Я хотел бы проверить все сертификаты в цепочке сертификатов по OCSP, которая поступает со стороны клиента на сторону сервера.

Я написал свою логику цикла, предполагая, что последний сертификат является корневым (CA) сертификатом в цепочке, а не отправлять какой-либо запрос OCSP для него;

        int certificateChainSize= x509Certificates.length;

        // Verifies certificate chain respectively (issuer certificate required).
        CertificateResult response = null;

        try {
            for (int i = 0; i < certificateChainSize-1 ; i++) {
                response = client.verify(x509Certificates[i], x509Certificates[i+1]);
            }
        } catch (OcspException e) {
            e.printStackTrace();
        }

Когда я тестировал TLS и получал перехват Wireshark, я понял, что Google Chrome как клиент отправляет цепочку сертификатов без рута. В следствии; промежуточный сертификат не запрашивается из-за логики цикла, поскольку мой код предполагал, что промежуточный сертификат является корневым.

Как заставить клиента отправлять все узлы цепочки сертификатов?

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Я согласен со Штеффеном, но приведу еще несколько фактов, вот что TLS 1.3 прямо говорит:

Certificate_list: последовательность (цепочка) структур CertificateEntry, каждый из которых содержит один сертификат и набор расширений.

и

Сертификат отправителя ДОЛЖЕН прийти первым CertificateEntry в списке. Каждый следующий сертификат ДОЛЖЕН непосредственно подтвердить тот, который непосредственно предшествует ему. Так как проверка сертификата требует распространения доверенных якорей независимо, сертификат, который определяет якорь доверия, МОЖЕТ быть исключено из цепочки при условии, что поддерживаемые одноранговые узлы известны иметь любые опущенные сертификаты.

и, наконец, о заказе:

Примечание: до TLS 1.3 требовалось заказывать каждый «сертификат_лист» свидетельство, подтверждающее тот, который непосредственно предшествует ему; тем не мение, некоторые реализации допускают некоторую гибкость. Серверы иногда отправить как текущий, так и устаревший промежуточный продукт для переходного цели, а другие просто настроены неправильно, но эти случаи, тем не менее, могут быть подтверждены надлежащим образом. Для максимума совместимость, все реализации должны быть готовы к обработке потенциально посторонние сертификаты и произвольные заказы от любого Версия TLS, за исключением сертификата конечного объекта, который ДОЛЖЕН быть первым.

Таким образом, Chrome правильно применяет эту спецификацию. Вам нужно изменить свой конец, чтобы справиться с этим.

0 голосов
/ 06 сентября 2018

Я понял, что Google Chrome как клиент отправляет цепочку сертификатов без рута.

Это совершенно нормально и единственно правильное поведение.

Корневой сертификат - это якорь доверия, который должен быть локальным для стороны, проверяющей сертификат. Даже если оно отправлено, его следует игнорировать при проверке сертификата, т. Е. Должен использоваться только локальный доверительный якорь - в противном случае посредник может просто предоставить собственную цепочку сертификатов, включая собственный корневой сертификат. Это означает, что в этом случае сервер должен иметь корневой сертификат уже локально, и поэтому клиенту не нужно его отправлять.

Другими словами: не пытайтесь изменить поведение Chrome, а вместо этого скорректируйте свои ожидания (и ваш код) в отношении правильного поведения.

...