📄 webcertmanpage.cpp
字号:
else if(nSelection == ID_MENUITEM_BATCHMADE)//批量制作
{
BatchCert();
}
else if(nSelection == ID_MENUITEM_REVOKEPFX)//作废PFX
{
RevokeCert(strID);
}
}
catch(CADOException & eAdo)
{
AddMsg(eAdo.GetErrorMessage(), M_ERROR);
return;
}
*pResult = 0;
}
BOOL CWebCertManPage::GetRecordset(CString strId, CADORecordset & pRs)
{
try
{
if(!pRs.IsOpen())
return FALSE;
CString strSql;
strSql.Format("ID = %s", strId);
pRs.FindFirst(strSql);
_variant_t var = pRs.GetBookFind();
UINT uIndex = 1;
if(var.vt)
uIndex = var.dblVal;;
pRs.SetPageSize(Single_RecodePerPage); //设置每页数据个数
pRs.SetAbsolutePage(uIndex);
return TRUE;
}
catch(CADOException & eAdo)
{
AddMsg(eAdo.GetErrorMessage(), M_ERROR);
return FALSE;
}
}
void CWebCertManPage::MadeCsrOnly(CString strID) //仅制作CSR
{
//得到当前记录的ID号
if(!GetRecordset(strID, m_pRs))
return;
CString strUserInfo, strUserPwd;
m_pRs.GetFieldValue("USERINFO", strUserInfo);
m_pRs.GetFieldValue("QUERYPWD", strUserPwd);
long lCertLen = 0;
m_pRs.GetFieldValue("KEYLEN", lCertLen);
char reqBuf[10240] = {0};
char keyBuf[10240] = {0};
char outMsg[256] = {0};
UINT reqLen = 10240,
keyLen = 10240;
CString strSub,
strLeft,
strRight;
stuSUBJECT *pCERT = NULL;
int nCount = 0;
while(AfxExtractSubString(strSub, strUserInfo, nCount++, ' ')) //分解用户信息 strUserInfo Afx 分解 分割
{
int n = strSub.Find('=');
strLeft = strSub.Left(n);
strRight = strSub.Right(strSub.GetLength() - n -1);
pCERT->Add(pCERT, strLeft, strRight);
}
BOOL bReq = MakeReq(pCERT, lCertLen, strUserPwd.GetBuffer(0),
reqBuf, &reqLen, keyBuf, &keyLen, outMsg, PEM);
pCERT->RemoveAll(pCERT); //释放证书结构
strUserPwd.ReleaseBuffer();
if(bReq)
{
m_pRs.Edit();
m_pRs.AppendChunk("CSR", reqBuf, reqLen);
m_pRs.AppendChunk("KEY", keyBuf, keyLen);
m_pRs.SetFieldValue("CERTSTATE", MADECSR); //已经制作CSR
m_pRs.Update();
}
else
{
AddMsg(outMsg, M_ERROR);
}
}
void CWebCertManPage::MarkCert(CString strID)
{
//得到当前记录的ID号
if(!GetRecordset(strID, m_pRs))
return;
m_pRs.Edit();
m_pRs.SetFieldValue("CERTSTATE", MARKCERT);
m_pRs.Update();
}
void CWebCertManPage::CancelMark(CString strID)
{
//得到当前记录的ID号
if(!GetRecordset(strID, m_pRs))
return;
m_pRs.Edit();
//判断CSR字段是否为空
//如果为空
if(m_pRs.IsFieldNull("CSR"))
{
m_pRs.SetFieldValue("CERTSTATE", REQ);
}
else//否则
{
m_pRs.SetFieldValue("CERTSTATE", MADECSR);
}
m_pRs.Update();
}
void CWebCertManPage::MadeCert(CString strID, CADORecordset & pRs)
{
//得到当前记录的ID号
if(!GetRecordset(strID, pRs))
return;
CString strUserInfo,
strUserPwd,
strDay,
strFrendName,
strKeyUsage,
strEkeyUsage;
long lCertLen = 0;
long lCertDay = 0;
long lCertId = 0;
pRs.GetFieldValue("ID", lCertId);
pRs.GetFieldValue("KEYLEN", lCertLen);
pRs.GetFieldValue("DAY", lCertDay);
pRs.GetFieldValue("USERINFO", strUserInfo);
pRs.GetFieldValue("QUERYPWD", strUserPwd);
pRs.GetFieldValue("FRINEDNAME", strFrendName);
pRs.GetFieldValue("KEYUSAGE", strKeyUsage);
pRs.GetFieldValue("KEYEUSAGE", strEkeyUsage);
char reqBuf[10240] = {0};
char certBuf[10240] = {0};
char keyBuf[10240] = {0};
char pfxBuf[10240] = {0};
char outMsg[256] = {0};
UINT reqLen = 10240,
keyLen = 10240,
certLen = 10240,
pfxLen = 10240;
CString strSub,
strLeft,
strRight;
stuSUBJECT *pCERT = NULL;
int nCount = 0;
while(AfxExtractSubString(strSub, strUserInfo, nCount++, ' ')) //分解用户信息 strUserInfo
{
int n = strSub.Find('=');
strLeft = strSub.Left(n);
strRight = strSub.Right(strSub.GetLength() - n -1);
pCERT->Add(pCERT, strLeft, strRight);
}
BOOL bReq = MakeReq(pCERT, lCertLen, strUserPwd.GetBuffer(0),
reqBuf, &reqLen, keyBuf, &keyLen, outMsg, PEM);
pCERT->RemoveAll(pCERT); //释放证书结构
strUserPwd.ReleaseBuffer();
if(bReq) //制作证书
{
DWORD lenCert=0,lenKey=0;//公钥长度,私钥长度
CString strPwd;//公私钥路径或内容,p12密钥
char strCert[10240] = {0};
char strKey[10240] = {0};
if(((CMiniCaApp *)AfxGetApp())->GetRootCert(strCert, lenCert, strKey, lenKey,strPwd))
{
stuCertPair RootPair(strCert,lenCert,strKey,lenKey,
strPwd.GetBuffer(0));
strPwd.ReleaseBuffer();
BOOL bCert = MakeCert(RootPair, lCertId, 0, lCertDay,
reqBuf, reqLen, strKeyUsage.GetBuffer(0),
strEkeyUsage.GetBuffer(0), NULL, certBuf,
&certLen, outMsg, PEM);
char * pPwd = strUserPwd.GetBuffer(0);
if(bCert) //合并P12
{
BOOL bPfx = CreatePfx(pfxBuf, pfxLen, pPwd,
strFrendName.GetBuffer(0),/*IN 好记名称*/
certBuf, certLen,
keyBuf, keyLen, pPwd, outMsg);
strUserPwd.ReleaseBuffer();
if(bPfx)
{
pRs.Edit();
pRs.AppendChunk("CSR", reqBuf, reqLen);
pRs.AppendChunk("KEY", keyBuf, keyLen);
pRs.AppendChunk("CERT", certBuf, certLen);
pRs.AppendChunk("P12", pfxBuf, pfxLen);
pRs.SetFieldValue("CERTSTATE", MADECERT); //已经制作CERT
COleDateTime dataTiem = COleDateTime::GetCurrentTime();
pRs.SetFieldValue("MADETIME", dataTiem);
pRs.Update();
AddMsg(MiniCT_0124); //MiniCT_0124 "生成证书成功"
}
else
{
AddMsg(outMsg, M_ERROR);
}
}
else
{
AddMsg(outMsg, M_ERROR);
}
}
else
{
AddMsg(MiniCT_0123, M_ERROR); //MiniCT_0123 "取得根证书失败"
}
}
else
{
AddMsg(outMsg, M_ERROR);
}
}
void CWebCertManPage::RevokeCert(CString strID)
{
//得到当前记录的ID号
if(!GetRecordset(strID, m_pRs))
return;
m_pRs.Edit();
//判断P12字段是否为空
//如果为空
if(!m_pRs.IsFieldNull("P12"))
{
m_pRs.SetFieldValue("CERTSTATE", REVOKE);
}
}
void CWebCertManPage::BatchCert()
{
CADORecordset* pRs = new CADORecordset(&m_pDb);
try
{
if(pRs->Open("Select * From WebCert Where CERTSTATE = 2 Order by ID", CADORecordset::openQuery))
{
for(;;)
{
CString strID;
pRs->GetFieldValue("ID", strID);
MadeCert(strID, * pRs);
pRs->MoveNext();
if(pRs->IsEof())
break;
}
pRs->Close();
}
}
catch(CADOException & eAdo)
{
AddMsg(eAdo.GetErrorMessage(), M_ERROR);
}
delete pRs;
}
void CWebCertManPage::TranslateCT()
{
CHeaderCtrl * pHeader = m_List.GetHeaderCtrl(); //多页
if (pHeader)
{
CString str = MiniCT_1100;
HDITEM hdi;
hdi.mask = HDI_TEXT;
hdi.pszText = (LPTSTR)((LPCTSTR)str);
pHeader->SetItem(0, &hdi);
str = MiniCT_1101;
hdi.pszText = (LPTSTR)((LPCTSTR)str);
pHeader->SetItem(1, &hdi);
str = MiniCT_1102;
hdi.pszText = (LPTSTR)((LPCTSTR)str);
pHeader->SetItem(2, &hdi);
str = MiniCT_1103;
hdi.pszText = (LPTSTR)((LPCTSTR)str);
pHeader->SetItem(3, &hdi);
str = MiniCT_1104;
hdi.pszText = (LPTSTR)((LPCTSTR)str);
pHeader->SetItem(4, &hdi);
str = MiniCT_1105;
hdi.pszText = (LPTSTR)((LPCTSTR)str);
pHeader->SetItem(5, &hdi);
str = MiniCT_1106;
hdi.pszText = (LPTSTR)((LPCTSTR)str);
pHeader->SetItem(6, &hdi);
}
pHeader = m_ListOne.GetHeaderCtrl(); //单页
if (pHeader)
{
CString str = MiniCT_1107;
HDITEM hdi;
hdi.mask = HDI_TEXT;
hdi.pszText = (LPTSTR)((LPCTSTR)str);
pHeader->SetItem(0, &hdi);
str = MiniCT_1108;
hdi.pszText = (LPTSTR)((LPCTSTR)str);
pHeader->SetItem(1, &hdi);
}
SetDlgItemText(IDC_BCVIEW, MiniCT_11801);
SetDlgItemText(IDC_BQUERY, MiniCT_11802);
//更新单页树内容
int nCountItem = m_ListOne.NumChildren(m_pRootItem);
CStringArray strArray;
strArray.Add(MiniCT_1109); //USERINFO 0 //MiniCT_1109
strArray.Add(MiniCT_1110); //KEYUSAGE 1 //MiniCT_1110 "密钥用途"
strArray.Add(MiniCT_1111); //EKEYSUAGE 2 //MiniCT_1111 "扩展用途"
strArray.Add(MiniCT_1103); //FRINEDNAME 3 //MiniCT_1103 "好记名称"
strArray.Add(MiniCT_1101); //KEYLEN 4 //MiniCT_1101 "密钥长度"
strArray.Add(MiniCT_1106); //INPUTIME 5 //MiniCT_1106 "申请时间"
strArray.Add(MiniCT_1102); //CERTDAY 6 //MiniCT_1102 "有效期"
strArray.Add(MiniCT_1112); //CERTYPE 7 //MiniCT_1112 "证书类型"
strArray.Add(MiniCT_1113); //CERTSTATE 8 //MiniCT_1113 "证书状态"
strArray.Add(MiniCT_1114); //MADETIME 9 //MiniCT_1114 "制作时间"
strArray.Add(MiniCT_1115); //REVOKETIME 10 //MiniCT_1115 "作废时间"
for(int i = 0; i < ReqMaxEntry && i< nCountItem; i++)
{
int iGetCurIndex = m_ListOne.GetCurIndex(m_ItemInfo[i]);
m_ListOne.SetItemText(iGetCurIndex, 0, strArray[i]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -