我在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上测试
答案 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 保护密码,推荐的替代方法是使用不透明 处理存储在流程外部的凭证。