Chuyển đổi kho khóa Java thành định dạng PEM


132

Tôi đang cố gắng chuyển đổi từ tệp kho khóa Java thành tệp PEM bằng cách sử dụng keytool và các ứng dụng openssl. Nhưng tôi không thể tìm thấy một cách tốt để thực hiện chuyển đổi. Có ý kiến ​​gì không?

Thay vì chuyển đổi kho khóa trực tiếp thành PEM, trước tiên tôi đã thử tạo tệp PKCS12 và sau đó chuyển đổi thành tệp PEM và Kho lưu trữ có liên quan. Nhưng tôi không thể thiết lập kết nối bằng cách sử dụng chúng. (Lưu ý rằng tôi chỉ cần tệp PEM và tệp Keystore để thực hiện kết nối được bảo mật. Không có hạn chế nào như "Bắt đầu từ tệp kho khóa java". :) Vì vậy, bắt đầu từ các định dạng khác có thể chấp nhận được với trường hợp của tôi)

Nhưng một phương pháp chuyển đổi trực tiếp từ jks sang pem là tốt hơn.

Câu trả lời:


214

Điều này khá đơn giản, sử dụng jdk6 ít nhất ...

bash $ keytool -keystore foo.jks -genkey Pair -alias foo \
        -Name 'CN = foo.example.com, L = Melbourne, ST = Victoria, C = AU'
Nhập mật khẩu kho khóa:  
Nhập lại mật khẩu mới: 
Nhập mật khẩu chính cho 
        (TRẢ LẠI nếu giống như mật khẩu lưu trữ khóa):  
bash $ keytool -keystore foo.jks -exportcert -alias foo | \
       openssl x509 -inform der -text
Nhập mật khẩu kho khóa: asdasd
Chứng chỉ:
    Dữ liệu:
        Phiên bản: 3 (0x2)
        Số sê-ri: 1237334757 (0x49c03ae5)
        Thuật toán chữ ký: dsaWithSHA1
        Tổ chức phát hành: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Hiệu lực
            Không phải trước: 18 tháng 3 00:05:57 2009 GMT
            Không phải sau: 16 tháng 6 00:05:57 2009 GMT
        Chủ đề: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Thông tin khóa công khai:
            Thuật toán khóa công khai: dsaEncoding
            Khóa công khai DSA:
                quán rượu: 
                    00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14:
                    7e: a6: 2e: 5a: 45: f9: 2f: b5: 2d: f4: 34: 27: e6: 53: c7:
 

bash $ keytool -importkeystore -srckeystore foo.jks \
       -destkeystore foo.p12 \
       -srcstoretype jks \
       -deststoretype pkcs12
Nhập mật khẩu kho khóa đích:  
Nhập lại mật khẩu mới: 
Nhập mật khẩu kho khóa nguồn:  
Nhập cho bí danh foo nhập thành công.
Đã hoàn thành lệnh nhập: 1 mục nhập thành công, 0 mục không thành công hoặc bị hủy

bash $ openssl pkcs12 -in foo.p12 -out foo.pem
Nhập mật khẩu nhập:
MAC xác minh OK
Nhập cụm từ PEM:
Xác minh - Nhập cụm từ PEM:

bash $ openssl x509 -text -in foo.pem
Chứng chỉ:
    Dữ liệu:
        Phiên bản: 3 (0x2)
        Số sê-ri: 1237334757 (0x49c03ae5)
        Thuật toán chữ ký: dsaWithSHA1
        Tổ chức phát hành: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Hiệu lực
            Không phải trước: 18 tháng 3 00:05:57 2009 GMT
            Không phải sau: 16 tháng 6 00:05:57 2009 GMT
        Chủ đề: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Thông tin khóa công khai:
            Thuật toán khóa công khai: dsaEncoding
            Khóa công khai DSA:
                quán rượu: 
                    00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14:
                    7e: a6: 2e: 5a: 45: f9: 2f: b5: 2d: f4: 34: 27: e6: 53: c7:
 

bash $ openssl dsa -text -in foo.pem
đọc khóa DSA
Nhập cụm từ PEM:
Khóa riêng: (1024 bit)
riêng tư:
    00: 8f: b1: af: 55: 63: 92: 7c: d2: 0f: e6: f3: a2: f5: ff:
    1a: 7a: phong: 8c: 39: đ
quán rượu: 
    00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14:
    7e: a6: 2e: 5a: 45: f9: 2f: b5: 2d: f4: 34: 27: e6: 53: c7:



