Flutter gRPC: лучший подход для двухстороннего TLS в приложении для Android

#android #flutter #go #grpc #grpc-go

#Android #flutter #Вперед #grpc #grpc-go

Вопрос:

Я создаю приложение для Android с использованием flutter. Серверная служба построена с использованием golang с gRPC в качестве API.

Я хочу добиться двустороннего шифрования TLS для приложения, которое я создаю. Я сгенерировал пару открытых и закрытых ключей RSA и назначил закрытый ключ стороне golang gRPC, а открытый ключ — стороне flutter. Я не знаю, лучший ли это подход, поскольку я напрямую сохраняю открытый ключ в assets папке моего приложения flutter.

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

код инициализации golang gRPC:

 cred, sslErr := credentials.NewServerTLSFromFile(parsedConfig.GRPCConf.CertFile, parsedConfig.GRPCConf.KeyFile)
if sslErr != nil {
    sslErr = errors.Wrap(sslErr, "[ERROR - 301]")
    return sslErr
}
opts = append(opts, grpc.Creds(cred))

opts = append(opts, grpc.UnaryInterceptor(unaryInterceptor))

grpcServer := grpc.NewServer(opts...)
  

Комментарии:

1. TLS работает с использованием сертификатов, а не необработанных ключей. И нет «одностороннего TLS», он всегда двусторонний. Что может быть только односторонним, так это аутентификация: если вам нужно только подтвердить личность сервера, вам нужен только сертификат (и связанный закрытый ключ) на стороне сервера. Если вы хотите взаимную аутентификацию, вам также понадобятся сертификаты клиента.

2. Мне очень жаль, я думаю, что неправильно интерпретировал. Как вы указали, я использую файл сертификата на стороне сервера (я приложил код для справки). Как получить сертификат клиента? Нормально ли, если я создам собственный сертификат клиента и вставлю его в папку assets? Я новичок в шифровании и разработке в целом, спасибо за ваш ответ и терпение.

3. Зачем вам нужен сертификат клиента? Вам это не нужно для установления безопасного соединения. Если вам нужно аутентифицировать пользователей приложения (поскольку при каждой установке приложения будут разные идентификаторы), вам нужно что-то динамическое, например, попросить их войти в систему.

4. Итак, если я подключусь, используя credentials: ChannelCredentials.insecure() опцию в flutter, все ли в порядке? Если да, то спасибо за ваши разъяснения. Пожалуйста, напишите ответ, я отмечу его как решение.

5. Попробуйте это руководство: itnext.io /… . Возможно, также прочитайте больше о TLS. И у вас должен быть общедоступный сертификат для вашего сервера.