2

我想使用 C# 重现以下 vbscript 块。

sURL = "https://server/service.dll"
sXML = "<request version=""1.0""><ticket>generated ticket</ticket></request>"
dim winHTTPReq: Set winHTTPReq = CreateObject("WinHttp.WinHttpRequest.5.1")
winHttpReq.Open "POST", sURL, false
winHTTPReq.SetRequestHeader "Content-Type", "application/x-some-type"
sCertificate = "LOCAL_MACHINE\MY\Vendor Supplied PFX"
winHTTPReq.SetClientCertificate sCertificate
WinHttpReq.Send(sXML)
....

我所做的所有尝试都是 a) 没有功能和 b) 比上面的片段长一点。

var xml = (new XElement("request"
    , new XElement("ticket", "generated ticket")).ToString();

var cert = X509Certificate.CreateFromCertFile("c:\\Exported Vendor Supplied PFX.cer");
ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };
var request = (HttpWebRequest)WebRequest.Create("https://server/service.dll");
request.ClientCertificates.Add(cert);
request.ContentType = "application/x-some-type";
request.Method = "POST";

byte[] bytes = Encoding.UTF8.GetBytes(xml);
request.ContentLength = bytes.Length;

using (var requestStream = request.GetRequestStream())
requestStream.Write(bytes, 0, bytes.Length);

using (var response = (HttpWebResponse)request.GetResponse()) 
if (response.StatusCode != HttpStatusCode.OK) {
    string message = String.Format(
    "POST failed. Received HTTP {0}",
    response.StatusCode);
    throw new ApplicationException(message);
}

后一个代码我一直得到 403。我不知道为什么,但我倾向于权限。在我可以从 cer 文件创建证书之前,有什么特别需要的吗?我需要通过 winhttpcertcfg 申请权限吗?

我最初获得了一个使用证书 MMC 导入的 pfx。似乎没有办法将 pfx 添加为客户端证书,因此我将 pfx 导出为 DER x509 cer 以与 CreateFromCertFile() 方法一起使用。有没有办法只使用pfx?

当然,原始的 VBScript 可以正常工作 - 我只是想了解转换它需要什么。这似乎并不太难,但到目前为止,我经历了一段艰难的时期。

[更新]

显然可以在磁盘上使用 pfx(如果您有密码)但是 [this]http://support.microsoft.com/kb/948154 似乎建议最好依赖证书存储。由于这与原始 vbscript 所做的类似,我修改了上面的代码以从商店中提取证书:

var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

X509Certificate2 cert = store.Certificates.Find(X509FindType.FindBySubjectName
, "XXXX", false)[0];

我通过 WinHttpCertCfg 工具添加了授予“所有人”对证书的访问权限。仍然没有运气。不幸的是,这也会从服务器返回 403。浏览代码我可以看到证书已成功找到并创建。我还可以验证它是否已作为客户端证书添加。无论出于何种原因,我在使用 HttpWebResponse 时都没有运气。

但是,使用互操作可以正常工作。尽管我讨厌依赖非框架原生的东西,但 WinHttpRequest 组件似乎更容易使用。我可以用大约 1/4 的代码完成同样的事情,并且可以很好地与应用程序的其余部分集成。

xml = "<request version=\"1.0\"><ticket>generated ticket</ticket></request>";
var req = new WinHttp.WinHttpRequest();
req.Open("POST", "https://server/service.dll", false);
req.SetRequestHeader("Content-Type", "application/x-some-type");
req.SetClientCertificate(@"LOCAL_MACHINE\MY\Vendor Supplied PFX");
req.Send(xml);
Console.WriteLine(string.Format("{0} {1}", req.Status, req.StatusText));
Console.WriteLine(req.ResponseText);
4

0 回答 0