将 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 引导我找到错误。
我目前在这里有这段代码,但它在第 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 引导我找到错误。