2012-07-23 26 views
8

Tôi đang cố gắng sử dụng Java để đọc chứng chỉ mà tôi đã nhận được từ bên ngoài. Mã này được ném các lỗi sau:Đọc chứng chỉ X.509 với Java

java.lang.RuntimeException: java.security.cert.CertificateException: Unable to initialize, java.io.IOException: extra data given to DerValue constructor

Mã:

FileInputStream ksfis = new FileInputStream(this.getCertificateFile()); 
ksbufin = new BufferedInputStream(ksfis); 
certificate = (X509Certificate) 
    CertificateFactory.getInstance("X.509").generateCertificate(ksbufin); 

Để đảm bảo vấn đề đã không có trong mã, tôi đã tạo ra một chứng chỉ tự ký và sử dụng nó với mã, và nó hoạt động tốt. Tôi đã cài đặt cả hai chứng chỉ trong chuỗi khóa hệ thống, và cả hai đều hợp lệ. Tôi đang sử dụng máy Mac và Java 1.6.

Bất kỳ ý tưởng nào tại sao tôi nhận được ngoại lệ trên khi tôi tải chứng chỉ của bên ngoài? Bạn có nghĩ rằng nó đã bị hỏng trong quá trình chuyển giao? Nếu nó đã làm, nó không nên hiển thị như là hợp lệ trên hệ thống địa phương, phải không?

+0

Nếu bạn mở nó trong trình soạn thảo văn bản, nó có hiển thị văn bản hoặc rác không? –

+0

Tôi mở mỏ trong trình soạn thảo văn bản và thùng rác hoàn chỉnh của nó và bên thứ ba được sắp xếp gọn gàng bên trong chứng chỉ BEGIN và văn bản chứng chỉ END và nội dung bên trong hai đầu này với == (base64 được mã hóa?) – Java

+0

Sắp xếp gọn gàng như trong '- ---- BẮT ĐẦU CHỨNG NHẬN ----- \ n cơ sở 64 rác \ n ----- GIẤY CHỨNG NHẬN ----- 'Tôi đoán? –

Trả lời

6

Cố gắng gõ này sử dụng openssl, và sau đó nhập kết quả:

openssl x509 -outform der -in certificate.pem -out certificate.der 

hoặc sử dụng chức năng Java Bouncy Castle in the API nhẹ:

http://www.bouncycastle.org/docs/pkixdocs1.5on/org/bouncycastle/openssl/PEMReader.html

Bạn có thể mã hóa kết quả một lần nữa và sau đó sử dụng CertificateBuilder mặc định trong Java để lấy chứng chỉ được xác định JCE.

+0

FWIW, API nhẹ BouncyCastle đã cho tôi một lỗi rất giống nhau. – cmbaron

+0

Không phải tất cả các chứng chỉ đều được tạo bằng nhau, @cmbaron, tôi đã thấy nhiều lỗi mã hóa. Nếu bạn chắc chắn mã của bạn sẽ hoạt động (yêu cầu danh sách gửi thư của Bouncy) thì đó cũng có thể là chứng chỉ của bạn. –