最近在搞单点登录CAS,第一步就是需要给tomcat配置证书。但是,第一次配置就遇到了个问题排插了一下午。下面来存一份文档,以备以后遇到。
一、首先准备好环境
java环境:配置好环境变量,找到jdk路径,后面会用到。我的存放在/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home
tomcat相关配置:主要修改server.xml文件
二、按照教程操作
http://blog.csdn.net/frinder/article/details/7969925
http://blog.csdn.net/xiexl/article/details/6411496
按照这两个教程来操作。但是在mac下略有不同。
三、创建证书
1. 服务器中生成证书:
(注:生成证书时,CN要和服务器的域名相同,如果在本地测试,则使用localhost)
keytool -genkey -alias tomcat -keyalg RSA -keystore /Users/baidu/Documents/work/keys/mykeystore -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass changeit -storepass changeit
2. 导出证书,由客户端安装:
keytool -export -alias tomcat -keystore /Users/baidu/Documents/work/keys/mykeystore -file /Users/baidu/Documents/work/keys/mycerts.cer -storepass changeit
3. 客户端配置:为客户端的JVM导入密钥(将服务器下发的证书导入到JVM中)
keytool -import -trustcacerts -alias tomcat -keystore "/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/lib/security/cacerts" -file /Users/baidu/Documents/work/keys/mycerts.cer -storepass changeit
4. 查看jvm中是否有别名为tomcat的证书:
keytool -list -alias tomcat -keystore "/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/lib/security/cacerts" -storepass changeit
直接上图:
四、修改tomcat的server.xml配置
<Connector SSLEnabled="true" clientAuth="false" keystoreFile="/Users/baidu/Documents/work/keys/mykeystore" keystorePass="changeit" maxThreads="150" port="8443" protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true" sslProtocol="TLS"/>
五、配置host:
vi /etc/hosts
127.0.0.1 localhost
六、访问链接:https://localhost:8443
七、遇到的问题
访问https://localhost:8443
firefox提示:连接 localhost:8443 时发生错误。 SSL 接收到一个超出最大准许长度的记录。 (错误码: ssl_error_rx_record_too_long)
chrome提示:ERR_SSL_PROTOCOL_ERROR (Chrome)
于是就在谷歌上搜,看到以下几种解决方案:
1.修改apache2的httpd.conf配置文件,在
Listen 80 后面加上 Listen 443 https:
Listen 80
Listen 443 https
2.确保JVM中有刚刚生成的证书:
keytool -list -alias tomcat -keystore "/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/lib/security/cacerts" -storepass changeit
3.修改apache的<VirtualHost>配置
我3种方式都试了不行。
4.那我用 openssl s_client -connect yourdomain.tld:*port*这个命令试试:
来看下连接有啥问题:
MacBook-Pro-2:other baidu$ openssl s_client -connect localhost:8443
CONNECTED(00000003)
11989:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:/SourceCache/OpenSSL098/OpenSSL098-52.30.1/src/ssl/s23_lib.c:185:
看错误信息,建立链接就失败了。
那究竟是什么原因呢。我实在是搞不定了。就从同事哪里拷贝过来一份server.xml的配置:
就是上面第四步提到的。而我出错的配置是长得下面这个样子的:
<Connector port="8443" maxHttpHeaderSize="8192" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" keystoreFile="server.keystore" keystorePass="changeit"/>
最根本的错误原因是配置搞错了。
首先,server.keystore没有找到,没有找到我存放证书的那个文件。要改成最初的那个密钥文件/Users/baidu/Documents/work/keys/mykeystore。
其次,密码要对。
然后呢,protocal,就用server.xml去掉注释后留下的那个就行了。