2012-04-25 26 views
14

Tôi có một ứng dụng web, cho phép người dùng tải lên pkcs12. Tôi lưu trữ pkcs12 dưới dạng nhị phân trong cơ sở dữ liệu. Có cách nào để tôi biết nếu giấy chứng nhận trong pkcs12 là tự ký hoặc CA ký?Tìm xem chứng chỉ có được tự ký hay CA ký

Tôi đang chạy một ứng dụng web Java trên tomcat và có openssl theo ý của tôi.

+0

Kiểm tra [answer] của tôi (http://security.stackexchange.com/a/144514/132597) về bảo mật stackexchange. – reddot

Trả lời

9

Có một chút hacky, nhưng lệnh openssl x509 có thể báo cáo cả nhà phát hành và chủ đề. Nếu chủ thể và tổ chức phát hành là giống nhau, nó là tự ký; nếu chúng khác nhau, thì nó được ký bởi một CA. (Nói đúng ra, nhiều chứng chỉ tự ký lớn là cũng là được ký bởi một CA - chính họ.)

Trong khi thử nghiệm lý thuyết này, tôi đã chạy một vài thử nghiệm; nó chạy một cái gì đó như:

cd /etc/ssl/certs 
for f in *.0 ; do openssl x509 -in $f -issuer | head -1 > /tmp/$f.issuer ; openssl x509 -in $f -subject | head -1 > /tmp/$f.subject ; done 
cd /tmp 
sed -i -e s/issuer=// *.issuer 
sed -i -e s/subject=// *.subject 
cd /etc/ssl/certs/ 
for f in *.0 ; do diff -u /tmp/$f.issuer /tmp/$f.subject ; done 

Hy vọng điều này sẽ hữu ích.

+0

Có, tính năng này hoạt động. Tôi đã làm điều này trong Java bằng cách sử dụng bảo mật Java. – Nishan

+1

Bạn có thể cải thiện điều này bằng cách chỉ cần thực hiện 'openssl x509 -in $ f -issuer -ubject' và xóa lệnh' opens' và second 'openssl'. – glyphobet

+0

Bạn nói "nếu chúng khác nhau, thì nó được ký bởi một CA". Tôi nghĩ điều quan trọng cần lưu ý là nó không thực sự. Thông thường, một chứng chỉ được ký bởi nhiều hơn một chứng chỉ trong chuỗi. Ví dụ: Chứng chỉ chính của bạn được ký bởi chứng chỉ thứ hai so với bản thân nó được ký bởi một chứng chỉ khác, v.v. Điều quan trọng là kiểm tra tất cả các chứng chỉ trong chuỗi để đảm bảo xác nhận chứng chỉ đầu tiên. Khác nó là một kỹ thuật tuyệt vời. cảm ơn! – jumojer

0

Bạn đã thử BouncyCastle lib chưa?

http://www.bouncycastle.org/wiki/display/JA1/Frequently+Asked+Questions

" Có những chương trình ví dụ cụ thể để đối phó với Attribute Certificates, pkcs12, smime và OpenPGP Họ có thể được tìm thấy trong các gói:.

org.bouncycastle.jce.examples org. bouncycastle.mail.smime.examples org.bouncycastle.openpgp.examples Một nguồn hữu ích của ví dụ là các gói thử nghiệm:

org.bouncycastle.crypto.test org.bouncycastle.jce.provider.test org.bouncycastle.cms.test org.bouncycastle.mail.smime.test org.bouncycastle.openpgp.test org.bouncycastle.cert.test org.bouncycastle.pkcs .test org.bouncycastle.tsp.test "

11

Tiếp theo chủ đề email chính xác cho đúng cách để xác minh nếu mã hóa base64 chứng chỉ (tức là PEM) là tự ký kết hoặc không: http://marc.info/?l=openssl-users&m=116177485311662&w=4

Sau đây là đoạn mã:

openssl verify -CAfile self_signed_cert.pem self_signed_cert.pem 

nên quay lại:

self_signed_cert.pem: OK 

HOẶC so sánh tổ chức phát hành và chủ đề. Nếu họ cùng, nó là tự ký

openssl x509 -in cert.pem -inform PEM -noout -subject -issuer 
0

Java là không thể để phân tích PKCS12 để bạn phải chuyển nó sang keystore sử dụng openssl.

Tại đây kho khóa có cả khóa cá nhân và chứng chỉ X509 (hoặc bạn có thể chọn chỉ lưu trữ chứng chỉ). Sau đó, hãy lấy nhà phát hành từ keystore bằng cách sử dụng API JAVA tiêu chuẩn và xác minh nhà phát hành theo cách thủ công.