使用单独的密钥生成 MS CA 证书,C#

MS CA certificate generation with individual keys, C#

目前我正在开发一个 Web 应用程序,它将作为 MS CA 接口用于认证注册。在应用程序生成 csr 并将其发送给 CA 后出现错误。证书应具有以下结构:

Serialnumber = UserId, CN = FirstName SecondName, O = Organization, P = PhoneNumber

这是一个真实的例子:

Serialnumber = 200554041000, CN = John Farel, O = SRL Insign, P = 60182209, C = MD

显示的错误是:

CertEnroll::CX500DistinguishedName::Encode: The string contains an invalid X500 name attribute key, oid, value or delimiter. 0x80092023 (-2146885597)

如果我在 Phone 上删除 P 或更改它,一切顺利,并且正在生成证书。

第二个!! :) 生成证书后,主题 DN 包含所有包而不是序列号和 Phone.

我在 MS Windows Server 2008 上使用 MS CA,CA 加密服务提供商: Microsoft 软件存储提供商,哈希算法:SHA1。

有关更多信息,请发表评论。谢谢期待!

需要知道的几件事:

1) "PhoneNumber" 属性被命名为 "Phone",而不是 "P" 或其他名称。

编辑:

2) 我检查了 SDK,不幸的是,似乎无法在主题中包含 Phone RDN 属性。从头文件中只能添加这些属性:

//+--------------------------------------------------------------------------
// Name properties:

#define wszPROPDISTINGUISHEDNAME   TEXT("DistinguishedName")
#define wszPROPRAWNAME             TEXT("RawName")

#define wszPROPCOUNTRY             TEXT("Country")
#define wszPROPORGANIZATION        TEXT("Organization")
#define wszPROPORGUNIT             TEXT("OrgUnit")
#define wszPROPCOMMONNAME          TEXT("CommonName")
#define wszPROPLOCALITY            TEXT("Locality")
#define wszPROPSTATE               TEXT("State")
#define wszPROPTITLE               TEXT("Title")
#define wszPROPGIVENNAME           TEXT("GivenName")
#define wszPROPINITIALS            TEXT("Initials")
#define wszPROPSURNAME             TEXT("SurName")
#define wszPROPDOMAINCOMPONENT     TEXT("DomainComponent")
#define wszPROPEMAIL               TEXT("EMail")
#define wszPROPSTREETADDRESS       TEXT("StreetAddress")
#define wszPROPUNSTRUCTUREDNAME    TEXT("UnstructuredName")
#define wszPROPUNSTRUCTUREDADDRESS TEXT("UnstructuredAddress")
#define wszPROPDEVICESERIALNUMBER  TEXT("DeviceSerialNumber")

3) 避免在您的 .NET 应用程序中使用 "Microsoft Software Key Storage Provider" 提供程序,因为它是 CNG 提供程序并且 X509Certificate2 不支持 CNG(.NET 可耻)。不过,建议使用 KSP 作为 CA 密钥(当没有 HSM 时)。