Using C++ CryptAPI:CNG Create CSR
Using C++ CryptAPI:CNG Create CSR
正在尝试创建 CSR 并使用注册 API。已成功创建私钥,并向其添加扩展名。但无法让它从中生成 CSR 文本。我收到错误,因为参数/参数无效或文件已存在(HRESULT(
我不想使用 OPENSSL,这取决于 WIN32 加密 API 来生成 csr 和存储证书。
我已经查看了 C# 中的大部分示例。我在C++需要它。 这是我的示例代码 WIN32 C++
CComPtr<IX509CertificateRequestPkcs10> _csrquestpkcs10;
CComPtr<IX509PrivateKey> _privateKey;
CComPtr<ICspInformation> _cspInformation;
CComPtr<ICspInformations> _cspInformations;
CComPtr<IX500DistinguishedName> _distinguishName;
CComPtr<IX509Enrollment> _enroll;
CComPtr<IX509ExtensionKeyUsage> _extensionKeyUsage;
CComPtr<IX509ExtensionEnhancedKeyUsage> _enhancedKeyUsageExtension;
HRESULT hr = _cspInformation.CoCreateInstance(__uuidof(CCspInformation), NULL, CLSCTX_INPROC_SERVER);
if (FAILED(hr)){
return -1;
}
CComBSTR _proividerName(L"Microsoft Enhanced Cryptographic Provider v1.0");
hr = _cspInformation->InitializeFromName(_proividerName);
if (FAILED(hr)){
return -1;
}
hr = _cspInformations.CoCreateInstance(__uuidof(CCspInformations), NULL, CLSCTX_INPROC_SERVER);
if (FAILED(hr)){
return -1;
}
hr = _cspInformations->Add(_cspInformation);
if (FAILED(hr)){
return -1;
}
hr = _privateKey.CoCreateInstance(__uuidof(CX509PrivateKey), NULL, CLSCTX_INPROC_SERVER);
if (FAILED(hr)){
return -1;
}
CComBSTR friendlyName("Certificate");
_privateKey->put_FriendlyName(friendlyName);
CComBSTR description("Certificate for my Server");
_privateKey->put_Description(description);
_privateKey->put_Length(2048);
_privateKey->put_KeySpec(X509KeySpec::XCN_AT_SIGNATURE);
_privateKey->put_KeyUsage(X509PrivateKeyUsageFlags::XCN_NCRYPT_ALLOW_ALL_USAGES);
CComVariant _isMachineContext(true);
_privateKey->put_MachineContext(_isMachineContext.boolVal);
_privateKey->put_CspInformations(_cspInformations);
hr = _privateKey->Create();
_privateKey->Verify(X509PrivateKeyVerify::VerifyAllowUI);
if (FAILED(hr)){
return -1;
}
hr = _csrquestpkcs10.CoCreateInstance(__uuidof(CX509CertificateRequestPkcs10), NULL, CLSCTX_INPROC_SERVER);
CComBSTR _template("");
hr = _csrquestpkcs10->InitializeFromPrivateKey(X509CertificateEnrollmentContext::ContextMachine, _privateKey, _template);
if (FAILED(hr)){
return -1;
}
hr = _extensionKeyUsage.CoCreateInstance(__uuidof(CX509ExtensionKeyUsage), NULL, CLSCTX_INPROC_SERVER);
hr = _extensionKeyUsage->InitializeEncode((X509KeyUsageFlags)(X509KeyUsageFlags::XCN_CERT_DIGITAL_SIGNATURE_KEY_USAGE
|
X509KeyUsageFlags::XCN_CERT_NON_REPUDIATION_KEY_USAGE |
X509KeyUsageFlags::XCN_CERT_KEY_ENCIPHERMENT_KEY_USAGE |
X509KeyUsageFlags::XCN_CERT_DATA_ENCIPHERMENT_KEY_USAGE)
);
CComPtr<IX509Extensions> _extensions;
hr = _csrquestpkcs10->get_X509Extensions(&_extensions);
if (FAILED(hr)){
return -1;
}
hr = _extensions->Add(_extensionKeyUsage);
CComPtr<IObjectId > _objectId;
CComPtr<IObjectIds > _objectIds;
hr = _objectId.CoCreateInstance(__uuidof(CObjectId), NULL, CLSCTX_INPROC_SERVER);
CComBSTR _objId("1.3.6.1.5.5.7.3.2");
_objectId->InitializeFromValue(_objId);
_objectIds.CoCreateInstance(__uuidof(CObjectIds), NULL, CLSCTX_INPROC_SERVER);
_objectIds->Add(_objectId);
hr = _enhancedKeyUsageExtension.CoCreateInstance(__uuidof(CX509ExtensionEnhancedKeyUsage), NULL, CLSCTX_INPROC_SERVER);
_enhancedKeyUsageExtension->InitializeEncode(_objectIds);
_extensions->Add(_enhancedKeyUsageExtension);
hr = _distinguishName.CoCreateInstance(__uuidof(CX500DistinguishedName), NULL, CLSCTX_INPROC_SERVER);
std::string sdn = "CN=AKDEVELOPEMNT,OU=D,O=P,L=PUNE,S=HY,C=IN";
CComBSTR _dn(sdn.c_str());
hr = _distinguishName->Encode(_dn, X500NameFlags::XCN_CERT_X500_NAME_STR);
if (FAILED(hr)){
return -1;
}
hr = _csrquestpkcs10->put_Subject(_distinguishName);
if (FAILED(hr)){
return -1;
}
hr = _enroll.CoCreateInstance(__uuidof(CX509Enrollment), NULL, CLSCTX_INPROC_SERVER);
if (FAILED(hr)){
//PLog::instance()->Log(PLDEBUG, "[%s:%d] Encoding csr failed. %d, %d", __FUNCTION__, __LINE__, GetLastError(), hr);
return -1;
}
hr = _enroll->InitializeFromRequest(_csrquestpkcs10);
if (FAILED(hr)){
return -1;
}
CComBSTR _request;
hr = _enroll->CreateRequest(EncodingType::XCN_CRYPT_STRING_BASE64_ANY, &_request); // NEVER RETURNED S_OK,
if (FAILED(hr)){
_com_error er(hr);
std::wstring error = er.ErrorMessage();
wprintf("%s", error.c_str()); // NEVER
return -1;
}
解决:
由于某种原因,XCN_CRYPT_STRING_BASE64_ANY不是IX509Enrollment::CreateRequest的有效参数。我将其更改为XCN_CRYPT_STRING_BASE64并且一切正常
由于某种原因,XCN_CRYPT_STRING_BASE64_ANY不是IX509Enrollment::CreateRequest的有效参数。我将其更改为XCN_CRYPT_STRING_BASE64并且一切正常
虽然 MSDN 没有提供为什么XCN_CRYPT_STRING_BASE64_ANY参数无效的文档,但我想XCN_CRYPT_STRING_BASE64_ANY用于安装响应,因为它是标志的组合
和
在创建 CSR 时,它需要特定的输出类型,即。XCN_CRYPT_STRING_BASE64或XCN_CRYPT_STRING_BASE64_HEADER
相关文章:
- Using C++ CryptAPI:CNG Create CSR
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 如何在 CSR 矩阵的对角线块中计算每行的非零数
- QThread::create 似乎没有将参数传递给函数
- 为什么"non-standard syntax; use '&' to create a pointer to member"在 CTOR 中使用线程?
- QThread::create running on UI Thread
- 空指针(为缺少的输出数组调用的 create() 在 create,文件 /home/m/OpenCV/modules/
- 使用宏替换工厂模式样式 API 中的"create()"函数
- 如何使用 openssl API 解析 CSR 对象
- 错误:'create'不是 'cv::Tracker' 的成员
- Gtk::Main 和 Gtk::Application::create 有什么区别?
- 如果它被定义为 C++ 类中的成员函数,我得到了"non-standard syntax; use '&' to create a pointer to member"
- libgit2:git_clone() 失败并出现"failed to create ssl object"错误
- 使用c_str时"Use & to create a pointer to a member"
- OGRE-找不到请求的发射极类型.在promentystemmanager中:: _ create -emitter
- Visual Studio 2015:获取"non standard syntax, use '&' to create a pointer to member"错误
- MinGW在代码块中构建时的ar.exe "could not create temporary file whilst writing archive: no more archived files
- Create Eigen::Ref from std::vector
- B2Shape等于0xCDCDCDCD,并在Create灯具时抛出异常