【发布时间】:2017-10-17 08:06:58
【问题描述】:
THTTPRIO 组件,在 HTTPWebNode 属性中,当您单击 ClientCertificate 时,Delphi 会打开一个表单来选择证书并将其信息加载到组件的属性中。这是windows屏幕吗?如果是,我该如何使用它?今天我使用 SecureBlackBox 将证书加载到组合框中,但我想知道是否可以使用此屏幕。 谢谢
更新
我能够使用 JWAPI 使用 ms 函数 CryptUIDlgSelectCertificateFromStore 来显示对话框。现在我遇到了函数结果 PCCERT_CONTEXT 结构的问题。
var
P: Pointer;
Context: PCCERT_CONTEXT;
Issuer: DATA_BLOB;
function GetDataBlobText(Data: DATA_BLOB): string;
begin
SetString(Result, PAnsiChar(Data.pbData), Data.cbData div SizeOf(AnsiChar));
end;
begin
P := CertOpenSystemStore(0, 'MY');
Context := CryptUIDlgSelectCertificateFromStore(P, 0, PChar('test'), nil, CRYPTUI_SELECT_ISSUEDTO_COLUMN, 0, nil);
if Context <> nil then
begin
Issuer := Context.pCertInfo.Issuer;
ShowMessage((GetDataBlobText(Issuer)));
end;
end;
ShowMessage 中的结果是:
更新2
感谢@RbMm。 获取 ASN 编码字段字符串(Issuer 和 Subject)
var
P: Pointer;
Context: PCCERT_CONTEXT;
Subject: DATA_BLOB;
SubjectStr: string;
size : Cardinal;
begin
P := CertOpenSystemStore(0, PAnsiChar('MY'));
Context := CryptUIDlgSelectCertificateFromStore(P, 0, 'test', 'select certificate',
CRYPTUI_SELECT_ISSUEDTO_COLUMN, 0, nil);
if Context <> nil then
begin
Subject := Context.pCertInfo.Subject;
size := CertNameToStr(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, @Subject, CERT_X500_NAME_STR, 0, 0);
SetString(SubjectStr, PAnsiChar(Subject.pbData), size);
CertNameToStr(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, @Subject, CERT_X500_NAME_STR, PAnsiChar(SubjectStr), size);
Result := SubjectStr;
end;
获取原始数据块的字符串(SerialNumber):
var
SerialNumber: CRYPT_INTEGER_BLOB;
size : Cardinal;
s: PWideChar;
ss: string;
begin
SerialNumber := Context.pCertInfo.SerialNumber;
CryptBinaryToStringW(SerialNumber.pbData, SerialNumber.cbData, CRYPT_STRING_HEX, nil, size);
s := AllocMem(SizeOf(Char) * size);
CryptBinaryToStringW(SerialNumber.pbData, SerialNumber.cbData, CRYPT_STRING_HEX, s, size);
ss := s;
showmessage(ss);
FreeMem(s, SizeOf(Char) * size);
【问题讨论】:
-
使用任务管理器找出显示对话框的进程。使用调试器附加到进程。停止进程并查看堆栈跟踪。您应该能够获取所有 Microsoft 组件的符号,并且从那里您应该能够查看是否有可以使用的 API,或者是否没有。
-
感谢@RbMm,我能够显示对话框。现在我在显示函数的结果时遇到了问题,即 PCCERT_CONTEXT 结构。我会用这个更新我的问题。
标签: windows delphi winapi certificate x509certificate