2012-03-13 84 views
5

我想問一個關於數字簽名的問題我不是很確定。 而不是創建一個自簽名證書來簽署一些(PDF)文件,我想拿我的SSL證書,其中我的數據已經驗證。SSL證書可以用於數字簽名文件嗎?

但問題是:SSL證書可以用於數字簽名文件還是以某種方式不兼容?

編輯:澄清,這個問題不是關於如何簽署PDF文件,只是關於如果可以使用SSL證書(或以任何方式轉換)來簽署文件。

回答

4

爲了支持數字簽名證書必須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見this SO answer

也對PDF的簽名感到好奇 - 是不是單獨的這些文件的哈希總和足夠你的情況?

編輯:如果你想要的任何跡象,不完全是由現有的工具X.509標誌,你可以提取您的證書RSA密鑰,並沒有理會keyUsage場就簽約。

+0

我將發票稱爲PDF,並且需要對其進行數字簽名才能使其具有法律效力。那麼,在這種情況下,一個簡單的總和是不夠的。 – StormByte 2012-03-15 19:38:46

+0

我已經知道我可以輕鬆地爲此目的製作一個自簽名密鑰,但是爲了避免我的客戶會得到任何警告,如果我這樣做的話。 – StormByte 2012-03-15 19:40:49

1

核心上,證書只是一個正常的RSA公鑰,由多個機構簽署。

所以是的,絕對有可能。

雖然我不知道任何易於使用的最終用戶普遍使用的工具。

+0

謝謝,這是我想知道的。因爲如果可以通過openssl來處理簽名,那麼它就可以工作。 – StormByte 2012-03-14 01:37:31

+1

有關更多信息,請參閱alx3apps答案。您可以這樣做,但除非您在keyUsage中具有digitalSignature選項(或代碼簽名以簽署代碼),否則該簽名可能會被其他實現拒絕。 – mfanto 2012-03-15 19:08:51

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}