Uso de los repositorios de confianza y confianza de DatatheRem's TrustKit y TrustKit-Android
Las bibliotecas de la plataforma original se pueden encontrar a continuación
[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
La interfaz básica para esta biblioteca es anular el HttpMessageHandler en un constructor System.net.http.httpClient con una versión mejorada de confianza. Use cualquier servicio de dependencia que desee, el siguiente ejemplo usa el servicio de dependencia Maui integrado. Esto construye el controlador de mensajes HTTP específico de la plataforma para cualquier cliente HTTP que se necesite en la biblioteca de código compartido.
IHttpMessageHandlerFactory httpMessageHandlerFactory = DependencyService.Resolve<IHttpMessageHandlerFactory>();
HttpClient httpClient = new HttpClient(httpMessageHandlerFactory.BuildHttpMessageHandler());
Los manejadores definidos para iOS y Android se pueden sobrescribir aún más para la funcionalidad adicional como se desee, solo subclase TrustKitiosClientHandler o TrustKitandroidClientHandler, y luego inyecte una nueva instancia de su subclase en sus clientes. ¡Todavía debe llamar a los métodos de inicialización correctos!
Determinar los valores de conjunto de PIN puede ser complicado: es la codificación de la base 64 del hash SHA256 de la información de clave pública del sujeto del certificado. Después de descargar el certificado en formato .cer a su computadora [puede hacer esto en Chrome, Firefox, etc.], calcule su valor establecido con PIN usando OpenSSL en el terminal (reemplace el {certateName} .cer con el nombre real del certificado descargado).
openssl x509 -in {certificateName}.cer -pubkey -noout
| openssl pkey -pubin -outform der
| openssl dgst -sha256 -binary
| openssl enc -base64
Para iOS, configure colocando la configuración de TrustKit en Info.plist según lo descrito por la biblioteca de confianza original. No utilizará Swizzling en esta implementación, incluso si Swizzling se enciende en Info.plist. Solo los httpclients con el parámetro TrustKit HttpMessageHandler utilizarán la implementación de fijación del certificado.
En el método de Endelegate's EnterNeaMunching de AppDelegate, asegúrese de poner:
httpMessageHandlerFactory.InitSharedInstanceWithConfiguration();
Esto inicializa el código TrustKit iOS.
Para Android, configure colocando la configuración de TrustKit en el archivo de configuración de seguridad de Android normal (recursos/xml/network_security_config.xml) y asegúrese de seguir la documentación restante como se describe por la biblioteca de confianza original.
En la función de OnCreate de la MainActivity, pon:
httpMessageHandlerFactory.InitializeWithNetworkSecurityConfiguration(this);
Esto inicializa el código de Android TrustKit.
La fijación de certificados es una importante técnica de seguridad móvil (https://owasp.org/www-community/controls/certificate_and_public_key_pinning). Permite a los desarrolladores de aplicaciones enviar un valor de certificado conocido (o valor de clave pública de certificado) con su solicitud. Luego, durante el apretón de manos de TLS para establecer una conexión HTTPS segura con un servidor remoto, este valor conocido enviado se compara con el valor presentado por el servidor (que se utilizará para descifrar paquetes). Si el valor coincide, el desarrollador de aplicaciones móviles permite que la conexión continúe. Si no es así, el desarrollador puede detener la conexión y manejar la falla, sin embargo, considere apropiado (como notificar al usuario).
Usando el nuevo sistema.net.httpclient (https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient) clase e inyectar los manejadores de mensajes de plataforma correctos nos permiten usar la plataforma nativa para servicios de red. Estos manejadores de mensajes se pueden extender de varias maneras para permitir la compresión y otras optimizaciones, como las listas de Jonathan aquí (http://jonathanpeppers.com/blog/improving-http-performance-in-xamarin-aplicaciones). Una forma importante de extender estos manejadores, y la motivación de este repositorio, es la fijación de certificados a través de implementaciones de la biblioteca dependientes de la plataforma por Datatheorem.
¡Gracias a todos por su ayuda e interés en mantener y solucionar problemas con este repositorio!