Bạn kết thúc với:

  • foo.jks - kho khóa ở định dạng java.
  • foo.p12 - kho khóa ở định dạng PKCS # 12.
  • foo.pem - tất cả các khóa và certs từ kho khóa, ở định dạng PEM.

(Tập tin cuối cùng này có thể được chia thành các khóa và chứng chỉ nếu bạn muốn.)


Tóm tắt lệnh - để tạo kho khóa JKS:

keytool -keystore foo.jks -genkeypair -alias foo \
    -dname 'CN=foo.example.com,L=Melbourne,ST=Victoria,C=AU'

Tóm tắt lệnh - để chuyển đổi kho khóa JKS thành kho khóa PKCS # 12, sau đó thành tệp PEM:

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

nếu bạn có nhiều chứng chỉ trong kho khóa JKS của mình và bạn chỉ muốn xuất chứng chỉ và khóa được liên kết với một trong các bí danh, bạn có thể sử dụng biến thể sau:

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcalias foo \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

Tóm tắt lệnh - để so sánh kho khóa JKS với tệp PEM:

keytool -keystore foo.jks -exportcert -alias foo | \
   openssl x509 -inform der -text

openssl x509 -text -in foo.pem

openssl dsa -text -in foo.pem

12
Chứng chỉ tin cậy không được hỗ trợ trong phương thức này: đây là một hạn chế của định dạng PKS12 mà tôi tin rằng hãy xem: java.sun.com/javase/6/docs/technotes/guides/security/jsse/ tựa (phần trên java.security.KeyStoreException : TrustedCertEntry không được hỗ trợ)
andygavin

2
Tôi có một tập tin JKS cũ hơn. Tôi không thể xuất bằng phương pháp trên. Cuối cùng tôi đã có thể làm điều đó bằng cách đặt keytool arg '-destkeypass' thành một giá trị giả. 'keytool' thậm chí còn nhắc nhở cảnh báo rằng nó đang bỏ qua giá trị Destkeypass? Không có kỹ thuật khác sẽ làm việc. Sử dụng các lời nhắc không hoạt động, chỉ hoạt động từ đối số dòng lệnh. Phải là một lỗi trong xuất PKCS12, bất cứ ai có thể nhận xét?
cmcginty

4
"openssl pkcs12 -in foo.p12 -out foo.pem" đưa ra lỗi sau Nhập mật khẩu nhập: MAC đã xác minh OK Lỗi xuất mã khóa và chứng chỉ 139848775526048: error: 06065064: thói quen phong bì kỹ thuật số: EVP_DecryptFinal_ex: mã hóa sai : 139848775526048: lỗi: 23077074: các thói quen PKCS12: PKCS12_pbe_crypt: pkcs12 lỗi mã hóa: p12_decr.c: 104: 139848775526048: lỗi: 2306A075: PKCS12 Giải pháp cho điều này là gì?
Udara SS Liyanage 18/03/13

1
Một cảnh báo cho người khác, lệnh keytool phải mất một lúc để hoàn thành vì một số lý do, tôi đã phải đợi 30 giây cho đến khi xuất xong
Nicolas Mommaerts

1
@ UdaraS.SLiyanage: xem câu trả lời của Casey cho giải pháp
Nicolas Mommaerts

29

Tôi liên tục gặp lỗi từ opensslkhi sử dụng lệnh của StoBor:

MAC verified OK
Error outputting keys and certificates
139940235364168:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:535:
139940235364168:error:23077074:PKCS12 routines:PKCS12_pbe_crypt:pkcs12 cipherfinal error:p12_decr.c:97:
139940235364168:error:2306A075:PKCS12 routines:PKCS12_item_decrypt_d2i:pkcs12 pbe crypt error:p12_decr.c:123:

Vì một số lý do, chỉ có kiểu lệnh này sẽ hoạt động cho tệp JKS của tôi

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -srcalias mykey \
   -deststoretype pkcs12 \
   -destkeypass DUMMY123

Chìa khóa đã được thiết lập destkeypass, giá trị của đối số không thành vấn đề.


6
Lý do có thể được tìm thấy ở đây: herongyang.com/PKI/ Từ The Destkeypass DOES btw
Nicolas Mommaerts

Tôi ủng hộ bình luận này nhưng nó xứng đáng với bài đăng của riêng mình. Thật khó để tìm thấy ở đây.
Richie Rich

15

Các keytoollệnh sẽ không cho phép bạn export khóa riêng từ một cửa hàng chủ chốt. Bạn phải viết một số mã Java để làm điều này. Mở kho lưu trữ khóa, lấy chìa khóa bạn cần và lưu nó vào một tệp ở định dạng PKCS # 8. Lưu chứng chỉ liên quan quá.

