2013-08-16 44 views
5

Tôi đã đập đầu của tôi chống lại điều này trong một vài ngày và hoàn toàn stumped. Dưới đây là tóm tắt:jarsigner -verify hoạt động trong Java 6 nhưng không phải Java 7

  1. Tôi đã có một dự án Eclipse plugin sử dụng Tycho để xây dựng qua Maven 3
  2. Trong Maven tôi đã có maven-jarsigner-plugin thiết lập để ký lọ sử dụng keystore của tôi (xem dưới đây để biết chi tiết keystore)
  3. tôi đã có một mã ký cert đó được ký bởi Thawte trong keystore của tôi

tôi có thể lấy bất kỳ file jar ký từ mục tiêu/* và chạy 'jarsigner -verify' vào nó . Đây là những gì sẽ xảy ra:

#java 6 on a VM 
[email protected]:/vagrant/com.example.plugins.eclipse/target$ jarsigner -verify com.example.eclipse-0.1.3-SNAPSHOT.jar 
jar verified. 

Tiếp theo:

#java 7 on a completely different vm 
[email protected]:/vagrant$ jarsigner -verify com.example.eclipse-0.1.3-SNAPSHOT.jar 
jar verified. 

Warning: 
This jar contains entries whose certificate chain is not validated. 

Re-run with the -verbose and -certs options for more details. 

Tôi đã chăm sóc không sử dụng một máy tính với cả hai Java6 và Java7 cài đặt, vì vậy nó không this issue

Tôi cũng don' Tôi tin rằng đó là thuật toán dựa trên, như được mô tả trong this issue, vì tôi có thể ký dự án bằng cách sử dụng Java 6 hoặc Java 7 và nó luôn luôn xác minh trong Java6 và không bao giờ xác minh trong Java7, bất kể môi trường nào tôi đã ký các lọ bằng.

Dưới đây là đầu ra của keytool -list

Keystore type: JKS 
Keystore provider: SUN 

Your keystore contains 3 entries 

root, Aug 11, 2013, trustedCertEntry, 
Certificate fingerprint (SHA1): 91:C6:D6:EE:3E:8A:C8:63:84:E5:48:C2:99:29:5C:75:6C:81:7B:81 
intermediate, Aug 11, 2013, trustedCertEntry, 

tôi phải tin rằng đây là một vấn đề chuỗi chứng chỉ bởi vì tôi có thể xác minh jar bằng cách sử dụng lệnh sau trên Java 7:

jarsigner -verify -keystore keystore com.example.eclipse-0.1.3-SNAPSHOT.jar 

Rõ ràng là tôi không thể có mọi người dùng plugin của mình bằng cách sử dụng tệp kho khóa của tôi, vì vậy đó không phải là giải pháp. Nó tuy nhiên, củng cố rằng tôi có một vấn đề chuỗi cert trong Java 7. Suy nghĩ?

+0

Bạn có thể chạy lại bằng các tùy chọn -truy cập và tùy chọn và đăng đầu ra không? – sErVerdevIL

Trả lời

3

Vài tháng sau, tôi tình cờ tìm ra câu trả lời cho câu hỏi của riêng mình. Đối với bất cứ ai khác với cùng một vấn đề, đây là những gì tôi đã làm:

  1. Chuyển đổi khóa bí mật hiện tại của bạn và CA cert ký sang một định dạng pkcs12 (điều này là cần thiết kể từ keytool Java không cho phép nhập khẩu trực tiếp những mặt hàng này). Điều này có thể được thực hiện trong một lệnh openssl duy nhất:

    openssl pkcs12 -export -name signing -in signing.cert -inkey myPrivateKey.key -out keystore.p12 
    

    đâu ký là tên của keystore pkcs12 tôi, signing.cert là CA của tôi đi kèm Làm cert ký, và (rõ ràng) myPrivateKey.key là chìa khóa riêng tư của tôi đó là được sử dụng để ký Giấy chứng nhận.

  2. nhập này keystore mới được tạo thành một keystore Java:

    keytool -importkeystore -destkeystore keystore -srckeystore keystore.p12 -srcstoretype pkcs12 -alias signing 
    
  3. Nhập cert Java CA của bạn vào keystore. Tôi không chắc chắn chính xác những gì ma thuật này không nhưng không có nó chuỗi cert không được theo sau (ngay cả khi tự thêm certs trung gian). Chứng chỉ này thường được cung cấp qua email nơi chứng nhận ký gửi của bạn đến. Đối với mục đích của chúng tôi, nó được gọi là signing.pkcs7.

    keytool -importcert -file signing.pkcs7 -keystore keystore -v -alias signing 
    

    Bạn sẽ phải nhập mật khẩu kho khóa bạn đã sử dụng khi tạo kho khóa Java.

  4. Sử dụng trình cắm maven-jarsigner (hoặc bất kỳ tự động hóa nào được yêu cầu) để ký dự án của bạn trong quá trình xây dựng.

4

Nó hoạt động. Bạn nhận được "jar xác minh" trong cả hai trường hợp => JAR được xác minh trong cả hai trường hợp. Điều đó có nghĩa rằng JAR đã được ký bởi người mà nó tuyên bố được ký bởi, và rằng JAR đã không được sau đó giả mạo.

Java 7 đang in cảnh báo .

+1

Tôi không coi nó hoạt động khi chuỗi chứng chỉ không thể được xác thực. –

+0

'jarsigner -verify' hoạt động cho tôi, không có thông báo đó. Chuỗi chứng chỉ của bạn có thể không hoạt động cho bạn, tách biệt vấn đề. – EJP

+1

Chuỗi chứng chỉ không phải là vấn đề riêng biệt, đó là vấn đề *. Các công cụ jarsigner hút tại cho một đường mòn thông tin phong nha và tôi đang tìm kiếm các đề xuất trong gỡ lỗi nó. –

8

Câu trả lời cho vấn đề của bạn là bạn đang sử dụng SUN làm nhà cung cấp kho khóa java 6 của bạn được phát hành trước khi mua oracle mua SUN và java 7 được phát hành sau và nhiều gói Sun hiện không còn được dùng nữa. Bạn có thể xác minh điều này here.

Oracle đã tiếp tục hỗ trợ cho nhà cung cấp khóa cửa hàng SUN không được chấp nhận nhưng giờ yêu cầu cảnh báo phải được phát hành giống như khi bạn đã sử dụng bất kỳ tính năng không được chấp nhận nào.

Có một mô tả chi tiết dài được viết bởi Oracle về lý do bạn không nên sử dụng nhà cung cấp SUN để đăng nhập bảo mật trong JCA Documentation trên trang web của họ.

Điều duy nhất sẽ "sửa" điều này là thay đổi nhà cung cấp kho khóa của bạn thành và oracle chấp nhận được, bạn có thể tìm thấy chúng trong cùng một tài liệu bảo mật được liên kết ở trên.

Hy vọng điều đó sẽ hữu ích.