我正在访问使用OAuth2身份验证的Web服务API(现在为ADP Workforce)。他们的标准说明涉及在客户端工作站上安装SSL证书,但是他们还有一个.NET解决方案示例,该示例仅直接使用证书文件(PFX)。 .NET环境可以通过X509Certificate2
类来实现此目的,该类具有一个直接接受文件名的构造函数。然后将该对象与WebRequestHandler
一起使用:
WebRequestHandler handler = new WebRequestHandler();
X509Certificate2 certificate = LoadCertificateFile(<pfx file path>, <key file path>, <cert password>);
handler.ClientCertificates.Add(certificate);
感觉很优雅,再加上将证书作为资源嵌入,然后将其写入临时文件,我可以创建一个完全独立的可执行文件,该文件对数据进行身份验证和提取并同步到我们的内部系统(无需客户受到其他任何要求的困扰,例如安装证书)。
我不能在使用MSXML2.ServerXMLHTTP
对象(例如,从Visual Foxpro自动化)的非.NET环境中复制直接使用PFX文件的“特殊之处”。我可以执行以下标准请求:
loRequest = CREATEOBJECT("MSXML2.ServerXMLHTTP")
loRequest.SetOption(2, 13056)
loRequest.Open("POST", "https://iat-api.adp.com/auth/oauth/v2/token?grant_type=client_credentials")
loRequest.SetRequestHeader("Authorization", "Basic " + <encoded username/password>)
loRequest.SetRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)")
loRequest.Send()
但是Send()
会引发错误,“ 需要证书才能完成客户端身份验证。”
如果我在个人存储区中正确安装了证书,则Send()
成功了,并且获得了一个Bearer令牌,我可以使用它来进行后续的API调用-一切都很好。但是,如果我从个人存储中卸载证书,则会回到错误提示中。
正如我所说,.NET端具有该证书类,并且能够将证书添加到Web请求处理程序中。我如何在非.NET中做同样的事情?这是我第一次不依靠.NET更复杂的库而无法正常工作。说实话,我仍然会坚持使用.NET,因为它的JSON处理比我在Visual Foxpro中工作的要优雅得多。但是我仍然希望可以选择从.NET外部使用直接文件SSL证书身份验证。我喜欢一些没有依赖性的独立可执行文件。