KeyStore ks = KeyStore.getInstance("jks");
/* Load the key store. */
...
char[] password = ...;
/* Save the private key. */
FileOutputStream kos = new FileOutputStream("tmpkey.der");
Key pvt = ks.getKey("your_alias", password);
kos.write(pvt.getEncoded());
kos.flush();
kos.close();
/* Save the certificate. */
FileOutputStream cos = new FileOutputStream("tmpcert.der");
Certificate pub = ks.getCertificate("your_alias");
cos.write(pub.getEncoded());
cos.flush();
cos.close();

Sử dụng các tiện ích OpenSSL để chuyển đổi các tệp này (ở định dạng nhị phân) sang định dạng PEM.

openssl pkcs8 -inform der -nocrypt < tmpkey.der > tmpkey.pem
openssl x509 -inform der < tmpcert.der > tmpcert.pem

Cảm ơn erickson .. Kết luận là "Chúng tôi không thể thực hiện chuyển đổi trực tiếp từ JKS sang PEM bằng cách chỉ sử dụng các tiện ích keytool và openssl". Tôi có đúng không?
Chathuranga Chandrasekara

4
Bạn chỉ cần viết mã lên tới Java 1.4 - từ Java 5 trở đi, có thể kết hợp keytool và openssl để thực hiện chuyển đổi hai giai đoạn từ JKS -> PKCS # 12 -> PEM. Tuy nhiên, viết công cụ chính của riêng bạn là cách duy nhất để thực hiện CHUYỂN ĐỔI TRỰC TIẾP từ JKS -> PEM.
Stobor

Tôi nghĩ đó là từ JDK 6 trở đi. Nhưng có, nhập PKCS # 12 hiện được hỗ trợ.
erickson

13

Chuyển đổi trực tiếp từ jks sang tệp pem bằng keytool

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem

10
Đúng, xuất khẩu giấy chứng nhận. Tuy nhiên, nó không xuất thông tin chính ...
Stobor

Đây là câu trả lời đơn giản chính xác cho những gì tôi đã tìm kiếm trên hàng chục trang keytooljbosstài liệu mà không thành công. Cảm ơn!
kratenko

15
THÔNG TIN NÀY KHÔNG XUẤT KHẨU THÔNG TIN CHÍNH XÁC
James

1
Giấy chứng nhận xuất khẩu khóa công khai này
asami

Tôi đã thử chạy lệnh này. Nó yêu cầu mật khẩu, Nhập mật khẩu kho khóa: lỗi keytool: java.io.IOException: Keystore bị giả mạo hoặc mật khẩu không chính xác. Tôi đã sử dụng mật khẩu là (mật khẩu) nhưng nó cũng bị lỗi tương tự
Mohit Singh

9

Hướng dẫn đơn giản hóa để chuyển đổi tệp JKS sang định dạng PEM và KEY (.crt & .key):

keytool -importkeystore -srckeystore <Source-Java-Key-Store-File> -destkeystore <Destination-Pkcs12-File> -srcstoretype jks -deststoretype pkcs12 -destkeypass <Destination-Key-Password>

openssl pkcs12 -in <Destination-Pkcs12-File> -out <Destination-Pem-File>

openssl x509 -outform der -in <Destination-Pem-File> -out <Destination-Crt-File>

openssl rsa -in <Destination-Pem-File> -out <Destination-Key-File>


2

Chuyển đổi JKS KeyStore thành một tệp PEM duy nhất có thể dễ dàng được thực hiện bằng lệnh sau:

keytool -list -rfc -keystore "myKeystore.jks" | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" >> "myKeystore.pem"

Giải trình:

  1. keytool -list -rfc -keystore "myKeystore.jks"liệt kê mọi thứ trong KeyStore 'myKeyStore.jks ở định dạng PEM. Tuy nhiên, nó cũng in thêm thông tin.
  2. | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d"lọc ra mọi thứ chúng ta không cần. Chúng tôi chỉ còn lại các PEM của mọi thứ trong KeyStore.
  3. >> "myKeystore.pem" ghi PEM vào tệp 'myKeyStore.pem'.

3
bash :! d ": không tìm thấy sự kiện
user3217883 17/05/2016

1
@ user3217883 Bạn có thể thử một cái gì đó như sed "s/^\-*BEGIN [A-Z]*\-*$//g;s/^\-*END [A-Z]*\-*$//g"thay vào đó (với gnu sed) nhưng tôi không chắc là đủ nếu có nhiều hơn một chứng chỉ trong kho khóa của bạn
Idriss Neumann

