Как я могу закрепить открытый ключ во Flutter?

Я хочу закрепить открытый ключ моего сервера, чтобы любой запрос, сделанный к серверу, должен был иметь этот открытый ключ (это сделано для предотвращения прокси, таких как Чарльз, обнюхивать данные).

Я проделал нечто подобное в Android с помощью Volley.

Как я могу сделать то же самое с Flutter?


person Harsh Bhikadia    schedule 16.02.2019    source источник
comment
Я нашел это раньше. Я хочу закрепить открытый ключ, а не сертификат.   -  person Harsh Bhikadia    schedule 17.02.2019


Ответы (2)


Создайте своего клиента с SecurityContext без доверенных корней, чтобы принудительно выполнить обратный вызов неверного сертификата, даже для хорошего сертификата.

SecurityContext(withTrustedRoots: false);

В обратном вызове неверного сертификата проанализируйте сертификат, закодированный в DER, с помощью пакета asn1lib. Например:

ASN1Parser p = ASN1Parser(der);
ASN1Sequence signedCert = p.nextObject() as ASN1Sequence;
ASN1Sequence cert = signedCert.elements[0] as ASN1Sequence;
ASN1Sequence pubKeyElement = cert.elements[6] as ASN1Sequence;

ASN1BitString pubKeyBits = pubKeyElement.elements[1] as ASN1BitString;

List<int> encodedPubKey = pubKeyBits.stringValue;
// could stop here and compare the encoded key parts, or...

// parse them into their modulus/exponent parts, and test those
// (assumes RSA public key)
ASN1Parser rsaParser = ASN1Parser(encodedPubKey);
ASN1Sequence keySeq = rsaParser.nextObject() as ASN1Sequence;
ASN1Integer modulus = keySeq.elements[0] as ASN1Integer;
ASN1Integer exponent = keySeq.elements[1] as ASN1Integer;

print(modulus.valueAsBigInteger);
print(exponent);
person Richard Heap    schedule 23.02.2019
comment
библиотека и код, которые вы упомянули, предоставляют открытый ключ промежуточного сертификата вместо конечного сертификата для сертификата Let's Encrypt - person Harsh Bhikadia; 13.11.2019
comment
вставьте der или pem в lapo.it/asn1js, чтобы подтвердить, какие поля ASN.1 необходимо извлечь и при необходимости адаптировать. - person Richard Heap; 13.11.2019
comment
похоже, что badCertificateCallback вызывается с родительским сертификатом (сертификат эмитента Lets Encrypt) - person Harsh Bhikadia; 13.11.2019
comment
Похоже, вам может понадобиться открыть вопрос. - person Richard Heap; 13.11.2019
comment
Разместил это в чате дротика. тем временем вы можете посмотреть сертификат pem, который я получаю в обратном вызове: shorturl.at/bwFQX - person Harsh Bhikadia; 13.11.2019
comment
в качестве временной реализации я думаю о закреплении и проверке PublicKey Let'sCrypt (срок действия 5 лет), а также проверке имени хоста, переданного в обратном вызове, если оно принадлежит серверу. что ты думаешь? - person Harsh Bhikadia; 14.11.2019
comment
поскольку Let'sCrypt в целом является доверенным эмитентом и имеет хороший механизм проверки владельца домена, следовательно, мы можем предположить, что LetsCrypt не выдаст злоумышленнику сертификат с моим доменом. Учитывая, что я хочу, чтобы Чарльз Проси, как сервер, не отслеживал трафик. - person Harsh Bhikadia; 14.11.2019
comment
@HarshBhikadia Вы регистрировали эту проблему под dart? Можете поделиться ссылкой здесь? - person Sahil Patel; 22.04.2020
comment
@SahilPatel Проверьте эту проблему github.com/dart-lang/sdk/issues/39425 - person Harsh Bhikadia; 23.04.2020
comment
@HarshBhikadia, не могли бы вы рассказать подробнее о своих мыслях. Я тоже изучаю эти вещи. может быть, мы сможем работать вместе, чтобы исправить эти вещи. - person Jiten Basnet; 24.04.2020
comment
@HarshBhikadia, мы - поставщик платежных услуг. Думаю также о покупке / регистрации сертификата, выданного ЦС. Также, что было бы лучше всего самоподписанным, чтобы обновить клиент с новым приложением, когда истечет срок его действия или сертификат, выпущенный CA? так что вполне в делемме. - person Jiten Basnet; 24.04.2020
comment
если служба также будет работать в браузере или в чем-то еще, я предлагаю вам обратиться к надежному центру сертификации. - person Harsh Bhikadia; 24.04.2020
comment
В настоящее время мы хотим защитить api только для того, чтобы знать, что наше приложение использует только действующий клиент. да рекомендуется доверенный центр сертификации. Одна вещь, однако, доверенный ЦС также предоставляет нам файлы типа der, cert, pem после того, как мы их зарегистрируем, чтобы мы использовали их так же, как настройку самоподписанного сертификата? - person Jiten Basnet; 24.04.2020
comment
Да, с CA вы все равно можете получить соответствующие файлы PEM, PFX и т. Д. (Ваш закрытый ключ никогда не покидает ваше здание, только CSR.) Обратите внимание, что закрепление сертификата НЕ гарантирует, что только действительные клиенты получают доступ к серверу. Для этого вы можете использовать сертификаты на стороне клиента, учетные данные, общий секрет и т. Д. - person Richard Heap; 24.04.2020
comment
@RichardHeap, подскажите, пожалуйста, где мне купить / зарегистрировать сертификат на стороне клиента. Если я использую сертификат клиента, нужна ли мне еще сертификация на стороне сервера? Как сертификат на стороне клиента удостоверяется, что это действительный пользователь, сервер должен иметь какой-то механизм? И что бы это было? - person Jiten Basnet; 27.04.2020
comment
Это не связано с этим вопросом. Лучше спросить нового. - person Richard Heap; 27.04.2020

Ротация ключей снижает риск. Когда злоумышленник получает старый жесткий диск сервера или файл резервной копии и получает от него закрытый ключ старого сервера, он не может олицетворять текущий сервер, если ключ был изменен. Поэтому всегда генерируйте новый ключ при обновлении сертификатов. Настройте клиент, чтобы доверять старому ключу и новому ключу. Подождите, пока ваши пользователи обновятся до новой версии клиента. Затем разверните новый ключ на своих серверах. Затем вы можете удалить старый ключ с клиента.

Закрепление ключа сервера необходимо только в том случае, если вы не меняете ключи. Это плохая практика безопасности.

Вы должны сделать закрепление сертификата с вращением. Я добавил пример кода в Как выполнить закрепление SSL с помощью самогенерируемых подписанных сертификатов во флаттере?

person M. Leonhard    schedule 28.09.2019