6

問題は、Javaでプログラムによって証明書チェーンを生成する方法です。言い換えれば、Javaでここに詳述されている操作を実行したいと思います:http://fusesource.com/docs/broker/5.3/security/i382664.html

基本的に、新しいクライアントのRSAキーを作成できます。

private KeyPair genRSAKeyPair(){
    // Get RSA key factory:
    KeyPairGenerator kpg = null;
    try {
        kpg = KeyPairGenerator.getInstance("RSA");
    } catch (NoSuchAlgorithmException e) {
        log.error(e.getMessage());
        e.printStackTrace();
        return null;
    }
    // Generate RSA public/private key pair:
    kpg.initialize(RSA_KEY_LEN);
    KeyPair kp = kpg.genKeyPair();
    return kp;

}

対応する証明書を生成します。

private X509Certificate generateCertificate(String dn, KeyPair pair, int days, String algorithm)
  throws GeneralSecurityException, IOException  {
    PrivateKey privkey = pair.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, new CertificateSubjectName(owner));
    info.set(X509CertInfo.ISSUER, new CertificateIssuerName(owner));
    info.set(X509CertInfo.KEY, new CertificateX509Key(pair.getPublic()));
    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;

}

次に、証明書署名要求を生成し、それをcsrFileファイルに保存します。

public static void writeCertReq(File csrFile, String alias, String keyPass, KeyStore ks) 
        throws KeyStoreException, 
               NoSuchAlgorithmException, 
               InvalidKeyException, 
               IOException, 
               CertificateException, 
               SignatureException, 
               UnrecoverableKeyException {

    Object objs[] = getPrivateKey(ks, alias, keyPass.toCharArray());
    PrivateKey privKey = (PrivateKey) objs[0];

    PKCS10 request = null;

    Certificate cert = ks.getCertificate(alias);
    request = new PKCS10(cert.getPublicKey());
    String sigAlgName = "MD5WithRSA";
    Signature signature = Signature.getInstance(sigAlgName);
    signature.initSign(privKey);
    X500Name subject = new X500Name(((X509Certificate) cert).getSubjectDN().toString());
    X500Signer signer = new X500Signer(signature, subject);
    request.encodeAndSign(signer);
    request.print(System.out);
    FileOutputStream fos = new FileOutputStream(csrFile);
    PrintStream ps = new PrintStream(fos);
    request.print(ps);
    fos.close();
}

どこ

private static Object[] getPrivateKey(KeyStore ks, String alias, char keyPass[]) 
        throws UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException {
    key = null;        
    key = ks.getKey(alias, keyPass);
    return (new Object[]{ (PrivateKey) key, keyPass });
}

ここで、CA秘密鍵を使用してCSRに署名する必要がありますが、Javaでそれを実現する方法がわかりません。jksに「自分の」CA秘密鍵があります。

さらに、CSRに署名できたら、CA証明書を署名されたCSRとチェーンする必要があります。これはJavaでどのように行うことができますか?

bcやその他の外部ライブラリは使用せず、「sun.security」クラスのみを使用したいと思います。

ありがとうございました。

4

3 に答える 3

10

投稿http://www.pixelstech.net/article/1406726666-Generate-certificate-in-Java----2のコード例は、純粋なJavaで証明書チェーンを生成する方法を示していると思います。バウンシーキャッスルを使用する必要はありません。

于 2014-10-14T10:23:43.790 に答える
2

申し訳ありませんが、あなたの希望にもかかわらず、すべての暗号コードを記述してプロジェクトに含めることに加えて(非推奨)、ここで弾力がある城を使用することをお勧めします。

具体的には、 https://stackoverflow.com/a/7366757/751158を参照してください。これには、実行しようとしていることを正確に示すコードが含まれています。

于 2012-09-08T13:11:17.073 に答える
1

あなたはすでに家のBouncyCastle側に行ったようですが、他の誰かが疑問に思っていた場合に備えて。キーをKeyStoreに入れるときに、証明書チェーンをエントリに追加できます。例えば

// build your certs 

KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load([keystore stream], password.toCharArray());// or null, null if it's a brand new store
X509Certificate[] chain = new X509Certificate[2];
chain[0] = _clientCert;
chain[1] = _caCert;
keyStore.setKeyEntry("Alias", _clientCertKey, password.toCharArray(), chain);
keyStore.store([output stream], password.toCharArray());

// do other stuff
于 2013-06-04T15:50:01.823 に答える