精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品开源心得,转载请注明:“锐英源www.wisestudy.cn,孙老师作品,电话13803810136。需要全文内容也请联系孙老师。
这代码在我连接一个特殊的服务器时不起作用,虽然这个服务器也是用443端口,但它好像不是特别标准。
里面的组织名称和代理名称,不好理解,要掌握它,要好好研究证书说明,通过IE打开证书内容,好好看看。
我最近需要与Visa服务器建立安全套接字层(SSL)连接并发送我们签署的客户端证书,以便授权我们的MPI应用程序。我搜索了许多文章,但只能找到关于这个主题的几篇文章。我从不同的文章和MSDN收集了部分解决方案,并实现了一个执行此操作的简单类。
InternetErrorDlg里有API,可以处理某些目的,包括发送客户端证书,通过打开模态对话框让用户选择。但在许多情况下,程序员可能需要在没有用户界面的情况下进行身份验证(即用户界面需要一个OK点击器J ..如果我们希望程序自动执行操作,这对我们来说可能毫无用处)。这是通过InternetSetOption()与INTERNET_OPTION_CLIENT_CERT_CONTEXT标志完成。不要忘记此选项仅适用于Internet Explorer 5.01或更高版本(如MSDN所写)。
INTERNET_OPTION_CLIENT_CERT_CONTEXT标志不包含在VC6.0默认标头中。如果您安装了平台SDK,那没问题,请在sdk / include目录中包含wininet标头,否则您可以手动定义它;
#define INTERNET_OPTION_CLIENT_CERT_CONTEXT 84
如果您没有旧的wininet.dll版本,那应该没问题。
我不会告诉wininet函数做什么以及如何使用它们以及证书。这些是通用主题,可以从许多资源(如MSDN)收集大量信息。如果您向我发送电子邮件,我会尝试回答问题。
嗯,流程很简单。首先,我们连接到HTTPS服务器并发送HTTPS请求。如果服务器要求签名的客户端证书,我们打开并浏览系统存储区以获取我们需要的证书上下文。然后在附加证书上下文后重新发送我们的请求。如果服务器满意,我们将通过身份验证。
该类的示例用法可以是这样的:
CSslConnection inetSec; string sAgentName("My Firm"); string sServerName("207.219.70.31");//Can be any https server address string sUserName("");//if required string sPass("");//if required string sObjectName("/xxx.asp");//there should be an object to send a verb string sOrganizationUnitName("3-D Secure Compliance TestFacility"); string strVerb = "POST";//I chose POST verb. That’s usually done inetSec.SetAgentName(sAgentName); inetSec.SetCertStoreType(certStoreMY); //The stores provided by the system // are: MY, ROOT, SPC and CA inetSec.SetObjectName(sObjectName); inetSec.SetOrganizationName(sOrganizationUnitName); inetSec.SetPort(9660);//443 is the default HTTPS port inetSec.SetServerName(sServerName); inetSec.SetRequestID(0); if (!inetSec.ConnectToHttpsServer(strVerb)) { cout << inetSec.GetLastErrorString() << " Code: " << inetSec.GetLastErrorCode(); << endl; return 0; } if (!inetSec.SendHttpsRequest()) { cout << inetSec.GetLastErrorString() << " Code: " << inetSec.GetLastErrorCode(); << endl return 0; } string response = inetSec.GetRequestResult(); cout << response.c_str() << endl;
“organization name”对应的函数和变量完全是示例,实际值要根据你的情况所定。我选择在证书中使用“O value of the issuer field”,这是我的搜索条件。您可能希望通过不同的字段执行存储搜索。因为,证书中有许多字段,并且可以通过其中任何一个执行上下文搜索。
您可能可能会添加自己的函数而不是使用FindCertWithOUNITName()函数。如果您这样做,只需更改调用此函数的代码(仅在1个位置)并提供适合您的证书搜索条件的一些变量和访问器。