首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 使用 CryptoAPI 建立自簽名憑證

     編輯:關於C++

CryptoAPI 架構概覽

Microsoft CryptoAPI 提供三層架構:應用程式層、作業系統層、密碼服務提供者(CSP)層。核心功能包含基本加密、憑證編解碼、憑證存儲管理、簡單/底層訊息處理。

關鍵函式

  • CryptAcquireContext:取得 CSP 控制代碼。
  • CryptGenKey / CryptDeriveKey:產生金鑰。
  • CryptCreateHash / CryptHashData:雜湊運算。
  • CryptEncodeObject / CryptDecodeObject:ASN.1/DER 編解碼。
  • CryptSignAndEncodeCertificate:建立自簽名憑證。

建立自簽名憑證流程

  1. 取得/建立金鑰容器(CryptAcquireContext)。
  2. 產生簽名金鑰對(CryptGenKey, AT_SIGNATURE)。
  3. 編碼憑證主體資訊(CERT_NAME_INFO 等結構)。
  4. 呼叫 CryptSignAndEncodeCertificate 簽名並編碼憑證。
  5. 將憑證匯入信任根憑證存儲(可選)。

程式碼片段(關鍵步驟)

// 取得 CSP
HCRYPTPROV hProv;
CryptAcquireContext(&hProv, _T("MyContainer"), NULL, PROV_RSA_FULL,
                    CRYPT_MACHINE_KEYSET | CRYPT_NEWKEYSET);

// 產生金鑰
HCRYPTKEY hKey;
CryptGenKey(hProv, AT_SIGNATURE, 0x08000000 /* RSA 2048 */, &hKey);

// 簽名編碼憑證
CERT_NAME_BLOB subject = { ... }; // 填入主體資訊
CERT_KEY_GEN_REQUEST_INFO reqInfo = { ... };
CRYPT_ALGORITHM_IDENTIFIER sigAlg = { szOID_RSA_SHA1RSA };
DWORD cbEncoded = 0;
CryptSignAndEncodeCertificate(hProv, AT_SIGNATURE, X509_ASN_ENCODING,
    X509_CERT_TO_BE_SIGNED, &reqInfo, &sigAlg, NULL, NULL, &cbEncoded);
BYTE* pbEncoded = new BYTE[cbEncoded];
CryptSignAndEncodeCertificate(hProv, AT_SIGNATURE, X509_ASN_ENCODING,
    X509_CERT_TO_BE_SIGNED, &reqInfo, &sigAlg, NULL, pbEncoded, &cbEncoded);
// pbEncoded 即為 DER 編碼的自簽名憑證

編譯環境設定

  • 標頭:#include <windows.h> #include <wincrypt.h>
  • 連結庫:Crypt32.lib, Advapi32.lib, CryptUI.lib(視需求)。
  • VC++6.0 需定義 _WIN32_WINNT 0x0400;VS2008+ 不需。

注意事項

  • 金鑰儲存在 CSP 內部,不可直接匯出明文私鑰(需 CryptExportKey 加密匯出)。
  • 自簽名憑證不受第三方信任,僅適用測試/內部環境。
  • 生產環境建議使用 CNG (Cryptography API: Next Generation) 替代舊版 CryptoAPI。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved