锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 英语翻译 / 使用Wininet通过SSL连接HTTPS服务器、发送客户端证书和读取响应
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
技术分类
讨论组翻译
调用Office打印预览
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft
人工智能QQ群:14372360
头条号:软件技术及人才和养生
m

锐英源精品开源心得,转载请注明:“锐英源www.wisestudy.cn,孙老师作品,电话13803810136。需要全文内容也请联系孙老师。

使用Wininet通过SSL连接HTTPS服务器、发送客户端证书和读取响应


总结

这代码在我连接一个特殊的服务器时不起作用,虽然这个服务器也是用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,SSL或证书的读者:

我不会告诉wininet函数做什么以及如何使用它们以及证书。这些是通用主题,可以从许多资源(如MSDN)收集大量信息。如果您向我发送电子邮件,我会尝试回答问题。

嗯,流程很简单。首先,我们连接到HTTPS服务器并发送HTTPS请求。如果服务器要求签名的客户端证书,我们打开并浏览系统存储区以获取我们需要的证书上下文。然后在附加证书上下文后重新发送我们的请求。如果服务器满意,我们将通过身份验证。

  • ConnectToHttpsServer()总结了连接的流程。这是最初的地方。
  • SendHttpsRequest()发送请求。之后,如果服务器需要客户端证书,我们会在系统存储中搜索它。如果我们找到它,用InternetSetOption()将上下文附加到连接。然后我们再试SendHttpsRequest()一次。

该类的示例用法可以是这样的:

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个位置)并提供适合您的证书搜索条件的一些变量和访问器。

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内劳动服务器公司办公楼一层