📄 cacenterpage.cpp
字号:
// CaCenterPage.cpp : implementation file
//
#include "stdafx.h"
#include "MiniCA.h"
#include "CaCenterPage.h"
#include "CaCertIniSetPage.h"
#include "MiniMainDlg.h"
#include ".\GenericClass\Language.h"
#include "MiniCT.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCaCenterPage property page
IMPLEMENT_DYNCREATE(CCaCenterPage, CPropertyPage)
CCaCenterPage::CCaCenterPage() : CPropertyPage(CCaCenterPage::IDD)
{
//{{AFX_DATA_INIT(CCaCenterPage)
m_C = _T("");
m_ST = _T("");
m_L = _T("");
m_O = _T("");
m_OU = _T("");
m_CN = _T("");
m_E = _T("");
m_S = _T("");
m_G = _T("");
m_T = _T("");
//}}AFX_DATA_INIT
m_CertFormat = PEM;
m_ExtName = ".cer";
m_MadePfx = FALSE;
m_IniPathName = ((CMiniCaApp *)AfxGetApp())->GetAppPath() + "\\MiniCA.ini";
m_NameType = 0;
}
CCaCenterPage::~CCaCenterPage()
{
}
void CCaCenterPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCaCenterPage)
DDX_Control(pDX, IDC_STATIC_CN, m_StaticCN);
DDX_Control(pDX, IDC_B_CRL2, m_Bcrl2);
DDX_Control(pDX, IDC_B_MKREQ, m_Bmkreq);
DDX_Control(pDX, IDC_B_MKCERT2, m_Bmkcert2);
DDX_Control(pDX, IDC_B_MKCERT, m_Bmkcert);
DDX_Control(pDX, IDC_B_CRL, m_Bcrl);
DDX_Control(pDX, IDC_B_MKROOT, m_Bmkroot);
DDX_Text(pDX, IDC_EDIT_C, m_C);
DDV_MaxChars(pDX, m_C, 8);
DDX_Text(pDX, IDC_EDIT_ST, m_ST);
DDV_MaxChars(pDX, m_ST, 8);
DDX_Text(pDX, IDC_EDIT_L, m_L);
DDV_MaxChars(pDX, m_L, 16);
DDX_Text(pDX, IDC_EDIT_O, m_O);
DDV_MaxChars(pDX, m_O, 48);
DDX_Text(pDX, IDC_EDIT_OU, m_OU);
DDV_MaxChars(pDX, m_OU, 48);
DDX_Text(pDX, IDC_EDIT_CN, m_CN);
DDV_MaxChars(pDX, m_CN, 48);
DDX_Text(pDX, IDC_EDIT_E, m_E);
DDV_MaxChars(pDX, m_E, 48);
DDX_Text(pDX, IDC_EDIT_S, m_S);
DDV_MaxChars(pDX, m_S, 16);
DDX_Text(pDX, IDC_EDIT_G, m_G);
DDV_MaxChars(pDX, m_G, 16);
DDX_Text(pDX, IDC_EDIT_T, m_T);
DDV_MaxChars(pDX, m_T, 16);
//}}AFX_DATA_MAP
DDX_FileEditCtrl(pDX, IDC_EDIT_PATH, m_DirEdit, FEC_FOLDER);
DDX_FileEditCtrl(pDX, IDC_EDIT4, m_XpEdit4, FEC_FILEOPEN);
// if (m_validate.GetCheck())
// DDV_FileEditCtrl(pDX, IDC_EDIT1);
}
BEGIN_MESSAGE_MAP(CCaCenterPage, CPropertyPage)
//{{AFX_MSG_MAP(CCaCenterPage)
// ON_BN_CLICKED(IDC_B_PATH4, OnBPath4)
ON_BN_CLICKED(IDC_B_CRL, OnBCrl)
ON_BN_CLICKED(IDC_B_MKROOT, OnBMkroot)
ON_BN_CLICKED(IDC_B_MKREQ, OnBMkreq)
ON_BN_CLICKED(IDC_B_MKCERT, OnBMkcert)
ON_BN_CLICKED(IDC_CHECK, OnCheck)
ON_BN_CLICKED(IDC_B_MKCERT2, OnBMkcert2)
ON_BN_CLICKED(IDC_CHECK_P12, OnCheckP12)
ON_BN_CLICKED(IDC_B_CRL2, OnBCrl2)
//}}AFX_MSG_MAP
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipNotify)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCaCenterPage message handlers
BOOL CCaCenterPage::OnToolTipNotify(UINT /*id*/, NMHDR* pTTTStruct, LRESULT* /*pResult*/)
{
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;
UINT nID = pTTTStruct->idFrom;
BOOL bCheckDer = ((CButton * )GetDlgItem(IDC_CHECK))->GetCheck();
BOOL bCheckP12 = ((CButton * )GetDlgItem(IDC_CHECK_P12))->GetCheck();
CString strPwd(""),
strText;
switch(nID)
{
case IDC_B_MKROOT:
strText = CMiniCaApp::NormalCode("制作根证书");
if(bCheckDer)
strText += CMiniCaApp::NormalCode("\rDER格式");
else
strText += CMiniCaApp::NormalCode("\rPME格式");
if(bCheckP12)
strText += CMiniCaApp::NormalCode(",附带PFX包");
if(!strPwd.IsEmpty())
strText += CMiniCaApp::NormalCode(",私钥加密");
_tcscpy(pTTT->szText,_T(strText));//设置
return TRUE;
case IDC_B_MKCERT2:
strText = CMiniCaApp::NormalCode("制作证书");
if(bCheckDer)
strText += CMiniCaApp::NormalCode("\rDER格式");
else
strText += CMiniCaApp::NormalCode("\rPME格式");
if(bCheckP12)
strText += CMiniCaApp::NormalCode(",附带PFX包");
if(!strPwd.IsEmpty())
strText += CMiniCaApp::NormalCode(",私钥加密");
_tcscpy(pTTT->szText,strText);//设置
return TRUE;
case IDC_B_MKREQ:
strText = CMiniCaApp::NormalCode("生成证书请求");
if(bCheckDer)
strText += CMiniCaApp::NormalCode("\rDER格式");
else
strText += CMiniCaApp::NormalCode("\rPME格式");
if(!strPwd.IsEmpty())
strText += CMiniCaApp::NormalCode(",私钥加密");
_tcscpy(pTTT->szText,strText);//设置
return TRUE;
case IDC_B_MKCERT:
strText = CMiniCaApp::NormalCode("通过证书请求制作证书");
if(bCheckDer)
strText += CMiniCaApp::NormalCode("\rDER格式");
else
strText += CMiniCaApp::NormalCode("\rPME格式");
_tcscpy(pTTT->szText,strText);//设置
return TRUE;
}
return FALSE;
}
BOOL CCaCenterPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: Add extra initialization here
// m_CheckP12.SetIcon(IDI_ICON14, IDI_ICON15);
// m_CheckP12.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
if(!((CMiniCaApp *)AfxGetApp())->IsXpStyle())
{
ClassXP(GetDlgItem(IDC_CHECK)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_CHECK_P12)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_COMBO_L)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_EDIT_CN)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_EDIT_PWD)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_EDIT_E)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_EDIT_C)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_EDIT_O)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_EDIT_OU)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_EDIT_ST)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_EDIT_L)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_EDIT_T)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_EDIT_G)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_EDIT_S)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_EDIT_DAY)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_EDIT_SN)->m_hWnd,TRUE);
}
// m_DirEdit.ModifyStyleEx(0, WS_EX_ACCEPTFILES);
// m_DirEdit.SetClientTipText("CString text");
// m_DirEdit.ModifyStyleEx(0, FEC_BUTTONTIP);
// m_DirEdit.ModifyStyleEx(0, FEC_CLIENTTIP);
// m_DirEdit.ModifyFlags(FEC_FILEOPEN, FEC_FOLDER);
HANDLE handle = ::LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDI_ICON_DIR),
IMAGE_ICON,
0,
0,
LR_DEFAULTCOLOR);
m_DirEdit.SetButtonImage(handle, PJAI_ICON | PJAI_AUTODELETE | PJAI_STRETCHED );
m_DirEdit.SetButtonWidth(18);
HANDLE handleCsr = ::LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDI_ICON_VIEW),
IMAGE_ICON,
0,
0,
LR_DEFAULTCOLOR);
m_XpEdit4.SetButtonImage(handleCsr, PJAI_ICON | PJAI_AUTODELETE | PJAI_STRETCHED );
m_XpEdit4.SetButtonWidth(18);
m_XpEdit4.SetCaption(MiniCT_0100); //MiniCT_0100 "选择证书请求文件"
m_XpEdit4.SetFilter(MiniCT_0101); //MiniCT_0101 "证书请求(*.csr)|*.csr|所有文件(*.*)|*.*||"
// m_DirEdit.ModifyFlags(0, FEC_FLAT);
// m_DirEdit.ModifyFlags(FEC_FLAT | FEC_GRAYSCALE, 0);
// m_Bpath.SetIcon(IDI_ICON_DIR);//path
// m_Bpath.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
CXPStyleButtonST::SetAllThemeHelper(this, ((CMiniCaApp *)AfxGetApp())->GetThemeHelperST());
// m_Bpath4.SetIcon(IDI_ICON_VIEW);
// m_Bpath4.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_Bmkreq.SetIcon(IDI_ICON19);
m_Bmkreq.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_Bmkcert2.SetIcon(IDI_ICON_CERT);
m_Bmkcert2.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_Bmkcert.SetIcon(IDI_ICON_VCERT, (int)BTNST_AUTO_GRAY);//req - cert
m_Bmkcert.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_Bcrl.SetIcon(IDI_ICON_MCRL);//CRL
m_Bcrl.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_Bcrl2.SetIcon(IDI_ICON_EDIT);//CRL
m_Bcrl2.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_Bmkroot.SetIcon(IDI_ICON_MROOT);
m_Bmkroot.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
((CButton *)GetDlgItem(IDC_CHECK_P12))->SetCheck(m_MadePfx);
// CG: The following block was added by the ToolTips component. { // Create the ToolTip control. m_toolTip.Create(this); m_toolTip.AddTool(GetDlgItem(IDC_CHECK), CMiniCaApp::NormalCode("证书格式\rDER或PEM格式"));
m_toolTip.AddTool(GetDlgItem(IDC_CHECK_P12), CMiniCaApp::NormalCode("附带PFX包\r制作证书请求(REQ)时无效"));
m_toolTip.AddTool(GetDlgItem(IDC_EDIT_PATH), CMiniCaApp::NormalCode("证书存放路径"));
m_toolTip.AddTool(GetDlgItem(IDC_EDIT4), CMiniCaApp::NormalCode("证书请求存放路径"));
m_toolTip.AddTool(GetDlgItem(IDC_B_CRL2), CMiniCaApp::NormalCode("选择证书作废信息文件\r此文件是记录了作废证\n书序号的文本文件"));
m_toolTip.AddTool(GetDlgItem(IDC_EDITCRL), CMiniCaApp::NormalCode("作废证书序号列表\r以','分割的一系列证书序号"));
m_toolTip.AddTool(GetDlgItem(IDC_B_CRL), CMiniCaApp::NormalCode("制作黑名单"));
m_toolTip.AddTool(GetDlgItem(IDC_B_MKROOT), LPSTR_TEXTCALLBACK);
m_toolTip.AddTool(GetDlgItem(IDC_B_MKCERT2), LPSTR_TEXTCALLBACK);
m_toolTip.AddTool(GetDlgItem(IDC_B_MKREQ), LPSTR_TEXTCALLBACK);
m_toolTip.AddTool(GetDlgItem(IDC_B_MKCERT), LPSTR_TEXTCALLBACK);
// Change the color of one of the tooltips
/* OXTOOLINFO ToolInfo;
if (m_toolTip.GetToolInfo(ToolInfo, GetDlgItem(IDC_CHECK)))
{
ToolInfo.clrBackColor = RGB(255, 255, 255);
ToolInfo.clrTextColor = RGB( 0, 0, 255);
m_toolTip.SetToolInfo(&ToolInfo);
}*/
// TODO: Use one of the following forms to add controls: }
//加载配置信息
//检测是否已经打开,如果打不开,则重新写入
CFile file;
if(!file.Open(m_IniPathName,CFile::modeRead))
{
/*得到配置*/
HRSRC hRsrc = 0;
if(CMiniCaApp::IsBig())
{
hRsrc = FindResource(NULL,MAKEINTRESOURCE(IDR_MINICA_INI_BG),"INI");
}
else
hRsrc = FindResource(NULL,MAKEINTRESOURCE(IDR_MINICA_INI),"INI");
DWORD lenCert = SizeofResource(NULL, hRsrc);
HGLOBAL hgCert=LoadResource(NULL,hRsrc);
LPSTR lpCert=(LPSTR)LockResource(hgCert);
file.Open(m_IniPathName,CFile::modeCreate|CFile::modeWrite); //存文件
{
file.Write(lpCert,lenCert);
}
}
file.Close();
TranslateCT();
char buf[255]={0};
GetPrivateProfileString("CA", "RSALEN","1024",buf,50, m_IniPathName);
//查找加载项是否有效512 768 1024 1536 2048
int index = ((CComboBox *)GetDlgItem(IDC_COMBO_L))->FindString(-1,buf);
if(index == -1)
index = 2;
((CComboBox *)GetDlgItem(IDC_COMBO_L))->SetCurSel(index);
GetPrivateProfileString("CA", "DAY","365",buf,50, m_IniPathName);
SetDlgItemText(IDC_EDIT_DAY,buf);
GetPrivateProfileString("CA", "SN","1",buf,50, m_IniPathName);
SetDlgItemText(IDC_EDIT_SN,buf);
GetPrivateProfileString("CRL", "Revoke","1,2,3",buf,50, m_IniPathName);
SetDlgItemText(IDC_EDITCRL,buf);
// m_StaticCN.SetTextColor(RGB(64,128,0));
/* CMiniMainDlg * pMain = (CMiniMainDlg *)AfxGetMainWnd();
CCertDbPage * pSetup = (CCertDbPage *)(pMain->GetPage("CCertDbPage"));
if(pSetup)
{
CString m_PathName = pSetup->GetCertPath(0);
SetDlgItemText(IDC_EDIT_PATH,m_PathName);
m_Path = m_PathName;
}*/
return TRUE;
}
void CCaCenterPage::OnBMkroot() //制作根证书
{
// TODO: Add your control notification handler code here
GetDlgItemText(IDC_EDIT_PATH, m_Path);
if(m_Path=="")
{
AddMsg(MiniCT_0112,M_WARING); //MiniCT_0112 " 请选择输出路径!"
return;
}
char out[100]={0};
CString str,strSN;
stuSUBJECT * pRoot = NULL;
GetDlgItemText(IDC_EDIT_C,str);
pRoot->Add(pRoot, "C", str);
GetDlgItemText(IDC_EDIT_ST,str);
pRoot->Add(pRoot, "ST", str);
GetDlgItemText(IDC_EDIT_L,str);
pRoot->Add(pRoot, "L", str);
GetDlgItemText(IDC_EDIT_O,str);
pRoot->Add(pRoot, "O", str);
GetDlgItemText(IDC_EDIT_OU,str);
pRoot->Add(pRoot, "OU", str);
CString strCN;
GetDlgItemText(IDC_EDIT_CN,strCN);
if(strCN.IsEmpty())
{
AddMsg(MiniCT_0113,M_WARING); //MiniCT_0113 "请给出个体信息!"
pRoot->RemoveAll(pRoot); //删除证书结构
return;
}
pRoot->Add(pRoot, "CN", strCN);
GetDlgItemText(IDC_EDIT_E,str);
pRoot->Add(pRoot, "emailAddress", str);
GetDlgItemText(IDC_EDIT_T,str);
pRoot->Add(pRoot, "title", str);
GetDlgItemText(IDC_EDIT_G,str);
pRoot->Add(pRoot, "givenName", str);
GetDlgItemText(IDC_EDIT_S,str);
pRoot->Add(pRoot, "SN", str);
GetDlgItemText(IDC_EDIT_DAY,str);
if(str.IsEmpty())
{
AddMsg(MiniCT_0114,M_WARING); //MiniCT_0114 "请给出有效期!"
pRoot->RemoveAll(pRoot); //删除证书结构
return;
}
char certBuf[10240] = {0};
char keyBuf[10240] = {0};
char p12Buf[10240] = {0};
UINT certLen = 10240,
keyLen = 10240,
p12Len = 10240;
GetDlgItemText(IDC_EDIT_SN,strSN);
CString len;
GetDlgItemText(IDC_COMBO_L,len);
CString pwd("");
// GetDlgItemText(IDC_EDIT_PWD,pwd);
CMiniMainDlg * pMain = (CMiniMainDlg *)AfxGetMainWnd();
CCertDbPage * pDb = (CCertDbPage *)(pMain->GetPage("CCertDbPage"));
if(pDb)
{
m_NameType = pDb->GetNameType();
}
CString strName;
if(0 == m_NameType)//用户名
{
strName.Format("\\R%s", strCN);
}
else if(1 == m_NameType)//序号
{
strName.Format("\\R%s", strSN);
}
else if(2 == m_NameType)//用户名 + 序号
{
strName.Format("\\R%s%s", strCN, strSN);
}
else if(3 == m_NameType)//序号 + 用户名
{
strName.Format("\\R%s%s", strSN, strCN);
}
BOOL bRet = MakeRoot(pRoot,"(MiniCA)", atoi(len),atoi(strSN),atoi(str),
pwd.GetBuffer(0),"","",NULL,certBuf,
&certLen,keyBuf,&keyLen,p12Buf,&p12Len,out,m_CertFormat);
pRoot->RemoveAll(pRoot); //删除证书结构
if(bRet)
{
CString outCert = m_Path + strName + "_Cert";
outCert += m_ExtName;
CString outKey = m_Path + strName + "_Key";
outKey += m_ExtName;
CString p12 = m_Path + strName + ".pfx";
FILE * pfc = fopen(outCert,"wb");
if(!pfc)
{
AddMsg(MiniCT_0115,M_ERROR); //MiniCT_0115 "保存根公钥失败"
return;
}
fwrite(certBuf,sizeof(char),certLen,pfc);
fclose(pfc);
pfc = fopen(outKey,"wb");
if(!pfc)
{
AddMsg(MiniCT_0116,M_ERROR); //MiniCT_0116 "保存根私钥失败"
return;
}
fwrite(keyBuf,sizeof(char),keyLen,pfc);
fclose(pfc);
AddMsg(MiniCT_0117); //MiniCT_0117 "根证书制作成功"
if(m_MadePfx)
{
pfc = fopen(p12,"wb");
if(!pfc)
{
AddMsg(MiniCT_0118,M_ERROR); //MiniCT_0118 "保存PFX文件失败"
return;
}
fwrite(p12Buf,sizeof(char),p12Len,pfc);
fclose(pfc);
AddMsg(MiniCT_0119); //MiniCT_0119 "根证书PFX包制作成功"
}
//序号增加一
int iSn = atoi(strSN) + 1;
CString sSn;
sSn.Format("%d",iSn);
WritePrivateProfileString("CA", "SN",sSn,m_IniPathName);
SetDlgItemText(IDC_EDIT_SN,sSn);
}
else
AddMsg(out,M_ERROR);
pwd.ReleaseBuffer();
}
void CCaCenterPage::OnBMkreq() //制作REG
{
// TODO: Add your control notification handler code here
if(m_Path=="")
{
AddMsg(MiniCT_0112,M_WARING); //MiniCT_0112 "请选择输出路径!"
return;
}
char out[100]="";
CString str,strCN;
stuSUBJECT * pReq = NULL;
GetDlgItemText(IDC_EDIT_C,str);
pReq->Add(pReq, "C", str);
GetDlgItemText(IDC_EDIT_ST,str);
pReq->Add(pReq, "ST", str);
GetDlgItemText(IDC_EDIT_L,str);
pReq->Add(pReq, "L", str);
GetDlgItemText(IDC_EDIT_O,str);
pReq->Add(pReq, "O", str);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -