固定xamarin表格的证书

固定xamarin表格的证书,xamarin,xamarin.forms,ssl-certificate,pinning,Xamarin,Xamarin.forms,Ssl Certificate,Pinning,困惑于如何做证书固定。如何通过xmarin表单在n android或ios设备中安装证书。在应用程序安装期间是否执行此操作?有一些教程介绍如何使用固定来验证https请求,但并没有介绍公共证书的安装 虽然您可以使用证书本身来执行验证,从而锁定证书,但还有其他选择 根据,您可以实施以下3种方法中的任意一种: 证书 证书是最容易识别的。你可以去拿那本书 网站的带外证书,让IT人员给您发送电子邮件 公司证书,使用openssl s_客户端检索 证书等。当证书过期时,您将更新 应用假设您的应用程序没有b

困惑于如何做证书固定。如何通过xmarin表单在n android或ios设备中安装证书。在应用程序安装期间是否执行此操作?有一些教程介绍如何使用固定来验证https请求,但并没有介绍公共证书的安装

虽然您可以使用证书本身来执行验证,从而锁定证书,但还有其他选择

根据,您可以实施以下3种方法中的任意一种:

证书

证书是最容易识别的。你可以去拿那本书 网站的带外证书,让IT人员给您发送电子邮件 公司证书,使用openssl s_客户端检索 证书等。当证书过期时,您将更新 应用假设您的应用程序没有bug或安全性 如果存在缺陷,应用程序将每一两年更新一次。在 运行时,您可以在中检索网站或服务器的证书 回拨。在回调中,比较检索到的证书 将证书嵌入到程序中。如果比较 失败,然后使方法或函数失败

固定证书有一个缺点。如果站点旋转其 定期颁发证书,那么您的申请将需要 定期更新。例如,谷歌轮换其证书,因此 如果需要,您需要每月更新一次应用程序 依赖谷歌服务。即使谷歌轮换它的 证书,证书中的基础公钥 保持静止

公钥

公钥固定更加灵活,但由于 从证书中提取公钥所需的额外步骤。像 使用证书,程序将使用 它是公钥的嵌入副本。有两个缺点 公钥固定。首先,使用钥匙比使用钥匙更难 证书,因为您通常必须从 证明书提取是Java和.Net中的一个小麻烦, 但是在Cocoa/CocoaTouch和OpenSSL中,它会让人不舒服。其次是 关键点是静态的,可能违反关键点旋转策略

散列

虽然上述三种选择都使用DER编码,但它也是可以接受的 使用信息散列或其他转换。事实上 原始示例程序是使用摘要证书和 公钥。样本已更改,以允许程序员检查 对象使用dumpasn1和其他ASN.1解码器等工具

散列还提供了三个额外的好处。首先,哈希允许 您需要匿名化证书或公钥。这可能很重要 如果您的应用程序在运行期间担心信息泄漏 反编译和重新设计

第二,摘要证书指纹通常可用作 本机API适用于许多库,因此使用方便

最后,一个组织可能希望提供一个储备或备份 主身份被破坏时的身份。哈希确保 您的对手在中看不到保留证书或公钥 它的使用进展。事实上,谷歌的IETF草案websec密钥固定 使用这种技术

我强烈建议使用散列方法,这意味着在验证传入的证书时,只需检查来自服务器的证书的散列是否符合预期。如下所示:

private bool ValidateServerCertificate(object sender,
                                       X509Certificate certificate,
                                       X509Chain chain,
                                       SslPolicyErrors sslPolicyErrors)
{
    // Make sure we have a certificate to check.
    if (certificate == null)
    {
        return false;
    }

    if (sslPolicyErrors != SslPolicyErrors.None)
    {
        return false;
    }

    return this.KnownKeys.Contains(certificate.GetCertHashString(), 
                                   StringComparer.Ordinal);
}
其中KnownKeys是一个简单的编译时定义的已知证书哈希数组:

private readonly string[] KnownKeys = new[]
{
    "INSERT HASH",
    "AND A SECOND IF REQUIRED"
};

另一种方法是在leaf的证书公钥上执行固定,在中,我们可以通过自定义ServicePointManager了解如何在使用HttpClient时执行固定:

using System;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

namespace ApproovSDK
{
    /**
     * Service point configuration.
     * 
     * Adds simple pinning scheme to service point manager.
     * 
     * FOR DEMONSTRATION PURPOSES ONLY
     */
    public static class ServicePointConfiguration
    {
        private static string PinnedPublicKey = null;

        public static void SetUp(string key = null)
        {
            PinnedPublicKey = key;

            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertficate;
        }

        private static bool ValidateServerCertficate(
            object sender,
            X509Certificate certificate,
            X509Chain chain,
            SslPolicyErrors sslPolicyErrors
        )
        {
            if (PinnedPublicKey == null || PinnedPublicKey.Length <= 0) return true;

            //Console.WriteLine("Expected: " + PinnedPublicKey);
            //Console.WriteLine("Found   : " + certificate?.GetPublicKeyString());

            return String.Equals(PinnedPublicKey, certificate?.GetPublicKeyString(),
                                 StringComparison.OrdinalIgnoreCase);
        }
    }
}

上面的示例是为了演示而编写的,一个更好的实现应该为每个被调用的域关联多个键。

始终欢迎指向潜在解决方案的链接,但请确保您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防无法访问目标站点或永久脱机。考虑到仅仅是一个指向外部站点的链接是一个可能的原因。