| ||||
| ||||
Создаю запрос на CriptoAPI. Не получается сделать так, чтобы в расширении сертификатов было более одного раздела (например Улучшенный ключ и Использование ключа). Поправьте, где ошибка: CERT_REQUEST_INFO CertReqInfo; BOOL bResult; CRYPT_ATTR_BLOB CertAttrBlob[2] = {0}; CERT_ENHKEY_USAGE CertEnhKeyUsage = {0}; CRYPT_BIT_BLOB CertBitBl = {0}; CERT_EXTENSION CertExtEnhKeyUsage = {0}; CERT_EXTENSIONS CertExtentions = {0}; // Раздел Улучшенный ключ CertEnhKeyUsage.cUsageIdentifier = 3; CertEnhKeyUsage.rgpszUsageIdentifier = (LPSTR*)malloc(sizeof(LPSTR)*CertEnhKeyUsage.cUsageIdentifier); CertEnhKeyUsage.rgpszUsageIdentifier[0] = "1.3.6.1.5.5.7.3.4"; CertEnhKeyUsage.rgpszUsageIdentifier[1] = "1.3.6.1.5.5.7.3.2"; CertEnhKeyUsage.rgpszUsageIdentifier[2] = "1.2.643.3.7.1"; bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,X509_ENHANCED_KEY_USAGE,(LPVOID)&CertEnhKeyUsage,NULL,&CertExtEnhKeyUsage.Value.cbData); CertExtEnhKeyUsage.Value.pbData = (LPBYTE)malloc(CertExtEnhKeyUsage.Value.cbData); bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,X509_ENHANCED_KEY_USAGE,(LPVOID)&CertEnhKeyUsage,CertExtEnhKeyUsage.Value.pbData,&CertExtEnhKeyUsage.Value.cbData); free(CertEnhKeyUsage.rgpszUsageIdentifier); CertExtEnhKeyUsage.pszObjId = szOID_ENHANCED_KEY_USAGE; CertExtEnhKeyUsage.fCritical = FALSE; CertExtentions.cExtension = 1; CertExtentions.rgExtension = &CertExtEnhKeyUsage; bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,szOID_CERT_EXTENSIONS,&CertExtentions,NULL,&CertAttrBlob[0].cbData); CertAttrBlob[0].pbData = (LPBYTE)malloc(CertAttrBlob[0].cbData); bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,szOID_CERT_EXTENSIONS,&CertExtentions,CertAttrBlob[0].pbData,&CertAttrBlob[0].cbData); // Раздел Использование ключа CertBitBl.cbData = 4; CertBitBl.pbData = (BYTE*)malloc(4); int rrr = CERT_DIGITAL_SIGNATURE_KEY_USAGE|CERT_NON_REPUDIATION_KEY_USAGE|CERT_KEY_ENCIPHERMENT_KEY_USAGE|CERT_DATA_ENCIPHERMENT_KEY_USAGE; CopyMemory(CertBitBl.pbData,&rrr,4); bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,X509_KEY_USAGE,(LPVOID)&CertBitBl,NULL,&CertExtEnhKeyUsage.Value.cbData); CertExtEnhKeyUsage.Value.pbData = (LPBYTE)malloc(CertExtEnhKeyUsage.Value.cbData); bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,X509_KEY_USAGE,(LPVOID)&CertBitBl,CertExtEnhKeyUsage.Value.pbData,&CertExtEnhKeyUsage.Value.cbData); CertExtEnhKeyUsage.pszObjId = szOID_KEY_USAGE; CertExtEnhKeyUsage.fCritical = TRUE; CertExtentions.cExtension = 1; CertExtentions.rgExtension = &CertExtEnhKeyUsage; bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,szOID_CERT_EXTENSIONS,&CertExtentions,NULL,&CertAttrBlob[1].cbData); CertAttrBlob[1].pbData = (LPBYTE)malloc(CertAttrBlob[1].cbData); bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,szOID_CERT_EXTENSIONS,&CertExtentions,CertAttrBlob[1].pbData,&CertAttrBlob[1].cbData); // Раздел Расширения сертификатов и в него включаю Улучшенный ключ и Использование ключа CRYPT_ATTRIBUTE rgAttrib = {0}; rgAttrib.pszObjId = szOID_CERT_EXTENSIONS; rgAttrib.cValue = 2; rgAttrib.rgValue = CertAttrBlob; CertReqInfo.cAttribute = 1; CertReqInfo.rgAttribute = &rgAttrib; Получается только Использование ключа. | ||||
Ответы: | ||||
| ||||
Все расширения должны лежать в одном атрибуте. Для этого сначала создаете массив расширений, заполяете его и затем кодируете в ASN1. | ||||