| ||||
| ||||
Есть сертификат с полем Subject следующего содержания: E=basilevs@olma.ru, C=RU, O=Олма, CN=clienttest Если ищу сертификат по одному из полей(E или O или CN), то всё в порядке, находится: ... pCert := CertFindCertificateInStore(pCertContext, X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR, pSubjName, nil); ... , где pSubjName содержит одно из полей. А если хочу найти по всем полям в совокупности - не находит: .... bResult := CertStrToName(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, PChar(s), CERT_X500_NAME_STR, nil, nil, @dwSize, ppszError); GetMem(pbNameBlob,dwSize); bResult := CertStrToName(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, PChar(s), CERT_X500_NAME_STR, nil, pbNameBlob, @dwSize, ppszError); pCert := CertFindCertificateInStore(pCertContext, X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_NAME, pbNameBlob, nil); .... , где s = 'E=basilevs@olma.ru, C=RU, O=Олма, CN=clienttest' | ||||
Ответы: | ||||
| ||||
СertStrToName вызовите с флагом CERT_NAME_STR_REVERSE_FLAG. | ||||
| ||||
Изменил текст на следующий: ... bResult := CertStrToName(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, PChar(s), CERT_X500_NAME_STR or CERT_NAME_STR_REVERSE_FLAG, nil, nil, @dwSize, ppszError); GetMem(pbNameBlob,dwSize); bResult := CertStrToName(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, PChar(s), CERT_X500_NAME_STR or CERT_NAME_STR_REVERSE_FLAG, nil, pbNameBlob, @dwSize, ppszError); pCert := CertFindCertificateInStore(pCertContext, X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_NAME, pbNameBlob, nil); .... , где s = 'E=basilevs@olma.ru, C=RU, O=Олма, CN=clienttest' ... Не находит. Причём функция CertStrToName при обоих вызовах возвращает True. | ||||
| ||||
А можно на сам сертификат взглянуть? | ||||
| ||||
Сертификат получен в тестовом центре КриптоПро со следующими параметрами: Имя: clienttest Электронная почта: basilevs@olma.ru Организация: Олма Регион: RU В экспортированном DER - файле имеет вид: 0Вq0Ва R.+ *Е info@cryptopro.ru10 URU10U CRYPTO-PRO10UTest Center CRYPTO-PRO0 060825063945Z 070825064945Z0V10 *ЖHЖў basilevs@olma.ru10 URU10U ╨Ю╨╗╨╝╨░10U clienttest0c0*Е0*Е$ 0 0*Е0U`╟┼┬H_и√4∙░Hн╜КЕ&Б0U%0 +0U#0АHU0╦<"й╫bbdзд╠ЖК0RUK0I0GаEаCЖAhttp://www.cryptopro.ru/certenroll/Test%20Center%20CRYPTO-PRO.crl0Б▐+Б╤0Б╬0d+0ЖXhttp://www.cryptopro.ru/CertEnroll/Crypto.cryptopro.ru_Test%20Center%20CRYPTO-PRO(1).crt01+0Ж%http://www.cryptopro.ru/ocsp/ocsp.srf03+0Ж'http://www.cryptopro.ru/ocspnc/ocsp.srf0 *Е N}ю╗6├Е UлCВшгЛЬ[q░╝┴╢еP 6╙╩e | ||||
| ||||
Ужос в base64 выложите, пожалуйста | ||||
| ||||
-----BEGIN CERTIFICATE----- MIIDcTCCAx6gAwIBAgIKUhcuKwABAAAT8DAKBgYqhQMCAgMFADBlMSAwHgYJKoZI hvcNAQkBFhFpbmZvQGNyeXB0b3Byby5ydTELMAkGA1UEBhMCUlUxEzARBgNVBAoT CkNSWVBUTy1QUk8xHzAdBgNVBAMTFlRlc3QgQ2VudGVyIENSWVBUTy1QUk8wHhcN MDYwODI1MDYzOTQ1WhcNMDcwODI1MDY0OTQ1WjBWMR8wHQYJKoZIhvcNAQkBFhBi YXNpbGV2c0BvbG1hLnJ1MQswCQYDVQQGEwJSVTERMA8GA1UECgwI0J7Qu9C80LAx EzARBgNVBAMTCmNsaWVudHRlc3QwYzAcBgYqhQMCAhMwEgYHKoUDAgIkAAYHKoUD AgIeAQNDAARAwMOM1OQDPB8VR+Z+sXtSWNptHM8Es+rGa8lgo7QAvXvk3IujZEZJ iVz+ZnMWtB3CvY2xYHFq+YwJTxjGq77lmKOCAbkwggG1MA4GA1UdDwEB/wQEAwIE 8DAZBgkqhkiG9w0BCQ8EDDAKMAgGBiqFAwICFTAdBgNVHQ4EFgQUYMfFE8JIX6j7 NPkRsEitvYqFJoEwEwYDVR0lBAwwCgYIKwYBBQUHAwIwHwYDVR0jBBgwFoAUSFUw GMs8IqkX12JiZAWnpMyGihEwUgYDVR0fBEswSTBHoEWgQ4ZBaHR0cDovL3d3dy5j cnlwdG9wcm8ucnUvY2VydGVucm9sbC9UZXN0JTIwQ2VudGVyJTIwQ1JZUFRPLVBS Ty5jcmwwgd4GCCsGAQUFBwEBBIHRMIHOMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3 LmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL0NyeXB0by5jcnlwdG9wcm8ucnVfVGVz dCUyMENlbnRlciUyMENSWVBUTy1QUk8oMSkuY3J0MDEGCCsGAQUFBzABhiVodHRw Oi8vd3d3LmNyeXB0b3Byby5ydS9vY3NwL29jc3Auc3JmMDMGCCsGAQUFBzABhido dHRwOi8vd3d3LmNyeXB0b3Byby5ydS9vY3NwbmMvb2NzcC5zcmYwCgYGKoUDAgID BQADQQAPnZZyl/MTMQlX8BQbu85iKy3vjqf4cX4RxxL4S97QYugKTn3uuzbDhf9V q0OC6BGji5xbcbC8wbalUP8208pl -----END CERTIFICATE----- | ||||
| ||||
Понятно Я ошибся, флаг CERT_NAME_STR_REVERSE_FLAG был лишний. У Вас 2 ошибки: 1) CertFindCertificateInStore в качестве параметра принимает не бинарный буфер, а структуру CERT_NAME_BLOB 2) Когда кодируете строку в ASN.1, используйте флаг CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG, т.к. в сертификате именно UTF8. | ||||
| ||||
Большое спасибо.Теперь находит. | ||||