我想在Java服务器应用程序中打开安全的侦听套接字。我知道,推荐的方式做到这一点是只要做到这一点:设置Java SSL ServerSocket使用的证书
SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
ServerSocket ss = ssf.createServerSocket(443);
但是这需要启动Java时,服务器的证书传递给JVM。因为这会使部署中的一些事情对我来说更加复杂,所以我宁愿在运行时加载证书。
所以我有一个密钥文件和一个密码,我想要一个服务器套接字。我如何到达那里?好吧,我阅读文档,我能找到的唯一方法是这样的:
// these are my parameters for SSL encryption
char[] keyPassword = "[email protected]!".toCharArray();
FileInputStream keyFile = new FileInputStream("ssl.key");
// init keystore
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(keyFile, keyPassword);
// init KeyManagerFactory
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, keyPassword);
// init KeyManager
KeyManager keyManagers[] = keyManagerFactory.getKeyManagers();
// init the SSL context
SSLContext sslContext = SSLContext.getDefault();
sslContext.init(keyManagers, null, new SecureRandom());
// get the socket factory
SSLServerSocketFactory socketFactory = sslContext.getServerSocketFactory();
// and finally, get the socket
ServerSocket serverSocket = socketFactory.createServerSocket(443);
而这甚至没有任何错误处理。这真的很复杂吗?有没有更简单的方法来做到这一点?
这个问题是非常关于设置证书的问题。你的标题没有强调(至今为止的答案似乎错过了这一点),所以我冒昧地改变它。如果你愿意,请进一步改进标题。 –
我认为你到目前为止提出的代码是(a)可怕的,而(b)很可能是做到这一点的“正确”方式。 Java并不总是过于冗长,但是当它真的非常冗长时。 –
如果您认为这很复杂,请尝试使用NIO进行操作。 –