Как указать GN и SN в TSslCertTools при генерации CSR в Delphi?
При работе с SSL/TLS сертификатами в Delphi часто возникает необходимость генерации Certificate Signing Request (CSR) с нестандартными полями Subject, такими как Given Name (GN) и Surname (SN). В этой статье мы разберем, как решить эту задачу с использованием компонента TSslCertTools из библиотеки Internet Component Suite (ICS).
Проблема: Отсутствие стандартных свойств для GN и SN
По умолчанию TSslCertTools предоставляет свойства для основных полей Subject:
// Delphi-пример
var
SslCertTools: TSslCertTools;
begin
SslCertTools := TSslCertTools.Create(nil);
try
SslCertTools.CommonName := 'John Doe';
SslCertTools.GivenName := 'John'; // Новое свойство GN
SslCertTools.Surname := 'Doe'; // Новое свойство SN
SslCertTools.GenerateReq;
// Сохраняем CSR
SslCertTools.SaveReqToFile('request.csr');
finally
SslCertTools.Free;
end;
end;
Важно: Убедитесь, что у вас актуальная версия ICS. Для проверки используйте OverbyteIcsPemtool из папки Samples\delphi\PemTool.
Решение 2: Ручное добавление полей через OID (для старых версий ICS)
Если обновление библиотеки невозможно, используйте низкоуровневые функции OpenSSL:
uses
OverbyteIcsSslX509Utils, OverbyteIcsSslUtils;
procedure AddCustomSubjectEntries;
var
Req: PX509_REQ;
Name: PX509_NAME;
ObjGN, ObjSN: PASN1_OBJECT;
begin
Req := X509_REQ_new();
try
Name := X509_REQ_get_subject_name(Req);
// Добавляем GN (Given Name)
ObjGN := OBJ_txt2obj('2.5.4.42', 1); // OID для GN
X509_NAME_add_entry_by_OBJ(Name, ObjGN, MBSTRING_ASC, 'John', -1, -1, 0);
ASN1_OBJECT_free(ObjGN);
// Добавляем SN (Surname)
ObjSN := OBJ_txt2obj('2.5.4.4', 1); // OID для SN
X509_NAME_add_entry_by_OBJ(Name, ObjSN, MBSTRING_ASC, 'Doe', -1, -1, 0);
ASN1_OBJECT_free(ObjSN);
// Генерируем и сохраняем CSR
// ... (добавьте код для генерации ключа и подписи CSR)
finally
X509_REQ_free(Req);
end;
end;
Как проверить результат
Используйте OpenSSL для просмотра CSR:
openssl req -in request.csr -noout -text
В выводе должны присутствовать:
Subject: GN = John, SN = Doe, CN = John Doe
Альтернативный подход: Расширение TSslCertTools
Для проектов, требующих частого добавления кастомных полей, создайте потомок TSslCertTools:
type
TCustomCertTools = class(TSslCertTools)
private
FGivenName: string;
FSurname: string;
public
procedure GenerateReq; override;
property GivenName: string read FGivenName write FGivenName;
property Surname: string read FSurname write FSurname;
end;
procedure TCustomCertTools.GenerateReq;
begin
inherited;
if FGivenName <> '' then
AddNameEntryByTxt(X509_REQ_get_subject_name(FReq), 'GN', FGivenName);
if FSurname <> '' then
AddNameEntryByTxt(X509_REQ_get_subject_name(FReq), 'SN', FSurname);
end;
Заключение
Для новых проектов используйте обновленную версию ICS с поддержкой GivenName и Surname.
Для legacy-систем применяйте ручное добавление полей через OID.
Всегда проверяйте CSR через OpenSSL или утилиты вроде PemTool.
Примеры кода из статьи работают в Delphi 10.4+ и совместимы с OpenSSL 1.1.x/3.x. Актуальную версию ICS всегда можно найти на официальном GitHub.
Контекст статьи посвящён методам добавления полей Given Name (GN) и Surname (SN) в запрос на подпись сертификата (CSR) при использовании компонента TSslCertTools в Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS