固定xamarin表格的证书
困惑于如何做证书固定。如何通过xmarin表单在n android或ios设备中安装证书。在应用程序安装期间是否执行此操作?有一些教程介绍如何使用固定来验证https请求,但并没有介绍公共证书的安装 虽然您可以使用证书本身来执行验证,从而锁定证书,但还有其他选择 根据,您可以实施以下3种方法中的任意一种: 证书 证书是最容易识别的。你可以去拿那本书 网站的带外证书,让IT人员给您发送电子邮件 公司证书,使用openssl s_客户端检索 证书等。当证书过期时,您将更新 应用假设您的应用程序没有bug或安全性 如果存在缺陷,应用程序将每一两年更新一次。在 运行时,您可以在中检索网站或服务器的证书 回拨。在回调中,比较检索到的证书 将证书嵌入到程序中。如果比较 失败,然后使方法或函数失败 固定证书有一个缺点。如果站点旋转其 定期颁发证书,那么您的申请将需要 定期更新。例如,谷歌轮换其证书,因此 如果需要,您需要每月更新一次应用程序 依赖谷歌服务。即使谷歌轮换它的 证书,证书中的基础公钥 保持静止 公钥 公钥固定更加灵活,但由于 从证书中提取公钥所需的额外步骤。像 使用证书,程序将使用 它是公钥的嵌入副本。有两个缺点 公钥固定。首先,使用钥匙比使用钥匙更难 证书,因为您通常必须从 证明书提取是Java和.Net中的一个小麻烦, 但是在Cocoa/CocoaTouch和OpenSSL中,它会让人不舒服。其次是 关键点是静态的,可能违反关键点旋转策略 散列 虽然上述三种选择都使用DER编码,但它也是可以接受的 使用信息散列或其他转换。事实上 原始示例程序是使用摘要证书和 公钥。样本已更改,以允许程序员检查 对象使用dumpasn1和其他ASN.1解码器等工具 散列还提供了三个额外的好处。首先,哈希允许 您需要匿名化证书或公钥。这可能很重要 如果您的应用程序在运行期间担心信息泄漏 反编译和重新设计 第二,摘要证书指纹通常可用作 本机API适用于许多库,因此使用方便 最后,一个组织可能希望提供一个储备或备份 主身份被破坏时的身份。哈希确保 您的对手在中看不到保留证书或公钥 它的使用进展。事实上,谷歌的IETF草案websec密钥固定 使用这种技术 我强烈建议使用散列方法,这意味着在验证传入的证书时,只需检查来自服务器的证书的散列是否符合预期。如下所示:固定xamarin表格的证书,xamarin,xamarin.forms,ssl-certificate,pinning,Xamarin,Xamarin.forms,Ssl Certificate,Pinning,困惑于如何做证书固定。如何通过xmarin表单在n android或ios设备中安装证书。在应用程序安装期间是否执行此操作?有一些教程介绍如何使用固定来验证https请求,但并没有介绍公共证书的安装 虽然您可以使用证书本身来执行验证,从而锁定证书,但还有其他选择 根据,您可以实施以下3种方法中的任意一种: 证书 证书是最容易识别的。你可以去拿那本书 网站的带外证书,让IT人员给您发送电子邮件 公司证书,使用openssl s_客户端检索 证书等。当证书过期时,您将更新 应用假设您的应用程序没有b
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);
}
}
}
上面的示例是为了演示而编写的,一个更好的实现应该为每个被调用的域关联多个键。始终欢迎指向潜在解决方案的链接,但请确保您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防无法访问目标站点或永久脱机。考虑到仅仅是一个指向外部站点的链接是一个可能的原因。