Как получить сертификат для шифрования почты в Java без закрытого ключа? - PullRequest
0 голосов
/ 20 января 2020

Я хочу отправить зашифрованное письмо в java. BouncyCastle (выпуск 1.6.4), кажется, популярен для этого. В их примере «CreateLargeEncryptedMail. java» вы обнаружите:

/**
 * a simple example that creates a single encrypted mail message.
 * <p>
 * The key store can be created using the class in
 * org.bouncycastle.jce.examples.PKCS12Example - the program expects only one
 * key to be present in the key file.
 * <p>
 * Note: while this means that both the private key is available to
 * the program, the private key is retrieved from the keystore only for
 * the purposes of locating the corresponding public key, in normal circumstances
 * you would only be doing this with a certificate available.
 */
public class CreateLargeEncryptedMail
{
    public static void main(
        String args[])
        throws Exception
    {
        if (args.length != 3)
        {
            System.err.println("usage: CreateLargeEncryptedMail pkcs12Keystore password inputFile");
            System.exit(0);
        }

        //
        // Open the key store
        //
        KeyStore    ks = KeyStore.getInstance("PKCS12", "BC");
        String      keyAlias = ExampleUtils.findKeyAlias(ks, args[0], args[1].toCharArray());

        Certificate[]   chain = ks.getCertificateChain(keyAlias);

Но ks.getCertificateChain () не работает без личного ключа, и обычно у меня нет личного ключа получателя. В моих попытках он вернул ноль. Из документации

Возвращает цепочку сертификатов, связанную с данным псевдонимом. Цепочка сертификатов должна быть связана с псевдонимом с помощью вызова setKeyEntry или вызова setEntry с PrivateKeyEntry.

Но у меня нет личного ключа.

Другой способ - использовать CertificateFactory.getInstance("X.509"); . Есть ли способ расшифровки smime publi c ключевых данных .

Но я только прихожу к java.security.cert.CertificateParsingException: signed fields invalid

Обнаружено stackoverflow для этого исключения, но решение снова использует KeyStore.getCertificate().

У меня есть : сертификат, подходящий для SMIME в Windows доверенном хранилище. Сертификат работает в outlook. Я могу экспортировать сертификат в файл.

Я хочу : java объект типа Certificate (X509Certificate), работающий для SMIME с BounceCastle.

Итак какой файл мне нужно создать с помощью какого инструмента и что делать в Java, чтобы инициализировать этот сертификат X509? Нужен ли мне единственный сертификат или цепочка в этом файле? Сертификат самоподписан.

1 Ответ

0 голосов
/ 29 января 2020

BouncyCastle не только поддерживает шифрование SMIME, но также содержит CertificateFactory, который может загрузить p7b-файл, который я экспортировал из Windows certmgr. Для экспорта я выбрал без закрытого ключа и с цепочкой для ключей. Этот файл работал для меня, используя:

import org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory;
...

    /**
     * Reads the Certificate from the file with filename.
     * Works for p7b-files.
     * @param filename the name and path of a key-file.
     * @return a Certificate
     */
    public static Certificate getCertificate(String filename) {
        Certificate cert = null;
        try (InputStream is = new FileInputStream(filename)) {
            CertificateFactory fact = new CertificateFactory();
            cert = fact.engineGenerateCertificate(is);
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
        return cert;
    }
...