我正在使用ColdFusion 11,并且我的类路径中有一个eSignWeb.jar文件(显然是用Java创建的)。该.jar的作用是接收客户端计算机上文件的路径,然后使用Bouncy Castle分析该文件。
但是当我运行它时,出现以下错误:
代码:java.io.FileNotFoundException: C:\ Users \ name \ Documents \ clientfile.cer(系统找不到 指定的路径)
错误是因为我的.jar文件试图在服务器而不是客户端计算机上查找clientfile.cer
文件。我需要的是,在服务器上运行的该.jar可以在客户端计算机上搜索该文件。电脑。
重要:
clientfile.cer
文件永远无法上传到服务器,因此必须在客户端进行分析。我在ColdFusion中的代码很简单:
<cfset eSign = createObject("java","eSignWeb.SignAB") />
<cfoutput>
<!--- TEST1--->
<cfdump var="#eSign#">
#eSign.callsignCF()#
<hr />
<!--- TEST2 WITH cfscript --->
<cfscript>
classLoader = createObject("java","eSignWeb.SignAB");
response = classLoader.callsignCF();
WriteOutput("Test whith CFSCRIPT " & response);
</cfscript>
</cfoutput>
.jar文件中的代码:
package eSignWeb;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.security.Security;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Date;
import javax.naming.InvalidNameException;
import javax.naming.ldap.LdapName;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class SignAB {
public String callsignCF(){
String vCer;
vCer = "C:\\Users\\name\\Documents\\clientfile.cer"; //Path where the .cer file is located on the client side
Security.addProvider(new BouncyCastleProvider()); // add bc as provider
String archivoCer;
X509Certificate certificado = null;
Date fechaFinal;
Date fechaInicial;
Date fechaActual;
//start cer
archivoCer = vCer;
try {
FileInputStream is = new FileInputStream(archivoCer);
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
certificado = (X509Certificate)cf.generateCertificate(is);
fechaFinal = certificado.getNotAfter();
fechaInicial = certificado.getNotBefore();
fechaActual = new Date();
if(fechaActual.before(fechaInicial) && fechaActual.after(fechaFinal)){
return "Invalid date";
}else{
String myVarConRFC = "2.5.4.45";
String dn = certificado.getSubjectX500Principal().getName();
LdapName ldapDN = new LdapName(dn);
ldapDN.getRdns().forEach((index) -> {
if(index.getType().equals(myVarConRFC)){
//RFC
String myRFC = new String((byte[]) index.getValue());
}
});
}
}
catch (InvalidNameException ex) {
return "E0: Error on cer. Code: "+ ex;
}
catch(CertificateException a) {
return "E1: The specified file is not a valid certificate file. Code: " +a;
}
}
catch(FileNotFoundException fnfe) {
return "E2: Certificate file does not exist. Code: " +fnfe;
}
// End cer
return "Unknown error";
}
}
如您所见,.jar在服务器上运行,这就是为什么它找不到.cer文件的原因。关于如何获得允许.jar在客户端计算机上搜索文件的功能的任何想法?
如果我可以将.cer文件上传到服务器,那将非常容易,但这是禁止的。 .cer文件永远不要离开客户端计算机。
非常感谢您提供这方面的指导!
答案 0 :(得分:0)
仅CF不能用于此类任务,因为它仅在CF服务器上运行。它根本无法访问客户端文件。仅将文件上传到服务器或服务器可访问的位置(您说不能这样做)。
为了访问客户端计算机上的文件,您需要运行在客户端上的 signed Java Applet或Web Start Application之类的东西。 “签名”部分很重要。出于安全原因,小程序等无法随心所欲地访问客户端计算机上的文件。用户必须明确授予Applet或Web Start应用程序权限。