如何在生成 CRL 的上下文中检查 InputStream 是否为空?
How to check InputStream is empty in context of generating CRL?
给定 CRL url,我想检索 X509CRL 对象。以下是代码,
private static X509CRL downloadCRLFromWeb(String crlURL) throws
MalformedURLException, IOException, CertificateException, CRLException {
URL url = new URL(crlURL);
InputStream crlStream = url.openStream();
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
return (X509CRL) cf.generateCRL(crlStream);
} catch (CRLException e) {
System.out.println("Caught exception: " + e.getMessage());
e.printStackTrace();
return null;
} finally {
assert crlStream != null;
crlStream.close();
}
行 return (X509CRL) cf.generateCRL(crlStream);
会在我试过的一些 url 上生成 CRLException: Empty input
(不是全部)。
以下是堆栈跟踪,
java.security.cert.CRLException: Empty input
at sun.security.provider.X509Factory.engineGenerateCRL(X509Factory.java:397)
at java.security.cert.CertificateFactory.generateCRL(CertificateFactory.java:497)
at demo.pkcs.pkcs11.TryLDAP.downloadCRLFromWeb(TryLDAP.java:60)
at demo.pkcs.pkcs11.TryLDAP.main(TryLDAP.java:83)
还注意到 crlStream
在读取时不会 return -1
,因此它不完全是 'empty'。到底是什么导致了这个异常,我该如何解决?我如何更正此代码,以便我可以从 url 中检索 X509CRL
对象,我从中获取此异常?
对于我捕获异常的网址,我已通过以下步骤解决:
- 将
crlStream
转换为String
对象
- 在
crlStreamString
的开头和结尾添加"-----BEGIN X509CRL-----\n"
和"\n-----END X509CRL-----\n"
- 将
crlStreamString
转换回 InputStream
下面是工作代码,
InputStream crlStream = url.openStream();
String stream = IOUtils.toString(crlStream);
String tryPEM = "-----BEGIN X509CRL-----\n";
tryPEM = tryPEM.concat(stream);
tryPEM = tryPEM.concat("\n-----END X509CRL-----\n");
System.out.println(tryPEM);
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
return (X509CRL) cf.generateCRL(IOUtils.toInputStream(tryPEM));
给定 CRL url,我想检索 X509CRL 对象。以下是代码,
private static X509CRL downloadCRLFromWeb(String crlURL) throws
MalformedURLException, IOException, CertificateException, CRLException {
URL url = new URL(crlURL);
InputStream crlStream = url.openStream();
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
return (X509CRL) cf.generateCRL(crlStream);
} catch (CRLException e) {
System.out.println("Caught exception: " + e.getMessage());
e.printStackTrace();
return null;
} finally {
assert crlStream != null;
crlStream.close();
}
行 return (X509CRL) cf.generateCRL(crlStream);
会在我试过的一些 url 上生成 CRLException: Empty input
(不是全部)。
以下是堆栈跟踪,
java.security.cert.CRLException: Empty input
at sun.security.provider.X509Factory.engineGenerateCRL(X509Factory.java:397)
at java.security.cert.CertificateFactory.generateCRL(CertificateFactory.java:497)
at demo.pkcs.pkcs11.TryLDAP.downloadCRLFromWeb(TryLDAP.java:60)
at demo.pkcs.pkcs11.TryLDAP.main(TryLDAP.java:83)
还注意到 crlStream
在读取时不会 return -1
,因此它不完全是 'empty'。到底是什么导致了这个异常,我该如何解决?我如何更正此代码,以便我可以从 url 中检索 X509CRL
对象,我从中获取此异常?
对于我捕获异常的网址,我已通过以下步骤解决:
- 将
crlStream
转换为String
对象 - 在
crlStreamString
的开头和结尾添加 - 将
crlStreamString
转换回InputStream
"-----BEGIN X509CRL-----\n"
和"\n-----END X509CRL-----\n"
下面是工作代码,
InputStream crlStream = url.openStream();
String stream = IOUtils.toString(crlStream);
String tryPEM = "-----BEGIN X509CRL-----\n";
tryPEM = tryPEM.concat(stream);
tryPEM = tryPEM.concat("\n-----END X509CRL-----\n");
System.out.println(tryPEM);
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
return (X509CRL) cf.generateCRL(IOUtils.toInputStream(tryPEM));