THTTPRIO-Komponente, in der HTTPWebNode -Eigenschaft, wenn Sie in ClientCertificate klicken, öffnet Delphi ein Formular, um das Zertifikat auszuwählen und seine Informationen in den Eigenschaften der Komponente zu laden. Ist das ein Windows-Bildschirm? Wenn ja, wie kann ich es benutzen? Heute verwende ich SecureBlackBox, um die Zertifikate in einer Combobox zu laden, aber ich würde gerne wissen, ob es möglich ist, diesen Bildschirm zu verwenden. DankWie rufe ich den Standard-Windows-Bildschirm auf, um ein Zertifikat auszuwählen?
UPDATE
konnte ich den Dialog zeigen, die ms Funktion CryptUIDlgSelectCertificateFromStore Verwendung JWAPI verwenden. Jetzt habe ich Probleme mit dem Ergebnis der Funktion, der PCCERT_CONTEXT-Struktur.
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;
Das Ergebnis in Showmessage ist:
UPDATE2
Dank @RbMm. Um Zeichenfolge von ASN Codierung Felder (Issuer und Betreff)
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;
Um die Zeichenfolge von Rohdatenblock (Serial) zu erhalten:
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);
Task-Managers, um herauszufinden, welcher Prozess der Dialog angezeigt wird. Mit einem Debugger an den Prozess anhängen. Stoppen Sie den Prozess und schauen Sie sich den Stack-Trace an. Sie sollten in der Lage sein, Symbole für alle Microsoft-Komponenten zu erhalten, und von dort sollten Sie in der Lage sein, zu sehen, ob es eine API gibt, die Sie verwenden können, oder wenn nicht. –
Dieser Dialog wird erstellt von [CryptUIDlgSelectCertificateFromStore] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa380288 (v = vs.85) .aspx) – RbMm
Dank @RbMm, konnte ich zeige den Dialog an. Jetzt habe ich Probleme beim Anzeigen des Ergebnisses der Funktion, der PCCERT_CONTEXT-Struktur. Ich werde meine Frage damit aktualisieren. –