2012-03-13 34 views
5

Tôi muốn hỏi một điều về ký kết kỹ thuật số Tôi không chắc lắm. Thay vì tạo chứng chỉ tự ký để sử dụng để ký một số tệp (PDF), tôi muốn lấy chứng chỉ SSL có dữ liệu của tôi đã được xác minh.SSL SSL có thể được sử dụng để ký các tệp kỹ thuật số không?

Nhưng câu hỏi đặt ra là: Chứng chỉ SSL có thể được sử dụng để ký các tệp kỹ thuật số hoặc không tương thích theo một cách nào đó không?

EDIT: Để làm rõ, câu hỏi này không phải là về cách ký các tệp PDF, chỉ là về việc có thể sử dụng chứng chỉ SSL (hoặc chuyển đổi theo bất kỳ cách nào) để ký tệp hay không.

Trả lời

4

Để hỗ trợ chứng chỉ ký kỹ thuật số phải có tùy chọn digitalSignature trong trường keyUsage (và codeSigning tùy chọn này trong trường extendedKeyUsage nếu bạn muốn ký chương trình với nó).

ký có thể được thực hiện với các công cụ hiện có hoặc bằng tay (java Ví dụ, bạn không đòi hỏi điều đó, nhưng đoạn mã này có thể có ích anyway):

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(); 

Để làm giấy chứng nhận không tự ký của riêng bạn với openssl xem this SO answer.

Cũng tò mò về việc ký PDF - không phải là số tiền băm riêng biệt của những tệp này đủ trong trường hợp của bạn?

chỉnh sửa: nếu bạn muốn bất kỳ dấu hiệu nào, không chính xác X.509 ký bằng công cụ hiện có, bạn có thể trích xuất khóa RSA từ cert của mình và ký mà không làm phiền về trường keyUsage.

+0

Tôi đang nói về hóa đơn dưới dạng PDF và chúng được yêu cầu phải được ký điện tử để chúng có giá trị pháp lý. Sau đó, một khoản tiền đơn giản là không đủ trong trường hợp này. – StormByte

+0

Tôi đã biết rằng tôi có thể dễ dàng tạo ra khóa tự ký cho mục đích này, nhưng muốn tránh bất kỳ cảnh báo nào mà khách hàng của tôi sẽ nhận được nếu tôi làm điều đó. – StormByte

1

Tại điểm cốt lõi, chứng chỉ chỉ là khóa công cộng RSA thông thường được một số cơ quan có thẩm quyền ký.

Vì vậy, có, chắc chắn có thể.

Mặc dù tôi không biết bất kỳ công cụ phổ biến nào dễ sử dụng cho người dùng cuối cho việc này.

+0

Cảm ơn, đó là những gì tôi muốn biết. Bởi vì nếu nó có thể được xử lý bởi openssl để ký mọi thứ, thì nó sẽ hoạt động. – StormByte

+1

Xem câu trả lời của alx3apps để biết thêm thông tin. Bạn có thể làm điều đó, nhưng trừ khi bạn có tùy chọn digitalSignature trong keyUsage, (hoặc codeSigning to sign code), chữ ký có thể bị từ chối bởi các triển khai khác. – mfanto

1

Vâng, bạn có thể đăng và xác minh chữ ký các tập tin sử dụng giấy chứng nhận SSL

Dưới đây là một ví dụ:

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} 
Các vấn đề liên quan