将 X509Certificate 转换为字节(getEncoded)

Convert X509Certificate to byte (getEncoded)

我目前在这里有这段代码,但它在第 16 行给了我 NullPointerException。

byte[] frame = loadCertificate("GasClient").getEncoded();

如果我注释掉那行,那么一切都很好——即使我把那行留在那里,代码仍然会打印出证书。是否有另一种解决方案在客户端和服务器之间发送证书?我也尝试使用 toString 但这给了我同样的错误。

import java.io.FileInputStream;
import java.io.InputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;

public class test {
    public static X509Certificate newCert;

    public static void main(String args[]) throws Exception {
        loadCertificate("GasClient");
        byte[] frame = loadCertificate("GasClient").getEncoded();
    }

    public static X509Certificate loadCertificate(String alias) {
        try {
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            char[] password = "GasClient".toCharArray();

            try (InputStream keyStoreData = new FileInputStream(alias + "KeyStore.jks")) {
                keyStore.load(keyStoreData, password);
            }

            Key key = keyStore.getKey("Certificate-Authority", password);
            PrivateKey privateKey = (PrivateKey) key;
            System.out.println("Private Key: " + privateKey);
            java.security.cert.Certificate[] certs = keyStore.getCertificateChain(alias);

            X509Certificate newCert = (X509Certificate) certs[0];
            System.out.println(newCert);
        } catch(Exception e) {
            e.printStackTrace();
        }
        return newCert;
    }
}

这是变量遮蔽引起的问题。在 class 你有静态字段:

public static X509Certificate newCert;

但是,在 try 块中有以下行:

X509Certificate newCert = (X509Certificate) certs[0];

try 块中的newCert 与class 级别定义的newCert 不同。 try 块中的 newCert 有效地隐藏或 shadows 在 class level.Then 处声明的 newCert 您退出 try 块导致newCert 其中定义超出范围。那你return newCert可是那个newCert是静态的class字段一。它在 class 加载时在概念上被初始化为 null 并且您永远不会更改它,因此当您 return 它时您得到 null。

不太清楚您在此处尝试使用 class 设计做什么,但我假设您是 Java 初学者并且只是在努力学习基础知识。有两个简单的修复方法。第一种是在 try 块中省略声明。所以用

替换上面的行
newCert = (X509Certificate) certs[0];

第二个是完全删除 class 字段,只从 try 块中删除 return newCert。或者,您可以在 try 块的上方和外部声明 newCert,并有一个出口点。

好的class设计当然是一个更大更基础的话题,我没有在这个答案中解决它。我只是提出了一些快速修复建议。

感谢 Maarten Bodewes 引导我找到错误。