我想问一个关于数字签名的事情,我不太确定。 我没有创建用于签署某些(PDF)文件的自签名证书,而是想获取已经验证过我的数据的SSL证书。
但问题是:SSL证书可以用于数字签名文件还是以某种方式不兼容?
编辑:澄清一下,这个问题不是关于如何签署PDF,只是关于是否可以使用(或以任何方式转换)SSL证书来签署文件。
答案 0 :(得分:4)
要支持数字签名证书,必须在digitalSignature
字段中添加keyUsage
选项(如果您想使用codeSigning
字段设置extendedKeyUsage
字段,则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();
选项。{
可以使用现有工具进行签名或手动签名(例如,您不需要签名,但此代码段可能仍然有用):
keyUsage
使用openssl创建自己的非自签名证书,请参阅this SO answer。
对于签名PDF也很好奇 - 在这种情况下,这些文件的哈希值是不是足够了?
编辑:如果您想要任何标志,而不是现有工具的X.509标志,您可以从您的证书中提取RSA密钥并进行签名而不必担心{{1}}字段。< / p>
答案 1 :(得分:1)
核心证明,证书只是一个普通的RSA公钥,已由多个机构签署。
所以是的,绝对有可能。
虽然我不知道为最终用户提供任何易于使用的广泛工具。
答案 2 :(得分:1)
是的,您可以使用SSL证书签名并验证文件签名
以下是一个例子:
SSLCERT='/XXXX/ssl/certs/fqdn.pem'
SSLKEY='/XXXX/ssl/private_keys/fqdn.pem'
# You might not need to specify a CA
CACERTFILE='/XXXX/ssl/certs/ca.pem'
# File to sign
FILE='YYYYYYY'
# Signs, needs ${SSLKEY} and ${FILE}
openssl dgst -sha512 -sign ${SSLKEY} -out ${FILE}.sha512 ${FILE}
# Then transfer the following files to another server:
# - ${CACERTFILE}
# - ${SSLCERT}
# - ${FILE}
# - ${FILE}.sha512
# Check the certificate is valid
openssl verify -verbose -CAfile ${CACERTFILE} ${SSLCERT}
# Extract the pub key from the cert
openssl x509 -in ${SSLCERT} -pubkey -noout > ${SSLCERT}.pub
# Check the signature
openssl dgst -sha512 -verify ${SSLCERT}.pub -signature ${FILE}.sha512 ${FILE}