Изменение с цифровой подписью «Имя владельца ключа» - PullRequest
0 голосов
/ 20 октября 2019

Я подписываю PDF с itext5

MakeSignature.signDetached(appearance, digest, pks, chain, crlList, ocspClient, tsaClient, estimatedSize, subfilter);

Сгенерированный текст: Цифровая подпись ДЖОНА МОРГАНА + отметка времени

при редактировании Layer2Text

appearance.setLayer2Text("Signed by ");

Я получаю только: Подписано (без имени).

Мне нужно отредактировать «Цифровую подпись», но я хочу сохранить имя владельца ключа

Как я могу получитьимя владельца ключа?

Я пытался использовать псевдоним (используется для получения ключа из хранилища ключей), но это неправильное имя (содержит специальные символы)

KeyStore keyStore = .....;
PrivateKey pk = (PrivateKey) ks.getKey(alias, null);

Спасибо

1 Ответ

0 голосов
/ 21 октября 2019

Если вы установите текст слоя 2, вы должны будете установить весь текст слоя 2, то есть не только "Signed by ", но "Signed by JOHN MORGAN + Timestamp".

Поскольку iText является открытым исходным кодом,Вы можете просто скопировать и вставить и манипулировать кодом iText для генерации текста слоя 2. Ответственный код iText:

String text;
if (layer2Text == null) {
    StringBuilder buf = new StringBuilder();
    buf.append("Digitally signed by ");
    String name = null;
    X500Name x500name = CertificateInfo.getSubjectFields((X509Certificate)signCertificate);
    if (x500name != null) {
        name = x500name.getField("CN");
        if (name == null)
            name = x500name.getField("E");
    }
    if (name == null)
        name = "";
    buf.append(name).append('\n');
    SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z");
    buf.append("Date: ").append(sd.format(signDate.getTime()));
    if (reason != null)
        buf.append('\n').append(reasonCaption).append(reason);
    if (location != null)
        buf.append('\n').append(locationCaption).append(location);
    text = buf.toString();
}
else
    text = layer2Text;

(из PdfSignatureAppearance.getAppearance())

Замена ссылок на защищенные элементы геттерами и константами и удаление "Digitally " из этого кода приводит кв чем-то, что вы можете использовать для своей задачи:

StringBuilder buf = new StringBuilder();
buf.append("Signed by ");
String name = null;
X500Name x500name = CertificateInfo.getSubjectFields((X509Certificate)chain[0]);
if (x500name != null) {
    name = x500name.getField("CN");
    if (name == null)
        name = x500name.getField("E");
}
if (name == null)
    name = "";
buf.append(name).append('\n');
SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z");
buf.append("Date: ").append(sd.format(appearance.getSignDate().getTime()));
if (appearance.getReason() != null)
    buf.append('\n').append("Reason: ").append(appearance.getReason());
if (appearance.getLocation() != null)
    buf.append('\n').append("Location: ").append(appearance.getLocation());
appearance.setLayer2Text(buf.toString());

(из CreateSignature test signWithCustomLayer2Text)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...