Tomcat配置CloudFlare免费ssl证书问题

花了三个小时时间才解决这个小问题。

起因:

在tomcat上配置cloudflare的免费ssl证书,确不起作用。

过程:

在cloudflare上创建了免费的ssl证书,会拿到两个key,一个是证书,一个是私钥。分别保存为cert.pem和key.pem。

这时候如果按照一般的步骤,通过keytool把cert.pem导入到keystore中,然后在tomcat的server.xml中配置对应的Connector。会发现,虽然443端口打开了,但是访问443端口没有任何回包。去看tomcat的catalina日志,会发现在启动时有一个异常:

1
Alias name [*] does not identify a key entry

但是通过keytool -list -v去查看jks中的证书,却又看到明明是有这个alias的。

分析:

就是因为被这个异常误导,所以花了大量时间在研究是不是生成jks的方法有问题,然而其实问题和alias本身没有关系。之所以会有这个问题,是因为上面的做法中,keystore只导入了pem证书,却没有证书对应的私钥,因此无法使用。

解决:

需要先把证书和私钥合并为p12证书,然后再把证书导入jks中。步骤如下:

  1. 合并证书和私钥,会要求输入合并后的证书密码:xxxxxx
1
openssl pkcs12 -inkey key.pem -in cert.pem -export -out cert.p12
  1. 把生成后的证书导入jks中
1
keytool -importkeystore -srckeystore cert.p12 -srcstorepass xxxxxx -srcstoretype pkcs12 -destkeystore mydomain.jks -deststoretype jks -deststorepass xxxxxx

生成mydomain.jks后在tomcat中配置对应的Connector并重启tomcat。

1
2
3
4
5
6
7
8
9
10
<Connector port="443"
scheme="https"
secure="true"
SSLEnabled="true"
clientAuth="false"
sslProtocol="TLS"
disableUploadTimeout="true"
keyAlias="1"
keystoreFile="/root/mydomain.jks"
keystorePass="xxxxxx"/>

现在可以正常访问了:https://moviehell.net