it-swarm-vi.com

Làm cách nào tôi có thể xuất khóa riêng của mình từ kho Java Keytool?

Tôi muốn xuất khóa riêng của mình từ a Java Keytool keystore, vì vậy tôi có thể sử dụng nó với openssl. Làm thế nào tôi có thể làm điều đó?

117
Jonas

Sử dụng Java keytool để chuyển đổi từ JKS sang P12 ...

Xuất từ ​​định dạng độc quyền của keytool (được gọi là "JKS") sang định dạng chuẩn PKCS # 12 :

keytool -importkeystore \
    -srckeystore keystore.jks \
    -destkeystore keystore.p12 \
    -deststoretype PKCS12 \
    -srcalias <jkskeyalias> \
    -deststorepass <password> \
    -destkeypass <password>

... sau đó sử dụng openssl để xuất từ ​​P12 sang PEM

Xuất chứng chỉ bằng cách sử dụng openssl:

openssl pkcs12 -in keystore.p12  -nokeys -out cert.pem

Xuất khóa riêng không được mã hóa:

openssl pkcs12 -in keystore.p12  -nodes -nocerts -out key.pem
135
Jaime Hablutzel

Vì Java 6, bạn có thể nhập/xuất khóa riêng vào PKCS # 12 (.p12) tệp sử dụng keytool, với tùy chọn -importkeystore (không có sẵn trong các phiên bản trước).

Ví dụ:

keytool -importkeystore -srckeystore existing-store.jks -destkeystore new-store.p12 -deststoretype PKCS12

Các PKCS12 loại kho khóa cũng được hỗ trợ làm loại kho khóa tiêu chuẩn trong nhà cung cấp bảo mật Oracle/Sun mặc định.

62
Bruno

Hãy thử "Khám phá kho khóa"

Tôi đồng ý với Bruno. Keytool là công cụ tối ưu khi giao dịch với Java kho khóa, nhưng có một công cụ miễn phí khá lạ mắt và mạnh mẽ: Keystore Explorer

Tôi sử dụng nó rất nhiều và không bao giờ có nhu cầu gì khác.

23
Tiho

Nếu bất cứ ai thấy mình ở đây đang cố lấy khóa riêng ra khỏi kho khóa loại JCEKS, tôi thấy rằng các hướng dẫn keytool và openssl được mô tả trong các câu trả lời khác không hoạt động. Tôi đã phải sử dụng lớp Java dưới đây để lấy khóa ra.

import Sun.misc.BASE64Encoder;

import Java.io.File;
import Java.io.FileInputStream;
import Java.io.FileWriter;
import Java.security.*;

public class ExportPrivateKey
{
    private File keystoreFile;
    private String keyStoreType;
    private char[] keyStorePassword;
    private char[] keyPassword;
    private String alias;
    private File exportedFile;

    public void export() throws Exception {
        KeyStore keystore = KeyStore.getInstance(keyStoreType);
        BASE64Encoder encoder = new BASE64Encoder();
        keystore.load(new FileInputStream(keystoreFile), keyStorePassword);
        Key key = keystore.getKey(alias, keyPassword);
        String encoded = encoder.encode(key.getEncoded());
        FileWriter fw = new FileWriter(exportedFile);
        fw.write("---BEGIN PRIVATE KEY---\n");
        fw.write(encoded);
        fw.write("\n");
        fw.write("---END PRIVATE KEY---");
        fw.close();
    }

    public static void main(String args[]) throws Exception {
        ExportPrivateKey export = new ExportPrivateKey();
        export.keystoreFile = new File(args[0]);
        export.keyStoreType = args[1];
        export.keyStorePassword = args[2].toCharArray();
        export.alias = args[3];
        export.keyPassword = args[4].toCharArray();
        export.exportedFile = new File(args[5]);
        export.export();
    }
}

Sử dụng:

javac ExportPrivateKey.Java
java ExportPrivateKey <path_to_keystore> JCEKS <keystore_password> “<key_alias>” <key_password> <output_file_name>
6
cjbooms

Có một định dạng cho phép di chuyển các khóa riêng được gọi là PKCS # 12. Định dạng này xuất hiện sau trong quá trình phát triển chứng chỉ PKI và các kho khóa liên quan khi nhu cầu phát triển. Nếu bạn xem xét chuỗi các vấn đề tin cậy được tạo bằng cách truy cập và vận chuyển khóa riêng, bạn có thể thấy lý do tại sao nó không được bao gồm trong các tính năng ban đầu mà lại xuất hiện sau áp lực bởi nhu cầu hoạt động. Đây là lý do cốt lõi cho thách thức.

Các kho khóa Java là một trong những người dùng ban đầu của định dạng PKCS # 12 nhưng vì các nhà nhập khẩu không phải là nhà xuất khẩu. Dường như thiết kế bảo mật của Java kho khóa vẫn không hỗ trợ xuất khóa riêng tư như một tính năng tiêu chuẩn. Một lần nữa, có những lý do bảo mật tốt cho thực tế này. Điều đó nói rằng, các thói quen riêng tư đã được viết như được tham chiếu ở đây: http://www.startux.de/index.php/Java/44-deals-with-Java-keystoresyvTHER44

Nếu có thể, tôi sẽ xem xét việc tạo một kho khóa mới trong OpenSSL và các khóa mới thay vì cố gắng loại bỏ khóa riêng từ kho khóa Java. Bằng cách mở kho khóa Java và trích xuất khóa riêng, người ta sẽ vượt ra ngoài các tính năng bảo mật được thiết kế. Tính năng xuất PKCS # 12 đã được mong muốn trong nhiều năm nhưng vẫn không được hỗ trợ trong Java. Suy nghĩ của tôi là vì những lý do mật mã rất tốt, do đó tôi sẽ không thực hiện bước đó trừ khi nó thực sự cần thiết.

2
zedman9991