2014-07-07 224 views
-2

当我尝试初始化getServerSocket方法SSLServerSocket与定义密钥库如下所示:失败初始化的SSLContext

public static ServerSocket getServerSocket(int port) { 
    System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true"); 
    ServerSocket serverSocket = null; 
    secureRandom = new SecureRandom(); 
    Thread.currentThread().sleep(30000); 
    secureRandom.nextInt(); 

    setupClientKeyStore(); 
    setupServerKeystore(); 
    setupSSLContext(); 

    SSLServerSocketFactory sf = sslContext.getServerSocketFactory(); 
    serverSocket = sf.createServerSocket(port); 
    ((SSLServerSocket)serverSocket).setNeedClientAuth(true); 
    } 
    return serverSocket; 
} 

private static void setupClientKeyStore() throws GeneralSecurityException, IOException { 
    clientKeyStore = KeyStore.getInstance("JKS"); 

    KeyStore client = KeyStore.getInstance("JKS"); 
    client.load(new FileInputStream("client.public"), "public".toCharArray()); 

    KeyStore client1 = KeyStore.getInstance("JKS"); 
    client1.load(new FileInputStream("client1.public"), "public".toCharArray()); 

    KeyStore.Entry clientpublic = client.getEntry("clientpublic", null); 
    KeyStore.Entry client1public = client1.getEntry("client1public", null); 

    clientKeyStore.load(null, null); 
    clientKeyStore.setEntry("clientpublic", clientpublic, null); 
    clientKeyStore.setEntry("client1public", client1public, null); 

} 

private static void setupServerKeystore() throws GeneralSecurityException, IOException  { 
    serverKeyStore = KeyStore.getInstance("JKS"); 
    serverKeyStore.load(new FileInputStream("server.private"), 
      passphrase.toCharArray()); 
} 

private static void setupSSLContext() throws GeneralSecurityException, IOException { 
    TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); 
    tmf.init(clientKeyStore); 

    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
    kmf.init(serverKeyStore, passphrase.toCharArray()); 

    sslContext = SSLContext.getInstance("TLS"); 
    sslContext.init(kmf.getKeyManagers(), 
      tmf.getTrustManagers(), 
      secureRandom); 
} 

它抛出异常:

trigger seeding of SecureRandom 
trigger seeding of SecureRandom 
done seeding SecureRandom 
done seeding SecureRandom 
java.lang.IllegalStateException: SSLContext is not initialized 
atcom.sun.net.ssl.internal.ssl.SSLContextImpl.enginegetServerSocketFactory<SSLContextImpl.java.153> 
at javax.net.ssl.SSLContext.getServerSocketFactory<SSLContext.java.272> 

Allow unsafe renegotiation: false 
Allow legacy hello message: true 
Is initial handshake: true 
Is secure renegotiation: false 

我不明白为什么它把“触发SecureRandom播种“和”完成播种SecureRandom“两次。

+2

您需要提供有关您正在使用的代码的更多详细信息,而不仅仅是这一行。这可能不是正确的,因为'init'不是'SSLContext'的静态方法。 – Bruno

+0

抱歉,它会从SSLContext类的实例中调用init方法。 – user3104352

+0

这是什么代码? – Bruno

回答

0

显然,输出显示两次,因为您在两个线程中同时运行此代码。我建议你在两个线程中也使用相同的Runnable,这将完全解释这个失败。

在nextInt()之前,您不需要睡眠。我不明白你为什么要将KeyStore条目设置为null。