0

eToken Pro를 사용하여 pdf에 서명하는 데 사용되는 JavaFX 응용 프로그램을 개발 중입니다. sign 메소드는 일반적인 Java 프로젝트에서 완벽하게 실행됩니다. 자바 FX 응용 프로그램에서 실행할 때, 그것은 다음과 같은 예외가 발생 계속하는 동안 다음과 같이JavaFX 응용 프로그램 : SunPKCS11 클래스를 찾을 수 없습니다.

클래스의 서명자의 코드
@Override 
    public void start(Stage primaryStage) { 
     Signer signer = new Signer(new File("C:/Users/Adam/Desktop/pdf/hello.pdf")); 
     signer.signWithToken(true); 
    } 

은 다음과 같습니다 :

Exception in Application start method 
java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.javafx.main.Main.launchApp(Main.java:698) 
    at com.javafx.main.Main.main(Main.java:871) 
Caused by: java.lang.RuntimeException: Exception in Application start method 
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:403) 
    at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47) 
    at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115) 
    at java.lang.Thread.run(Thread.java:744) 
Caused by: java.lang.NoClassDefFoundError: sun/security/pkcs11/SunPKCS11 
    at javafxapplication3.JavaFXApplication3.start(JavaFXApplication3.java:21) 
    at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319) 
    at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:216) 
    at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179) 
    at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176) 
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:76) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:17) 
    at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:67) 
    ... 1 more 
Caused by: java.lang.ClassNotFoundException: sun.security.pkcs11.SunPKCS11 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 12 more 
Java Result: 1 

코드를 나는 다음과 같습니다 PDF에 서명하는 데 사용

public class Signer { 

// define the file to be signed 
private final File file; 
private static String smartcardDllPath; 
private static int level; 
private static String reason; 
private static String src; 
private static String dest; 
private static String location; 
private static Collection<CrlClient> crlList; 
private static OcspClient ocspClient; 
private static TSAClient tsaClient; 
private static final String DLL = "C:/Windows/System32/eTPKCS11.dll"; 

public Signer(File theFile) { 
    location = "HK SAR"; 
    smartcardDllPath = null; 
    file = theFile; 
} 


public void signWithToken(boolean certified) { 
    try { 
     String config = "name=eToken\nlibrary=" + DLL + "\nslotListIndex=" + getSlotsWithTokens(DLL)[0]; 
     ByteArrayInputStream bais = new ByteArrayInputStream(config.getBytes()); 
     Provider providerPKCS11 = new SunPKCS11(bais); 
     Security.addProvider(providerPKCS11); 
     configureParameters(certified); 

     // create PdfSignatureAppearance 
     PdfSignatureAppearance appearance = getPdfSigAppearance(); 
     // configure the keystore, alias, private key and certificate chain 
     char[] pin = "love4Sakura".toCharArray(); 
     KeyStore ks = KeyStore.getInstance("PKCS11"); 
     ks.load(null, pin); 
     String alias = (String) ks.aliases().nextElement(); 
     PrivateKey pk = (PrivateKey) ks.getKey(alias, null); 
     Certificate[] chain = ks.getCertificateChain(alias); 

     printChainInfo(chain); 
     // configure the CRL, OCSP and TSA 
     configCrlOcspTsa(chain); 
     // create the signature 
     ExternalSignature pks = new PrivateKeySignature(pk, DigestAlgorithms.SHA256, "SunPKCS11-eToken"); 
     ExternalDigest digest = new BouncyCastleDigest(); 
     MakeSignature.signDetached(appearance, digest, pks, chain, crlList, ocspClient, 
       tsaClient, 0, MakeSignature.CryptoStandard.CMS); 

    } catch (IOException | DocumentException | GeneralSecurityException ex) { 
     Logger.getLogger(Signer.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

private static long[] getSlotsWithTokens(String libraryPath) { 
    CK_C_INITIALIZE_ARGS initArgs = new CK_C_INITIALIZE_ARGS(); 
    String functionList = "C_GetFunctionList"; 
    initArgs.flags = 0; 
    PKCS11 tmpPKCS11 = null; 
    long[] slotList = null; 
    try { 
     try { 
      tmpPKCS11 = PKCS11.getInstance(libraryPath, functionList, initArgs, false); 
      System.out.println(tmpPKCS11.toString()); 
     } catch (IOException ex) { 
      try { 
       throw ex; 
      } catch (IOException ex1) { 
       Logger.getLogger(Signer.class.getName()).log(Level.SEVERE, null, ex1); 
      } 
     } 
    } catch (PKCS11Exception e) { 
     try { 
      initArgs = null; 
      tmpPKCS11 = PKCS11.getInstance(libraryPath, functionList, initArgs, true); 
     } catch (IOException | PKCS11Exception ex) { 
     } 
    } 
    try { 
     slotList = tmpPKCS11.C_GetSlotList(true); 
     for (long slot : slotList) { 
      CK_TOKEN_INFO tokenInfo = tmpPKCS11.C_GetTokenInfo(slot); 
      System.out.println("slot: " + slot + "\nmanufacturerID: " 
        + String.valueOf(tokenInfo.manufacturerID) + "\nmodel: " 
        + String.valueOf(tokenInfo.model)); 
     } 
    } catch (PKCS11Exception ex) { 
     Logger.getLogger(Signer.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return slotList; 
} 

여러분이 대답하기 전에 : 저는 보통 자바 프로젝트에서 Signer 클래스를 완벽하게 참조한다는 점을 강조하고 싶습니다. 따라서 32 비트 또는 64 비트 문제라고 생각하지 않습니다. 또한, 32 비트 JDK 1.7을 사용하고 있습니다.

+0

SunPKCS11 프로 항아리 당신의 클래스 경로 자바 FX 프로젝트에서 사용할 수 없습니다. 이 작업을 수행 할 것을 제안합니다. http://javareferencegv.blogspot.com/2013/10/debugging-javalangnoclassdeffounderror.html –

+0

참조를 검토했습니다. SunPKCS11 jar 파일을 Java 클래스 경로에 넣으려고했습니다. 이 작품들도. 정확한 소스 코드를 ec (fx) lipse 프로젝트에 넣으면 실제로 작동합니다. 여전히 혼란 스럽습니다. 하지만 당신이 맞을 거 같아요. java가 아닌 netbeans의 javafx 구성에 문제가 있습니다. –

+0

누구나 의견을 남기고 싶습니까? 감사 –

답변

0

이 문제는 지원되지 않는 버전의 java.Do가 특정 jar 파일을 다운로드하여 프로젝트에 포함 시켜서 발생할 수 있기 때문에 발생할 수 있습니다.

이 링크에서 항아리를 다운로드 할 수 있습니다 - http://www.docjar.com/jar/sunpkcs11.jar