在过去的几天里,我尝试在 Ubuntu 10.10 上安装一个工作的 CAS 服务器(Jasig CAS)。我安装了 Tomcat 6 并为 SSL 端口 8443 配置(server.xml)它:
<!-- Define a SSL HTTP/1.1 Connector on port 8443 -->
<Connector port="8443"
maxHttpHeaderSize="8192"
maxThreads="150"
minSpareThreads="25"
disableUploadTimeout="true"
acceptCount="100"
scheme="https"
secure="true"
clientAuth="false"
SSLEnabled="true"
SSLProtocol="SSLv3"
SSLCertificateFile="/etc/ssl/certs/server_cert.pem"
SSLCertificateKeyFile="/etc/ssl/private/server_key.pem"
SSLCACertificateFile="/etc/ssl/certs/ca_cert.pem"
SSLCACertificatePath="/etc/ssl/certs"
SSLPassword="password"
/>
server_cert.pem、server_key.pem 是自签名 x509 证书。此外,我为 Windows 测试服务器 (apache2 - xampp) 创建了一个 x509v3 证书(两台服务器都在同一个 LAN 中,并且 IP 为 10.0.0.*)。这些证书安装在位于 java 目录中的 java 密钥库 (cacerts) 中。由于客户端证书中的“替代主题名称”一直存在问题,因此我使用了 openssl 配置文件的扩展版本来创建它。
apache2 ssl 配置文件如下所示:
<IfModule ssl_module>
....
<VirtualHost 10.0.0.2:443>
SSLEngine on
ServerName 10.0.0.2:443
#ServerAlias 10.0.0.2
DocumentRoot c:/xampp/htdocs
SSLProtocol -all +SSLv3
SSLCertificateFile C:/xampp/ssl/certs/powercomputer_cert.pem
SSLCertificateKeyFile C:/xampp/ssl/private/powercomputer_key.pem
SSLCACertificateFile C:/xampp/ssl/certs/ca_cert.pem
</VirtualHost>
...
</IfModule>
SSL 连接在两台服务器上都有效(使用 IE 和 firefox 进行了测试)。
现在是艰巨的任务。我在 windows 机器上使用了一个名为 phpCAS 的模块,用 php 编程,与 CAS 服务器通信。模块向 CAS 服务器发送回调 url,服务器发送代理票证等。
但是我无法确保两台服务器之间的有效 SSL 握手。openssl -s_client -connect... 对于两台服务器,它都没有显示任何错误,所以我调试了完整的 SSL 握手(这里只是相关部分):
...
*服务器你好完成
* ClientKeyExchange, RSA PreMasterSecret, SSLv3 http-apr-8443-exec-3, WRITE: SSLv3 Handshake, length = 132 SESSION
KEYGEN: PreMaster Secret: 0000: 03 00 78 96 8F EE D3 4A 2F A8 CC F8 F9 D7 2F CB ..x....J/...../. 0010: 9E 3A 58 66 43 0E D5 49 3C 8A B0 3D 3F 2C 89 A0 .:XfC..I<..=?,.. 0020: BC E2 B2 12 F8 D9 55 73 F2 2C 1F CC 81 80 94 22 ......Us.,......” 连接密钥:客户端 Nonce:0000:4E D1 94 ED 32 7F FA 72 40 3C 43 C8 05 E2 62 D0 N...2..r@ 91 E2 D0 1C 90 3D 30 DD ..n;W6........=0. 主密码:0000:EB 25 F0 A2 A3 FF 37 06 BB 79 41 C5 E5 07 1C 64 .%....7. .yA....d 0010:77 66 A3 37 71 97 63 AF DB A2 79 47 85 E2 9C 74 wf.7q.c...yG...t 0020:5F 14 3D 26 57 E8 AD 9B A1 7C AC 33 00 04 4A E0 _.=&W......3..J. 客户端 MAC 写入密码:0000: C9 20 BF A5 A6 2B C1 DA A8 4E 93 E0 DE 76 06 53 . ...+. ..N...vS 服务器 MAC 写入密码:0000: 66 77 5A 3E BD E7 19 55 A4 80 1E E6 8A 9E 2A 5E fwZ>...U..... .*^ 客户端写入密钥:0000:58 D1 29 38 13 D8 83 EF 4F BD 7A 18 C8 35 D7 B4 X.)8....Oz.5.. 服务器写入密钥:0000:3A 7B 6A 6E 66 E9 E1 42 A4 3C C3 19 D0 7F 21 FF :.jnf..B.<....!. ... 没有用于此密码的 IV
http-apr-8443-exec-3,写入:SSLv3 更改密码规范,长度 = 1
*完成 verify_data: { 71, 19, 125, 80, 118, 60, 64, 122, 243, 112, 45, 18, 254, 144, 12, 143, 221, 125, 10, 94, 15, 221, 122 , 21, 90, 190, 76, 224, 224, 57, 67, 172, 228, 75, 181, 228 }
* http-apr-8443-exec-3,写入:SSLv3 握手,长度 = 56 http-apr-8443-exec-3,读取:SSLv3 警报,长度 = 2
http-apr-8443-exec-3,RECV SSLv3 ALERT:致命,bad_record_mac
http-apr-8443-exec-3,调用closeSocket() http-apr-8443-exec-3,
处理异常:javax.net.ssl.SSLException:收到致命警报:
bad_record_mac 2011-11-27 02:39:57,315 错误
[org.jasig.cas.util.HttpClient] -
bad_record_mac> javax.net.ssl.SSLException:收到致命警报:
bad_record_mac 在 sun.security.ssl.Alerts.getSSLException(Alerts.java:208) 在 sun.security.ssl.Alerts.getSSLException(Alerts.java:154) 在 ....
最近几天我没有找到任何解决方案,我真的不知道问题出在哪里。顺便说一句,我强制使用 SSLv3。
非常感谢您的任何建议。