问题描述
我有一个正在处理的项目,要求在进行HTTP Rest调用进行相互身份验证时发送证书。
这是Xamarin表单项目,我主要关心的是使它在Android方面起作用,并且如果可能的话,在PCL中包含代码。
每当我通过HttpClient发送请求时,我总是会返回403错误。下面的代码显示了如何从项目中的嵌入式资源获取PFX。
出于安全原因,我从程序集和流中删除了命名。
// Need to properly find the assembly given a class that is present in the assembly.
var assembly = typeof(resourcehere).GetTypeInfo().Assembly;
Stream stream = assembly.GetManifestResourceStream("assbemlypath.pfx");
// Read in the data from the embedded cert file.
byte[] certData = null;
using (var memoryStream = new MemoryStream())
{
stream.CopyTo(memoryStream);
certData = memoryStream.ToArray();
}
X509Certificate2Collection cert = new X509Certificate2Collection();
cert.Import(certData,password,X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
执行完此操作后,我可以看到证书收集很好。我将此代码放在返回此证书集合的方法中,称为GetCertificate(),该方法在下面使用。
然后在此调用中使用它:
var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ClientCertificates.AddRange(GetCertificate());
// Construct client with handler.
var client = new HttpClient(handler);
// Make request.
var result = client.GetAsync("myurlhere").GetAwaiter().GetResult();
var responsebody = result.Content.ReadAsStringAsync().GetAwaiter().GetResult();
通过此方法进行调试时,我总是看到处理程序具有我的证书,但调用失败,并返回403。
经过一些测试,我尝试使用HttpWebRequest代替它,并且可以正常工作。该代码使用获取证书的相同方法,但是调用是这样进行的:
X509Certificate2Collection certificate = GetCertificate();
var httpRequest = (HttpWebRequest)WebRequest.Create("myurlhere");
httpRequest.ClientCertificates = certificate;
HttpWebResponse response = (HttpWebResponse)httpRequest.GetResponse();
当我在上面执行时,我得到200,并得到了期望的响应。
有人知道什么可能导致两者之间的差异吗?
我已经待了几天,对此一无所知。
预先感谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)