27.4.1 开发ActiveX控件

本控件只是个示例,功能比较简单,共有三个方法,本别是获取当前个人存储区证书列表、获取指定证书、使用指定证书签名。在Windows下使用Visual C++ 6.0开发ActiveX控件的步骤如下所示。

1 打开VC6,单击【File|New】命令,弹出【New】对话框。

2)在【Projects】选项卡中,选择【MFC ActiveX ControlWizard】选项,创建一个ActiveX控件。在【Projectname】文本框中,输入项目名称“PKIAppControl”,如图所示。

2)单击【OK】按钮,弹出ActiveX向导对话框,如图所示:

3)使用默认设置,始终单击【Next】按钮,直到创建项目结束。为控件添加方法,如图所示:

添加GetUserList方法,无输入参数,返回值为BSTR。如图所示:

依次添加三个方法:

q      BSTR GetUserList();//获得证书列表

q      BSTR GetUserCert(BSTR sUserName);//根据证书名称获得对应证书(Base64编码)

q      BSTR SignData(BSTR sUserName, BSTR sDataToSign);//根据证书名称对数据签名,返回Base64编码的签名数据

三个函数的实现源码如下所示,主要是调用用第三篇涉及到的CryptoAPI函数。

/*获得系统个人存储区的签名证书列表

返回证书名称列表,格式为 CertName&&&CertName

如:郭靖&&&黄蓉&&&

*/

BSTR CPKIAppControlCtrl::GetUserList()

{

         CString strResult="";

        

         HCERTSTORE hCertStore;

         PCCERT_CONTEXT pCertContext = NULL;

         char pszNameString[256];        

         hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0,

                   CERT_STORE_OPEN_EXISTING_FLAG |

                   CERT_SYSTEM_STORE_CURRENT_USER,

                   L"MY");

         if(hCertStore == NULL)

         {

                   return strResult.AllocSysString();

         }

         while(pCertContext= CertEnumCertificatesInStore(

                   hCertStore,

                   pCertContext))

         {

                   CertGetNameString(pCertContext,CERT_NAME_SIMPLE_DISPLAY_TYPE,0,NULL,pszNameString,128);                

                   strResult +=pszNameString;

                   strResult +="&&&";

         }

         CertCloseStore(hCertStore,0);

         return strResult.AllocSysString();

}

//根据证书名称获得Base64编码的证书

BSTR CPKIAppControlCtrl::GetUserCert(LPCTSTR sUserName)

{

         CString strResult="";

         // TODO: Add your dispatch handler code here

         CString strUserName = sUserName;

        

         HCERTSTORE hCertStore;

         PCCERT_CONTEXT pCertContext = NULL;

         PCRYPT_KEY_PROV_INFO pKeyProvInfo=NULL;

  

         hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0,

                   CERT_STORE_OPEN_EXISTING_FLAG |

                   CERT_SYSTEM_STORE_CURRENT_USER, L"MY");

         if(hCertStore == NULL)

         {

                   return strResult.AllocSysString();

         }

         pCertContext=CertFindCertificateInStore(hCertStore,X509_ASN_ENCODING ,0,CERT_FIND_SUBJECT_STR,strUserName.AllocSysString(),NULL);

         if(pCertContext==NULL)

         {

                   return strResult.AllocSysString();

         }

         char * strCert=NULL;

         DWORD dwCertLen;

          CryptBinaryToString(pCertContext->pbCertEncoded,pCertContext->cbCertEncoded,CRYPT_STRING_BASE64,strCert,&dwCertLen);

         strCert= (char *)malloc(dwCertLen+1);

          CryptBinaryToString(pCertContext->pbCertEncoded,pCertContext->cbCertEncoded,CRYPT_STRING_BASE64,strCert,&dwCertLen);

         strCert[dwCertLen]='/0';

         strResult=strCert;

         free(strCert);

         free(pKeyProvInfo);

       CertFreeCertificateContext(pCertContext);

         CertCloseStore(hCertStore,0);

         return strResult.AllocSysString();

}

//对数据进行签名,返回Base64编码的PKCS1格式的签名数据

BSTR CPKIAppControlCtrl::SignData(LPCTSTR sUserName, LPCTSTR sDataToSign)

