xamarin.android X509Certificate2构造函数/导入失败,使用SecureString密码而不是纯字符串

时间:2016-08-04 14:15:53

标签: android xamarin certificate x509certificate2 securestring

我在PFX文件中有一个带有私钥的自签名证书。它作为资源添加到Visual Studio 2015中的Xamarin.Android c#应用程序中。我将其用作客户端证书,以建立与Web服务的安全HTTPS连接。

为此,我在X509Certificate2对象中导入证书。当我以明文(字符串)的形式提供证书私钥的密码时,它运行良好,但我想使用X509Certificate2使用SecureString的构造函数/导入方法。

不幸的是他们扔了

  

'无法解码证书异常'

在这种情况下,无论是使用构造函数还是导入方法,无论证书是以byte []还是文件名传递。

我的问题是,为什么它在SecureString中使用密码失败,同时适用于普通字符串以及如何继续使用SecureString作为密码。

谢谢!

的Georgi

只是添加相同的代码和相同的证书文件和密码在Windows 10,.NET 4下运行良好 否则Xamarin.Android是6.1.1.1,Xamarin扩展是4.1.1.3,最小android到目标是API级别19,在Android 6.0上测试

1 个答案:

答案 0 :(得分:0)

原因是Mono不完全支持SecureString。请参阅source以获取评论。它称证书类为' Import方法并传递(string)null

[MonoTODO ("SecureString is incomplete")]
public override void Import (byte[] rawData, SecureString password, X509KeyStorageFlags keyStorageFlags)
{
    Import (rawData, (string) null, keyStorageFlags);
}

另请注意,SecureString不会使您的数据100%secure

  

总的来说,SecureString比String更安全,因为它限制了   暴露敏感的字符串数据。但是,那些字符串可能仍然存在   暴露于任何有权访问原始内存的进程或操作,   例如在主机上运行的恶意进程,一个进程   转储或用户可见的交换文件。而不是使用SecureString   保护密码,推荐的替代方法是使用不透明   处理存储在流程外部的凭证。