要进行SSL加密的服务器/客户端通信,我们需要密钥库和Truststore服务器&客户端。以下是创建它们的步骤。
#Creating Server keystore and exporting a certificate
keytool -genkey -alias serverkeys -keyalg RSA -keystore server.keystore -storepass changeit -keypass changeit -dname "CN=test.com, OU=Test, O=Test, L=London, ST=London, C=UK"
keytool -export -alias serverkeys -keystore server.keystore -storepass changeit -file server.cer
#Creating Client keystore and exporting a certificate
keytool -genkey -alias clientkeys -keyalg RSA -keystore client.keystore -storepass changeit -keypass changeit -dname "CN=test.com, OU=test, O=test, L=London, ST=London, C=UK"
keytool -export -alias clientkeys -keystore client.keystore -storepass changeit-file client.cer
#Making a copy of cacerts file. These copies will be used for client/server truststore
cp /usr/java/jdk1.6.0_14/jre/lib/security/cacerts client.truststore
cp /usr/java/jdk1.6.0_14/jre/lib/security/cacerts server.truststore
#Copying server certificate to Client truststore
keytool -import -trustcacerts -v -keystore client.truststore -storepass changeit -file server.cer
#Copying Client certificate to Server truststore
keytool -import -trustcacerts -v -keystore server.truststore -storepass changeit -file client.cer
在最初的几个迭代我没有使用CACERT而是直接创建证书信任存储,并且也运作良好。当我们需要使用SSL连接到其他某些服务时,出现了问题,即使服务使用了签名证书,也无法建立连接。
例如,如果信任库不是从cacerts创建的,连接到GMail SMTP服务器将失败。即使GMail使用签名证书,我们也会使用不知道GMail证书是否可信的信任库。出于这个原因,我们使用cacerts来创建信任库。之后,我们能够连接使用签名证书的任何服务。
如果遇到未签名证书,我们将不得不将它们添加到Components Truststore。