我有一个 X509 证书存储在 Edirectory 中用户类的属性中,我想解析它的值以获得到期日期。正如我通过 LDAP 看到的那样,证书以二进制格式存储。
我有一个 JAVA 函数可以完美地完成这项工作,但问题是我想在浏览器上运行的工作流表单上运行它,所以我不能直接使用 JAVA,我必须向 tomcat 服务器发送一个 ajax 查询.
我点击该链接以便通过 AJAX 将表单传送到 JBOSS 服务器(在我的服务器中它是一个 Tomcat,但我猜它是一样的)并且该连接工作正常但我无法解析服务器上的证书:https //community.microfocus.com/cyberres/netiq-identity-governance-administration/idm/w/identity_mgr_tips/22902/howto-use-ajax-with-jquery-in-user-application-forms
这就是我从目录和我执行的 ajax 调用中获取值的方式:
var cert = IDVault.get(null, {userDN}, "User", "userCertificate");//It is how is it in Microfocus environment
alert(cert.length);//1
alert(cert[0].length);//2111
$.ajax( {
type: 'POST',
url: {JSP_URL},
dataType: "text",
contentType: "application/octet-stream",
processData: false,
data: cert,
success: function( data )
{
ajax_display( field, url, data );
},
error: function( xhr, status )
{
ajax_display( field, url, xhr.status + " / " + status );
},
timeout: 9000
} )
JSP文件中的代码:
InputStream inputStreamAjax = request.getInputStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStreamAjax.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, length);
}
byte[] certificateBytes = byteArrayOutputStream.toByteArray();
System.out.println(certificateBytes.length);//2893
ByteArrayInputStream inputStream = new ByteArrayInputStream(certificateBytes);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
try {
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
//Send Certificate back to form....
这个错误出现在 try catch 上,所以它被打印在 catalina.out 上:
java.security.cert.CertificateException: Could not parse certificate: java.io.IOException: Invalid BER/DER data (too huge?)
我做错了什么?
已编辑:如果我在调用 ajax 之前检查 var cert 中的字节长度,它是 2111,但是如果我在解析之前检查 jsp 文件,在 certificateBytes 变量中它是 2983。差异求和在哪里? (代码是用这些检查的位置编辑的)