Я пишу код для проверки JWS из Google Safet yNet API, в Node.JS. Я был удивлен, что не нашел легкодоступного модуля для этого, поэтому я начал смотреть на простую проверку JWS с использованием доступных библиотек:
Прежде всего, Google говорит, что это необходимые шаги:
- Извлечение цепочки сертификатов SSL из сообщения JWS.
- Проверка цепочки сертификатов SSL и использование сопоставления имени хоста SSL для проверки того, что листовой сертификат был выдан для свидетельства имени хоста. android .com.
- Используйте сертификат для проверки подписи сообщения JWS.
- Проверьте данные сообщения JWS и убедитесь, что они совпадают с данными в исходном запросе. В частности, убедитесь, что отметка времени была проверена и что одноразовые номера, имя пакета и хэши сертификатов подписи приложения соответствуют ожидаемым значениям.
(из https://developer.android.com/training/safetynet/attestation#verify -attestation-response )
Я обнаружил node-jose , который предлагал простой интерфейс для проверки JWS, и у него была возможность разрешить встроенный ключ. Я пытаюсь точно понять, что делает этот процесс, и достаточно ли этого для проверки подлинности JWS?
const {JWS} = require('node-jose');
const result = await JWS.createVerify({allowEmbeddedKey: true}).verify(jws);
if (result.key.kid === 'attest.android.com') {
// Are we good to go or do we manually need to verify the certificate chain further?
}
Действительно ли использование встроенного ключа проверяет цепочку встроенных сертификатов x5c
с использованием root CA, а подпись под сертификатом? Или мне нужно явно получить ключ publi c от Google, чтобы проверить сертификат отдельно?
Затем, несколько связанный вопрос касается API Google для выполнения этой проверки: существует API https://www.googleapis.com/androidcheck/v1/attestations/verify?key=...
, который выполняет эту точную операцию, но, похоже, он был удален из документов Google и может быть найден только по ссылке. в устаревших статьях и SO-ответах о Safet yNet, таких как , этот , который, по-видимому, предполагает, что этот API предназначен только для тестирования, а в процессе производства следует выполнить проверку сертификата самостоятельно. Кто-нибудь знает, хорош ли этот API для производственного использования или нет? Если все хотят вручную проверить JWS, я нахожу несколько удивительным, что Google не предлагает больше документации и примеров кода, поскольку этот процесс довольно подвержен ошибкам, и ошибки могут иметь серьезные последствия? До сих пор я нашел только некоторые сторонние примеры в Java, но нет примеров серверного кода от Google.