Сертификат X509 для Google Cloud HSM - PullRequest
0 голосов
/ 31 января 2019

Я хочу создать сертификат X509 для закрытого ключа, хранящегося в Google Cloud HSM.

Используя инструмент Java Key и локальное «хранилище ключей» Java, я бы сделал что-то вроде этого:

keytool -exportcert -alias sign1 -keystore signkeystore -storetype jks -storepass password -filesign1.certificate

См. http://tutorials.jenkov.com/java-cryptography/keytool.html

Используя OpenSSL, я сделал бы что-то вроде этого:

openssl genrsa -out private.key1024

openssl req -new -x509 -key private.key -out publickey.cer -days 365

openssl pkcs12 -export -out public_privatekey.pfx -inkey private.key -in publickey.cer

См. X.509: закрытый / открытый ключ

Казалось бы, для создания сертификата необходим доступ к «закрытому ключу» , в некотором роде, прямо как OpenSSL или косвенно как keytool с использованием хранилища закрытых ключей.

Документация Gcloud, похоже, использует OpenSSL для генерации закрытого ключа.https://cloud.google.com/load-balancing/docs/ssl-certificates

Как получить сертификат X509 для закрытого ключа в Google Cloud HSM.Кто-нибудь делал это раньше?

С уважением, Сучак

1 Ответ

0 голосов
/ 05 февраля 2019

Я посмотрел эту тему Создание сертификата X509 в Java без BouncyCastle? .

Затем я сделал следующие два создания сертификата GCloud X509

  1. Создание ключа в GCloud HSM (см. https://cloud.google.com/kms/docs/hsm)
  2. Загрузка открытого ключа из GCloud.
  3. Используйте приведенный ниже код для создания сертификата X509.
  4. Выполнитьнекоторые юнит-тесты на том же.
    /**
     * Create a self-signed X.509 based on a public key
     * @param googlePublicKey the Public key downloaded from Google Cloud HSM
     * @param dn        the X.509 Distinguished Name, eg "CN=Test, L=London, C=GB"
     * @param days      how many days from now the Example is valid for
     * @param algorithm the signing algorithm, eg "SHA1withRSA"
     */
    public static X509Certificate generateRSACertificate(String googlePublicKey, String dn, int days, String algorithm)
            throws GeneralSecurityException, IOException {
        byte[] derKey = Base64.decodeBase64(googlePublicKey);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(derKey);
        PublicKey rsaKey = KeyFactory.getInstance("RSA").generatePublic(keySpec);
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PrivateKey privkey = keyPair.getPrivate();
        X509CertInfo info = new X509CertInfo();
        Date from = new Date();
        Date to = new Date(from.getTime() + days * 86400000l);
        CertificateValidity interval = new CertificateValidity(from, to);
        BigInteger sn = new BigInteger(64, new SecureRandom());
        X500Name owner = new X500Name(dn);

        info.set(X509CertInfo.VALIDITY, interval);
        info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(sn));
        info.set(X509CertInfo.SUBJECT, owner);
        info.set(X509CertInfo.ISSUER, owner);
        info.set(X509CertInfo.KEY, new CertificateX509Key(rsaKey));
        info.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3));
        AlgorithmId algo = new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);
        info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algo));

        // Sign the cert to identify the algorithm that's used.
        X509CertImpl cert = new X509CertImpl(info);
        cert.sign(privkey, algorithm);

        // Update the algorith, and resign.
        algo = (AlgorithmId) cert.get(X509CertImpl.SIG_ALG);
        info.set(CertificateAlgorithmId.NAME + "." + CertificateAlgorithmId.ALGORITHM, algo);
        cert = new X509CertImpl(info);
        cert.sign(privkey, algorithm);
        return cert;
    }

Использовались импортные операции

import org.apache.commons.codec.binary.Base64;
import sun.security.x509.*;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.*;
import java.security.cert.Certificate;
import java.security.cert.*;
import java.security.spec.X509EncodedKeySpec;
import java.util.Collection;
import java.util.Date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...