Câu hỏi liên quan đến Lazarus hoặc Delphi. Có cách nào để truy cập chương trình chứng chỉ Root Certificate Authorities đáng tin cậy trong Windows hay không. Tôi biết có công cụ dựa trên GUI trong Windows được gọi là 'mmc.exe', nhưng tôi cần truy cập các tệp chứng chỉ (như .crt hoặc .cer hoặc .pem, v.v.) bằng cú pháp Object Pascal. Bất cứ ai có thể giúp tôi với điều đó?Tôi làm cách nào để truy cập vào chứng chỉ của cơ quan chứng chỉ gốc Windows bằng Delphi?
Trả lời
Như các lựa chọn thay thế, có CAPICOM mà bạn có thể chỉ cần nhập dưới dạng thư viện kiểu ActiveX, nhưng cũng có Windows cũ là Cryptography API.
Ví dụ: đây là dự án thử nghiệm rất cũ của tôi (Gần đây tôi chưa thử nghiệm). Bạn sẽ cần các đơn vị WinCrypt
hoặc JwaWinCrypt
với dịch API có liên quan mà nên có sẵn trên JEDI:
program lstore;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils,
WinCrypt;
var
StoreName: array[0..255] of Char;
hStore: HCERTSTORE;
CertContext: PCertContext;
CertPropId: DWORD;
Data: array[0..511] of Char;
DataLen: DWORD;
i: Integer;
procedure DisplayCertContext(Cert: PCertContext);
var
CertName: array[0..255] of Char;
begin
if CertGetNameString(CertContext, CERT_NAME_EMAIL_TYPE, 0, nil,
CertName, 256) = 0 then
RaiseLastWin32Error;
Writeln('Subject CERT_NAME_EMAIL_TYPE: ', CertName);
if CertGetNameString(CertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil,
CertName, 256) = 0 then
RaiseLastWin32Error;
Writeln('Subject CERT_NAME_SIMPLE_DISPLAY_TYPE: ', CertName);
if CertGetNameString(CertContext, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0, nil,
CertName, 256) = 0 then
RaiseLastWin32Error;
Writeln('Subject CERT_NAME_FRIENDLY_DISPLAY_TYPE: ', CertName);
if CertGetNameString(CertContext, CERT_NAME_EMAIL_TYPE, CERT_NAME_ISSUER_FLAG, nil,
CertName, 256) = 0 then
RaiseLastWin32Error;
Writeln('Issuer CERT_NAME_EMAIL_TYPE: ', CertName);
if CertGetNameString(CertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, CERT_NAME_ISSUER_FLAG, nil,
CertName, 256) = 0 then
RaiseLastWin32Error;
Writeln('Issuer CERT_NAME_SIMPLE_DISPLAY_TYPE: ', CertName);
if CertGetNameString(CertContext, CERT_NAME_FRIENDLY_DISPLAY_TYPE, CERT_NAME_ISSUER_FLAG, nil,
CertName, 256) = 0 then
RaiseLastWin32Error;
Writeln('Issuer CERT_NAME_FRIENDLY_DISPLAY_TYPE: ', CertName);
end;
begin
try
Write('Enter name of store to be listed: ');
Readln(StoreName);
hStore := CertOpenSystemStore(0, StoreName);
if hStore = nil then
RaiseLastWin32Error;
try
CertContext := CertEnumCertificatesInStore(hStore, nil);
while CertContext <> nil do
begin
DisplayCertContext(CertContext);
CertPropId := CertEnumCertificateContextProperties(CertContext, 0);
while CertPropId <> 0 do
begin
DataLen := 512;
// Writeln(Format('CertPropId: %d', [CertPropId]));
case CertPropId of
CERT_KEY_PROV_HANDLE_PROP_ID:
begin
CertGetCertificateContextProperty(CertContext, CertPropId,
@Data[0], DataLen);
Writeln(Format('KEY_PROV_HANDLE: $%.8x', [PDWORD(@Data[0])^]));
end;
CERT_KEY_PROV_INFO_PROP_ID:
begin
CertGetCertificateContextProperty(CertContext, CertPropId,
@Data[0], DataLen);
with PCryptKeyProvInfo(@Data[0])^ do
begin
Writeln(Format('pwszContainerName = %s', [pwszContainerName]));
Writeln(Format('pwszProvName = %s', [pwszProvName]));
Writeln(Format('dwFlags = %d', [dwFlags]));
Writeln(Format('cProvParams = %d', [cProvParams]));
//Writeln(Format('rgProvParam', [rgProvParam]));
Writeln(Format('dwKeySpec = %d', [dwKeySpec]));
end;
Writeln(Format('KEY_PROV_INFO: %d', [@Data[0]]));
end;
CERT_FRIENDLY_NAME_PROP_ID:
begin
CertGetCertificateContextProperty(CertContext, CertPropId,
@Data[0], DataLen);
Writeln(Format('FRIENDLY_NAME: %s', [PChar(@Data[0])]));
end;
CERT_KEY_IDENTIFIER_PROP_ID:
begin
CertGetCertificateContextProperty(CertContext, CertPropId,
@Data[0], DataLen);
Write('KEY_IDENTIFIER: ');
for i := 1 to DataLen do
Write(Format('%.2x ', [PBYTE(@Data[i - 1])^]));
Writeln;
end;
CERT_SHA1_HASH_PROP_ID:
begin
CertGetCertificateContextProperty(CertContext, CertPropId,
@Data[0], DataLen);
Write('SHA1_HASH: ');
for i := 1 to DataLen do
Write(Format('%.2x ', [PBYTE(@Data[i - 1])^]));
Writeln;
end;
CERT_MD5_HASH_PROP_ID:
begin
CertGetCertificateContextProperty(CertContext, CertPropId,
@Data[0], DataLen);
Write('MD5_HASH: ');
for i := 1 to DataLen do
Write(Format('%.2x ', [PBYTE(@Data[i - 1])^]));
Writeln;
end;
else
end;
CertPropId := CertEnumCertificateContextProperties(CertContext,
CertPropId);
end;
CertContext := CertEnumCertificatesInStore(hStore, CertContext);
end;
// if GetLastError <> CRYPT_E_NOT_FOUND then
// RaiseLastWin32Error;
finally
CertCloseStore(hStore, 0);
end;
except
on E: Exception do
begin
ExitCode := 1;
Writeln(Format('[%s] %s', [E.ClassName, E.Message]));
end;
end;
end.
Bạn có thể thực hiện mọi thứ với SecureBlackBox của EldoS. http://www.eldos.com/sbb/
Phần mềm này có vẻ dễ dàng. Nó không dẽ.
Tôi khuyên bạn nên Eldos SecureBlackBox, nhưng có một giải pháp thay thế miễn phí.
Bạn cũng có thể sử dụng thư viện OpenSSL. Bạn sẽ cần một cổng OpenSSL đầy đủ, vì các tiêu đề Indy OpenSSL không đầy đủ. Bạn cũng sẽ cần phải biên dịch một cơ sở dữ liệu các chứng chỉ công khai từ các cơ quan cấp chứng chỉ vì nó không được bao gồm.
Với OpenSSL, bạn sẽ không có quyền truy cập trực tiếp vào kho chứng chỉ Windows. Bạn có thể xuất các chứng chỉ từ Windows hoặc Firefox và nhập chúng.
Eldos SecureBlackBox cung cấp quyền truy cập vào cửa hàng chứng chỉ Windows, bao gồm các phương pháp để xác minh chữ ký ký mã của chương trình.
Bạn có thể bao gồm các tệp nhị phân OpenSSL với sản phẩm Windows của mình và OpenSSL đã được cài đặt và có sẵn trên Mac OS. Vì vậy, OpenSSL là khả thi cho FireMonkey hoặc Lazarus.
OpenSSL là tài liệu khá tốt và bạn có thể tìm thấy rất nhiều ví dụ trực tuyến, mặc dù chủ yếu là trong C hoặc C++. Tôi đã may mắn thực hiện bất cứ điều gì tôi cần với nó. Nó có rất nhiều chức năng để đọc và ghi vào các tệp PEM.
SecureBlackBox chưa có phiên bản FireMonkey, nhưng họ cho biết họ sẽ có một năm tiếp theo (theo diễn đàn của họ). Họ có một phiên bản fpc (miễn phí pascal).
- 1. Truy cập Chứng chỉ Mozilla từ Delphi
- 2. Cách đọc chứng chỉ từ kho chứng chỉ của tôi?
- 3. Làm cách nào để tạo chứng chỉ của tổ chức phát hành chứng chỉ với makecert?
- 4. Làm cách nào để xác thực rằng chứng chỉ được tạo bởi một cơ quan chứng nhận cụ thể?
- 5. Truy xuất chứng chỉ bằng OpenSSL .Net
- 6. Cách cấp quyền tài khoản để truy cập chứng chỉ?
- 7. Tôi làm cách nào để truy cập vào hồ sơ nhận dạng và chứng chỉ bằng iPhone SDK?
- 8. Cài đặt chứng chỉ vào cửa hàng chứng chỉ người dùng Windows Local trong C#
- 9. Cửa hàng chứng chỉ Windows
- 10. Ký ClickOnce bằng chứng chỉ?
- 11. Cài đặt chứng chỉ CA gốc qua mã trên Win32
- 12. Cơ quan cấp chứng chỉ trực tuyến, không thể chọn.
- 13. Cách đăng ký chứng chỉ vào cổng khi chứng chỉ ở vị trí tùy chỉnh bằng netsh
- 14. Làm cách nào để ký một applet Java bằng chứng chỉ trong khóa Mac của tôi?
- 15. Làm thế nào để ký hai dll bằng chứng chỉ?
- 16. Làm cách nào để có danh sách chứng chỉ gốc tin cậy trong Java?
- 17. Tạo chứng chỉ OpenSSL trên Windows
- 18. Làm cách nào để thêm chứng chỉ CA đáng tin cậy (KHÔNG phải chứng chỉ ứng dụng khách) vào HttpWebRequest?
- 19. Lấy chuỗi chứng chỉ
- 20. Chứng chỉ đã nhập vào kho khóa Java, JVM bỏ qua chứng chỉ mới
- 21. Tôi làm cách nào để tạo chứng chỉ cho APK Android Market của mình?
- 22. Chứng chỉ SSL CNAME
- 23. Kịch bản để cài đặt Chứng chỉ SSL trên Cửa hàng chứng chỉ gốc đáng tin cậy
- 24. Với hai chứng chỉ, làm cách nào tôi có thể xác minh rằng một chứng chỉ đã được ký bằng khóa riêng của người khác?
- 25. Làm cách nào để xác thực chứng chỉ X509?
- 26. Chuyển chứng chỉ CERT/PEM sang chứng chỉ PFX
- 27. Nhập Chứng chỉ SSL vào Eclipse
- 28. Tôi làm cách nào để thiết lập chứng chỉ phát triển iphone cho ANOTHER mac
- 29. Lỗi chứng chỉ phân phối: "Chứng chỉ này chưa hợp lệ".
- 30. Lấy danh sách chứng chỉ từ kho chứng chỉ trong C#
Tôi đồng ý với Chris, tôi đã có vinh dự được làm việc với các phiên bản trước đó, và nó đã rất tốt đẹp. Tuy nhiên, tôi không còn quyền truy cập vào nó nữa. Nếu ngân sách của bạn cho phép, hãy mua điều này và làm cho cuộc sống của bạn trở nên dễ dàng. Nó cũng trở nên phức tạp với nhiều gói của họ để nói chuyện với họ để tìm ra chính xác cái nào bạn cần. Nó đi kèm với một phiên bản fpc. –
Gói PKIBlackBox là những gì bạn cần. Tuy nhiên, bạn chỉ cần đi trước và nhận được đầy đủ SecureBlackBox Professional guacamole. Nó không phải là rẻ (hơn một ngàn đô la) nhưng nó là giá trị mỗi penny. –