Для поддержки сертификата цифровой подписи необходимо иметь параметр digitalSignature
в своем поле keyUsage
(и параметр codeSigning
в своем поле extendedKeyUsage
, если вы хотите подписывать программы с ним).
Подписание может быть выполнено с помощью существующих инструментов или вручную (например, Java, вы не просите об этом, но этот фрагмент кода может быть полезен в любом случае):
byte[] bytesToSign = loadMyData();
KeyStore ks = KeyStore.getInstance("pkcs12", "SunJSSE");
ks.load(new FileInputStream("cert.p12"), "passwd1".toCharArray());
PrivateKey privateKey = (PrivateKey) ks.getKey("myalias", "passwd2".toCharArray());
Signature sig = Signature.getInstance("SHA1withRSA", ks.getProvider());
sig.initSign(privateKey);
sig.update(bytesToSign);
byte[] signature = sig.sign();
Чтобы сделать свой собственный самозаверяющий сертификат с помощью openssl, см. этот ответ SO .
Также любопытно, подписать ли PDF-файлы - не достаточно ли отдельных хеш-сумм этих файлов в вашем случае?
edit: если вам нужен какой-либо знак, а не точно знак X.509 существующими инструментами, вы можете извлечь ключ RSA из вашего сертификата и выполнить подпись, не беспокоясь о поле keyUsage
.