《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之76——BREW中的安全性网络编程...
安全性的網絡編程主要是通過SSL實現的,首先要創建創建SSLRoot,可用的根證書通常是常用的VeriSign 根證書。它們可以節省手持設備上的空間,并且僅保留一個副本,而不是在每個使用 SSL 的應用程序中都保留副本。手持設備僅包含常用根證書的一小部分,從而防止占用過多的空間。SSL的實現有兩種方法,一種是面向socket的實現,另一種是面向http的實現及HTTPS。這里主要闡明怎樣使用IWeb接口實現HTTPS的功能。
// defined in pMe
IWebOpts *piRoots; …
if(ISHELL_CreateInstance(piShell, AEECLISD_SSLROOTCERTS, (void **)&piRoots) != SUCCESS){ }
然后發送root證書給服務器
// defined in App Structure
AEECallback pcb;
IWeb *pIWeb;
IWebResp *pIWebResp;
…
// Create instance of IWeb
if(ISHELL_CreateInstance(piShell, AEECLISD_WEB, (void**)&pMe->pIWeb) !=
SUCCESS)
goto failure;
// Initialize callback
CALLBACK_Init(&pMe->pcb, (PFNNOTIFY)CheckSecureResp, pMe);
// First secure connection attempt
IWeb_GetResponse(pMe->pIWeb, (pMe->pIWeb, &pMe->pIWebResp, &pMe->pcb,
"https://brewx.qualcomm.com/developer/devexhome.jsp",
WEBOPT_HEADERHANDLER, HeaderHandlerFn,
WEBOPT_DEFAULT, pMe->piRoots,
WEBOPT_END));
同時,需要獲得HTTPS的頭信息,如果需要的話,還要提供登錄等功能:
void Header(void* pNotifyData, const char* pszName, GetLine* pplVal) {
HTTPSDemo* pMe = pNotifyData;
if(STRBEGINS("WWW-authenticate:", pszName)) {
if(pplVal) {
AppendIDPswdHeader(pMe, pplVal, “user”, “pass”);
}
}
if(STRBEGINS("Set-Cookie:", pszName)) {
if(pplVal) {
AppendCookieHeader(pMe, pplVal->psz);
}
}
}
現在,就可以順利的建立https的連接了
// Create new IWeb transaction
if(pMe->pIWeb) {
IWEB_Release(pMe->pIWeb);
pMe->pIWeb = NULL;
}
if(ISHELL_CreateInstance(piShell, AEECLISD_WEB, (void**)&pMe->pIWeb) != SUCCESS)
// handle failure
// Initialize callback
CALLBACK_Cancel(&pMe->pcb);
CALLBACK_Init(&pMe->pcb, (PFNNOTIFY)CheckSecureResp, pMe);
// Try a successful attempt
IWEB_GetResponse(pMe->pIWeb, (pMe->pIWeb, &pMe->pIWebResp, &pMe->pcb,
"https://brewx.qualcomm.com/developer/devexhome.jsp", WEBOPT_HEADER, pMe->buffer,
WEBOPT_HEADERHANDLER, HeaderHandlerFn,WEBOPT_DEFAULTS, pMe->pIRoots,
WEBOPT_END));
為了保證應用的健壯性,需要關注SSL中的錯誤處理:
WebOpt wo;
SSLInfo* pSSLInfo = NULL;
// Query for SSL webopt
IWEBRESP_GetOpt(pMe->pIWebResp, WEBOPT_SSL_SEC_INFO, 0, &wo);
// pointer to ssl info
pSSLInfo = (SSLInfo*)(wo.pVal);
// error values are held in pSSLInfo->nResult
另外,還可以通過X.509對SSL進行配置:
X509TrustOVerride TO;
TO.uCertID = 0;
TO.uOverrideBits = X509CHAIN_CERT_EXIPRED;
IWeb_GetResponse(pMe->pIWeb,(pMe->pIWeb,pMe->pWebResp,&pMe->CallBack,
"https://www.securesite.com",WEBOPT_SSL_ALLOWED_VERSION, SSL_VERSION_30,
WEBOPT_X509_ROOT_CERT, pOurRoot, WEBOPT_X509_OVERRIDE, &TO,
WEBOPT_DEFAULTS, pMe->pIRoots, WEBOPT_END));
對于銀行類應用,或者證券交易類應用,一般會使用自定義的證書,示例如下:
IFileMgr* pIFileMgr;
IFile* pIFile;
WebOpt apwoz;
if(ISHELL_CreateInstance(piShell, AEECLSID_FILEMGR, &pIFileMgr)) !=SUCCESS)
goto Failure;
pIFile = IFILEMGR_OpenFile(pIFileMgr, “myCert.cer”, _OFM_READ);
IFILE_Read(pIFile, buffer, sizeof(buffer));
apwoz.nID = WEBOPT_X509_ROOT_CERT;
apwoz.pVal = buffer;
IWEB_AddOpt(pMe->pIWeb, apwoz);
IFILE_Release(pIFile);
IFILEMGR_Release(pIFileMgr);
轉載于:https://blog.51cto.com/wirelesscao/631893
總結
以上是生活随笔為你收集整理的《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之76——BREW中的安全性网络编程...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jquery easy drag
- 下一篇: 8,协议序列化组件NewLife.Ser