12.09.2006 17:55:11Поиск сертификата по полю subject Ответов: 8
Василий
Есть сертификат с полем 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'
 
Ответы:
13.09.2006 11:39:25Kirill Sobolev
СertStrToName вызовите с флагом CERT_NAME_STR_REVERSE_FLAG.
13.09.2006 12:19:25Василий
Изменил текст на следующий:
...
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.
13.09.2006 12:47:26Kirill Sobolev
А можно на сам сертификат взглянуть?
13.09.2006 13:44:16Василий
Сертификат получен в тестовом центре КриптоПро со следующими параметрами:

Имя: clienttest
Электронная почта: basilevs@olma.ru
Организация: Олма
Регион: RU

В экспортированном DER - файле имеет вид:
0Вq0Ва
R.+
*Е
 info@cryptopro.ru1 0 URU10U

CRYPTO-PRO10UTest Center CRYPTO-PRO0
060825063945Z
070825064945Z0V10 *ЖHЖў
 basilevs@olma.ru1 0 URU10U
╨Ю╨╗╨╝╨░10U
clienttest0c0*Е0*Е$
  0
0*Е0U`╟┼┬H_и√4∙░Hн╜КЕ&Б0U% 0
+0U#0АHU0&#9574;<"й&#9579;bbdзд&#9568;ЖК0RUK0I0GаEаCЖAhttp://www.cryptopro.ru/certenroll/Test%20Center%20CRYPTO-PRO.crl0Б&#9616;+Б&#9572;0Б&#9580;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}ю&#9559;6&#9500;Е UлCВшгЛЬ[q&#9617;&#9565;&#9524;&#9570;еP 6&#9561;&#9577;e
13.09.2006 13:52:43Kirill Sobolev
Ужос
в base64 выложите, пожалуйста
13.09.2006 13:57:23Василий
-----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-----
13.09.2006 14:56:35Kirill Sobolev
Понятно
Я ошибся, флаг CERT_NAME_STR_REVERSE_FLAG был лишний.
У Вас 2 ошибки:
1) CertFindCertificateInStore в качестве параметра принимает не бинарный буфер, а структуру CERT_NAME_BLOB
2) Когда кодируете строку в ASN.1, используйте флаг CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG, т.к. в сертификате именно UTF8.
13.09.2006 15:07:44Василий
Большое спасибо.Теперь находит.