Usando os repositórios confiáveis e confiady-android da Datatheorem
As bibliotecas de plataforma original podem ser encontradas abaixo
[iOS] https://github.com/datatheorem/trustkit
[Android] https://github.com/datatheorem/trustkit-android
iOS | https://www.nuget.org/packages/datatheorem.trustkit.net.ios
Android | https://www.nuget.org/packages/datatheorem.trustkit.net.android
A interface básica para esta biblioteca é substituir o httpmessageHandler em um construtor System.net.http.httpclient com uma versão aprimorada do TrustKit. Use qualquer serviço de dependência desejar, o exemplo a seguir usa o serviço de dependência Maui embutido. Isso cria o manipulador de mensagens HTTP específico da plataforma para qualquer cliente HTTP necessário na biblioteca de código compartilhada.
IHttpMessageHandlerFactory httpMessageHandlerFactory = DependencyService.Resolve<IHttpMessageHandlerFactory>();
HttpClient httpClient = new HttpClient(httpMessageHandlerFactory.BuildHttpMessageHandler());
Os manipuladores definidos pelo iOS e o Android podem ser substituídos por funcionalidade adicional, conforme desejado - apenas subclasse confiencliosclienthandler ou trustkitandroidclienthandler e, em seguida, injete uma nova instância da sua subclasse em seus clientes. Você ainda deve chamar os métodos de inicialização correta!
Determinar os valores do conjunto de pinos pode ser complicado: é a codificação base 64 do hash sha256 da informação -chave pública do sujeito do certificado. Depois de fazer o download do certificado no formato .Cer no seu computador [pode fazer isso no Chrome, Firefox, etc.], calcule seu valor de conjunto de pinos usando o OpenSSL no terminal (substitua o {CertiveName} .Cer pelo nome real do certificado baixado).
openssl x509 -in {certificateName}.cer -pubkey -noout
| openssl pkey -pubin -outform der
| openssl dgst -sha256 -binary
| openssl enc -base64
Para o iOS, configure colocando a configuração do TrustKit no info.plist conforme descrito pela biblioteca Trustkit original. Ele não usará swizzling nessa implementação, mesmo que o swizzling esteja ativado no info.plist. Somente os httpclients com o parâmetro confiekit httpmessageHandler usarão a implementação do certificado.
No método de acabamento do AppDelegate, não deixe de colocar:
httpMessageHandlerFactory.InitSharedInstanceWithConfiguration();
Isso inicializa o código iOS Trustkit.
Para o Android, configure colocando a configuração do TrustKit no arquivo de configuração de segurança do Android normal (Resources/XML/Network_Security_Config.xml) e siga a documentação restante, conforme descrito pela biblioteca Trustkit original.
Na função OnCreate da MainActivity, coloque:
httpMessageHandlerFactory.InitializeWithNetworkSecurityConfiguration(this);
Isso inicializa o código Android Trustkit.
A fixação do certificado é uma técnica importante de segurança móvel (https://owasp.org/www-community/controls/certificate_and_public_key_pinning). Ele permite que os desenvolvedores de aplicativos enviem um valor de certificado conhecido (ou certificado de valor público público) com seu aplicativo. Em seguida, durante o aperto de mão do TLS para estabelecer uma conexão HTTPS segura com um servidor remoto, esse valor conhecido é comparado ao valor apresentado pelo servidor (que será usado para descriptografar pacotes). Se o valor corresponder, o desenvolvedor de aplicativos móveis permite que a conexão continue. Caso contrário, o desenvolvedor pode interromper a conexão e lidar com a falha, mas julgar apropriada (como notificar o usuário).
Usando o novo System.net.httpclient (https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient) Classe e injetar os manipuladores de plataforma corretos nos permitem usar a plataforma nativa para serviços de rede. Esses manipuladores de mensagens podem ser estendidos de várias maneiras para permitir a compressão e outras otimizações, como as listas de Jonathan aqui (http://jonathanpeppers.com/blog/improving-http-permance-in-xamarin-applications). Uma maneira importante de estender esses manipuladores - e a motivação deste repositório - é a fixação do certificado por meio de implementações de bibliotecas dependentes da plataforma pelo Datatheorem.
Obrigado a todos vocês por sua assistência e interesse em manter e corrigir problemas com este repositório!