nếu bạn nhận được bash: !d": event not found: đối với bash, dấu chấm than là một phím ngắn để sử dụng lệnh. Để sử dụng câu trả lời này, bạn cần sử dụng dấu nháy thay cho dấu ngoặc kép cho tùy chọn được sử dụng là -e cho sedkeytool -list -rfc -keystore "myKeystore.jks" | sed -e '/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d' >> "myKeystore.pem"
B.Adler

Thật không may, điều này chỉ xuất chứng chỉ, không phải khóa riêng
Maddin

2

Đầu tiên đổ kho khóa từ JKS sang PKCS12

1. keytool -importkeystore -srckeystore ~ ​​/ .android / debug.keystore -destkeystore trung gian.p12 -srcstoretype JKS -deststoretype PKCS12

Kết xuất tệp pkcs12 mới vào pem

  1. openssl pkcs12 -in trung gian.p12 -nodes -out trung gian.rsa.pem

Bạn nên có cả chứng chỉ và khóa riêng ở định dạng pem. Tách chúng ra Đặt phần giữa CHỨNG NHẬN BEGIN CHỨNG CHỈ và và KẾT THÚC KẾT THÚC KẾT THÚC vào cert.x509.pem Đặt phần giữa Bí mật BEGIN RSA PRIVATE KEY và và END END RSA PRIVATE KEY đổi thành private.rsa.pem Chuyển đổi khóa riêng thành định dạng pk8 được mong đợi bởi Signapk

3. openssl pkcs8 -topk8 -outform DER -in private.rsa.pem -inform PEM -out private.pk8 -nocrypt



1

Trong trường hợp bạn chưa cài đặt openssl và bạn đang tìm kiếm một giải pháp nhanh chóng, có phần mềm được gọi là portcle rất hữu ích và nhỏ để tải xuống.

Nhược điểm là không có dòng lệnh như tôi biết. Nhưng từ GUI, việc xuất khóa riêng PEM khá dễ dàng:

  1. Mở cửa hàng khóa JKS của bạn
  2. Nhấp chuột phải vào mục khóa riêng của bạn và chọn xuất
  3. Chọn Khóa riêng và chứng chỉ và định dạng PEM

    Xuất khóa riêng PEM từ JKS bằng Portcle


0

Hãy dùng thử Keystore Explorer http://keystore-explorer.org/

KeyStore Explorer là một thay thế GUI nguồn mở cho các tiện ích dòng lệnh Java và keytool và jarsigner. Nó cũng openssl / pkcs12.


0

đầu tiên tạo tập tin kho khóa như

C: \ Tệp chương trình \ Android \ Android Studio \ jre \ bin> keytool -keystore androidkey.jks -genkey Pair -alias androidkey

Nhập mật khẩu kho khóa: Nhập lại mật khẩu
mới:
Tên và họ của bạn là gì? Unknown: FirstName LastName
Tên của đơn vị tổ chức của bạn là gì? Không biết: Phát triển di động
Tên của tổ chức của bạn là gì? Không biết: tên công ty của bạn Tên
Thành phố hoặc Địa phương của bạn là gì? Tên của tiểu bang hoặc tỉnh của bạn là gì?
Mã quốc gia hai chữ cái cho đơn vị này là gì? Không biết: IN // nhấn enter

Bây giờ nó sẽ yêu cầu xác nhận

CN = FirstName LastName, OU = Mobile Development, O = tên công ty của bạn, L = CityName, ST = StateName, C = IN có đúng không? [không]:

Nhập mật khẩu khóa cho (RETURN nếu giống như mật khẩu lưu trữ khóa): nhấn enter nếu bạn muốn cùng một mật khẩu

Khóa đã được tạo, bây giờ bạn chỉ cần lấy tệp pem bằng lệnh sau

C: \ Tệp chương trình \ Android \ Android Studio \ jre \ bin> keytool -export -rfc -alias androidkey -file android_cert ve.pem -keystore androidkey.jks
Nhập mật khẩu kho khóa:
Chứng chỉ được lưu trong tệp


0

Chuyển đổi kho khóa Java thành định dạng PEM

Câu trả lời chính xác nhất trong tất cả phải là điều này KHÔNG THỂ.

Kho khóa Java chỉ là một phương tiện lưu trữ cho các khóa chứng chỉ mật mã trong khi PEM là định dạng tệp chỉ dành cho chứng chỉ X.509.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.