{

         CString strResult="";

         // TODO: Add your dispatch handler code here

         CString strUserName = sUserName;

         CString strDataToSign = sDataToSign;

 

         HCERTSTORE hCertStore;

         PCCERT_CONTEXT pCertContext = NULL;

         PCRYPT_KEY_PROV_INFO pKeyProvInfo=NULL;

        DWORD dwLen;

 

        

         hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0,

                   CERT_STORE_OPEN_EXISTING_FLAG |

                   CERT_SYSTEM_STORE_CURRENT_USER, L"MY");

         if(hCertStore == NULL)

         {

                   return strResult.AllocSysString();

         }

         pCertContext=CertFindCertificateInStore(hCertStore,X509_ASN_ENCODING ,0,CERT_FIND_SUBJECT_STR,strUserName.AllocSysString(),NULL);

         if(pCertContext==NULL)

         {

          

                   CertCloseStore(hCertStore,0);

                   return strResult.AllocSysString();

         }

         if(!CertGetCertificateContextProperty(pCertContext,CERT_KEY_PROV_INFO_PROP_ID,pKeyProvInfo,&dwLen))

         {

                   CertFreeCertificateContext(pCertContext);

                   CertCloseStore(hCertStore,0);

                   return strResult.AllocSysString();

         }

         pKeyProvInfo = (PCRYPT_KEY_PROV_INFO)malloc(dwLen);

         if(!CertGetCertificateContextProperty(pCertContext,CERT_KEY_PROV_INFO_PROP_ID,pKeyProvInfo,&dwLen))

         {

                   free(pKeyProvInfo);

                   CertFreeCertificateContext(pCertContext);

                   CertCloseStore(hCertStore,0);

                   return strResult.AllocSysString();

         }

         HCRYPTPROV hProv = 0;

         CString sContainerName = pKeyProvInfo->pwszContainerName;

         CString sProvName = pKeyProvInfo->pwszProvName;

         if(!CryptAcquireContext(

                   &hProv,

                   sContainerName.GetBuffer(0),

                   sProvName.GetBuffer(0),

                   pKeyProvInfo->dwProvType,

                   0))

         {

                   free(pKeyProvInfo);

                    

                   CertFreeCertificateContext(pCertContext);

                   CertCloseStore(hCertStore,0);

                   return strResult.AllocSysString();

         }

         HCRYPTHASH hHash;

         if(!CryptCreateHash(

                   hProv,

                   CALG_SHA1,

                   0,

                   0,

                   &hHash))

         {

                    

                   free(pKeyProvInfo);

                   CryptReleaseContext(hProv,0);

                   CertFreeCertificateContext(pCertContext);

                   CertCloseStore(hCertStore,0);

                   return strResult.AllocSysString();

         }       

         if(!CryptHashData(

                   hHash,

                   (BYTE *)strDataToSign.GetBuffer(0),

                   strDataToSign.GetLength(),

                   0))

         {

                   CryptDestroyHash(hHash);

                   free(pKeyProvInfo);

                   CryptReleaseContext(hProv,0);

                   CertFreeCertificateContext(pCertContext);

                   CertCloseStore(hCertStore,0);

                   return strResult.AllocSysString();

         }

        

         unsigned char Sign[256];

         DWORD dwSignLen;

         if(!CryptSignHash(

                   hHash,

                   pKeyProvInfo->dwKeySpec,

                   NULL,

                   0,

                   NULL,

                   &dwSignLen))

         {

                   CryptDestroyHash(hHash);

                   free(pKeyProvInfo);

                   CryptReleaseContext(hProv,0);

                   CertFreeCertificateContext(pCertContext);

                   CertCloseStore(hCertStore,0);

                   return strResult.AllocSysString();

         }

        

         if(!CryptSignHash(

                   hHash,

                   pKeyProvInfo->dwKeySpec,

                   NULL,

                   0,

                   Sign,

                   &dwSignLen))

         {

                   CryptDestroyHash(hHash);

                   free(pKeyProvInfo);

                   CryptReleaseContext(hProv,0);

                   CertFreeCertificateContext(pCertContext);

                   CertCloseStore(hCertStore,0);

                   return strResult.AllocSysString();

         }

         CryptDestroyHash(hHash);

         free(pKeyProvInfo);

         CryptReleaseContext(hProv,0);

         CertFreeCertificateContext(pCertContext);

         CertCloseStore(hCertStore,0);

 

         char * strSign=NULL;

         DWORD dwStrSignLen=0;

                  

        

         CryptBinaryToString(Sign,dwSignLen,CRYPT_STRING_BASE64,strSign,&dwStrSignLen);

         strSign= (char *)malloc(dwStrSignLen+1);

         CryptBinaryToString(Sign,dwSignLen,CRYPT_STRING_BASE64,strSign,&dwStrSignLen);

         strSign[dwStrSignLen]='/0';

         strResult=strSign;

         free(strSign);

         return strResult.AllocSysString();

}

该控件的工程源码请参考附属光盘,目录“Code/第五篇-电子商务网站应用/PKIAppControl”。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,以下是使用kubeadm部署Kubernetes 1.27.4的步骤: 1. 确认k8s版本和环境:首先,确认您要部署的Kubernetes版本为1.27.4,并确保您的环境满足部署要求,例如操作系统版本、CPU和内存等。 2. 创建配置文件:根据您的需求,创建Kubernetes集群的配置文件,包括证书、网络插件、镜像源等。您可以根据实际情况进行配置。 3. 安装kubeadm:在两台Ubuntu 16.04 64位双核CPU虚拟机上安装kubeadm。您可以使用以下命令安装kubeadm: ```shell sudo apt-get update sudo apt-get install -y kubeadm ``` 4. 初始化Master节点:在其中一台虚拟机上执行以下命令初始化Master节点: ```shell sudo kubeadm init --kubernetes-version=1.27.4 ``` 该命令将会初始化Kubernetes Master节点,并生成一个加入集群的命令。 5. 部署网络插件:根据您的配置文件选择网络插件,这里以flannel为例。在Master节点上执行以下命令部署flannel网络插件: ```shell kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ``` 6. 加入Worker节点:在另一台虚拟机上执行Master节点生成的加入集群的命令,将其加入到Kubernetes集群中: ```shell sudo kubeadm join <Master节点IP>:<Master节点端口> --token <Token值> --discovery-token-ca-cert-hash <证书哈希值> ``` 请将`<Master节点IP>`、`<Master节点端口>`、`<Token值>`和`<证书哈希值>`替换为实际的值。 至此,您已成功使用kubeadm部署了Kubernetes 1.27.4集群。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值