自签名证书与CA

时间:2020-04-17 07:37:42

标签: java ssl encryption

我正在为通过RSA和AES结合使用的文件加密解决方案。 RSA在这里基本上用于握手,以加密对称密钥并通过密钥对在接收器端解密。

我已经将Java密钥库用于私钥,并将自签名证书用于公钥。两者都创建如下:

关键商店

keytool -genkey -keyalg RSA -alias BANK -keystore receiverKeystore.jks -validity 360 -keysize 2048

证书出口

keytool -export -alias BANK -keystore receiverKeystore.jks -rfc -file bankCert.cer

同样,两者在Java中的用法如下:

私钥

private void setKeys() {

        KeyStore senderKeyStore = null;
        String keyStorePassword = "fms123";

        try {

            senderKeyStore = KeyStore.getInstance( "JKS" );  
            FileInputStream is = new FileInputStream( keystorePath );
            senderKeyStore.load( is, keyStorePassword.toCharArray() );  

            senderPrivateKey = ( PrivateKey ) senderKeyStore.getKey( KEYSTORE_ALIAS, keyStorePassword.toCharArray() );

            receiverPublicKey = loadReceiverPublicKeyFromCertificate();
        }
        catch ( Exception e ) {
            System.out.println( " Exception in setting keys from key store = " + e );
        }

    } 

公共密钥

private PublicKey loadReceiverPublicKeyFromCertificate () {

        PublicKey publicKey = null; 

        try {

            FileInputStream fin = new FileInputStream( certificateFilePath );
            CertificateFactory factory = CertificateFactory.getInstance( "X.509" );
            X509Certificate certificate = ( X509Certificate ) factory.generateCertificate( fin );
            publicKey = certificate.getPublicKey();
        }
        catch ( Exception e ) {
            System.out.println( " Exception in loading receiver certificate = " + e );
        }

        return publicKey;
    }

我现在有以下问题:

  1. 正确的方法吗?
  2. 如果我在此处使用受信任的证书,将如何从中获取公钥?会以相同的方式获取吗?和私钥?我将使用相同的方法还是使用证书中的某些方法?

  3. 如何将证书分发给接收者?为此,安全的通信有什么用?

我刚接触加密,很高兴得到一些建议。

1 个答案:

答案 0 :(得分:2)

您的握手称为密钥建立。握手用于(在线)传输模式,但我认为您不是在开发这种方式。我会改用PKCS#12密钥存储库,JKS有点过时了。使用char[]作为密码的整个想法是,您可以在使用密码后直接删除其内容,因此,使用String作为输入不是一个好主意。在Java中,字符串通常是 interned ,并且总是 immutable ,因此,如果没有涉及本地代码的丑陋骇客,就无法销毁它们。

受信任的证书与不受信任的证书没有什么不同。是的,您可以从中检索公钥。私钥通常与证书链一起存储,该证书链指向私钥所属的叶用户证书。但是,私钥不是证书的一部分,因此您不能从证书中检索私钥。没关系,应该在需要使用私钥的位置建立私钥。除了用于备份目的之外,无需传输它们。

如何将证书发送给接收方取决于您。棘手的部分是让接收者信任证书。使用预先建立的密钥(例如,受信任的PGP密钥)是有效的。如果您没有这样的钥匙,那么您将遇到麻烦。您可以做的是使用其他方法建立信任。让另一方致电给您,然后验证证书指纹(基本上只是证书上的哈希)是正确的,这可能是最简单的方法之一。如果您的用户离我们不太远,当然也可以选择亲自将其带来。

但是,您不能凭空创建安全的频道。如果您不信任对方,那么建立完全信任显然是不可能的。