最近测试通过HttpClient登录SSL连接的RTC,发现原先改了认证方式为HTTP BASE后的方式并不适用于SSL,由于SSL是在构建安全传输通道后进行传输,而通道构建需要验证key-store,之前在apache+php的网站上配置SSL是要有crt和key两个文件,现在所接触的RTC是Java开发的,使用Tomcat的时候在Tomcat的server.xml中配上keystore即可。
下面是最近收集的HttpClient访问SSL系统的资料,结合最近接触的RTC,整理后发出来为需要此方面资料的朋友做参考。所涉及开发工具及环境:IBM Rational Team Concert+Rational team concert 4.0.1
操作步骤:
一、生成KeyStore
这一步是JDK自带的工具生成,保证配置好环境变量的同时,打开命令提示符,即运行中输入cmd。
输入如下命令:
keytool -genkey -alias tomcat -keyalg RSA -validity 60 -keystore E:\rtc.keystore
输出:
输入keystore密码:****** 您的名字与姓氏是什么? [Unknown]: localhost 您的组织单位名称是什么? [Unknown]: xxx 您的组织名称是什么? [Unknown]: xxx 您所在的城市或区域名称是什么? [Unknown]: xxx 您所在的州或省份名称是什么? [Unknown]: xxx 该单位的两字母国家代码是什么 [Unknown]: xxx CN=localhost, OU= xxx, O= xxx, L=xxx, ST=xxx, C=xxx 正确吗? [否]: Y 输入的主密码(如果和 keystore 密码相同,按回车):*******
参数说明:
-genkey表示生成密钥 -validity指定证书有效期,这里是60天 -alias指定别名,这里是tomcat -keyalg指定算法,这里是RSA -keystore指定存储位置,这里是D:\rtc.keystore 使用的自定义密码为 123456
Keytool 详细命令说明请参考百度百科;
*其中 您的名字与姓氏是什么? localhost是网站的域名或者ip,根据实际情况填写。否者会出现证书上的名称无效。
二、配置tomcat服务器支持SSL
1、将生成的 rtc.keystore文件,放到tomcat根目录,替换根目录的ibm-team-ssl.keystore(这里特指RTC,自己开发的程序不会有这个文件,故可以随便放)。
修改tomcat根目录下的/conf/server.xml
<connector port="9443" connectionTimeout="20000" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="false" keystoreFile="ibm-team-ssl.keystore" keystorePass="ibm-team" protocol="HTTP/1.1" SSLEnabled="true" sslProtocol="${jazz.connector.sslProtocol}" algorithm="${jazz.connector.algorithm}" URIEncoding="UTF-8" ciphers="SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA"></connector>
将keystoreFile=”ibm-team-ssl.keystore”值改为rtc.keystore,或者将keystore文件名改为ibm-team-ssl.keystore
然后将keystorePass=”ibm-team”值改为123456,或者在生成keystore的时候设置密码为ibm-team。
可能有朋友问了,为什么不直接使用RTC本身的这个keystore呢?因为这个keystore经过笔者验证,是localhost的,一开始个人认为是安装配置的问题,后来多次安装验证发现不是,因为SSL证书是一对一的,为了自定义域名或者ip,便于后期使用,还是自己生成吧。
另外针对自己编写的程序如果加SSL,同样的方法。修改tomcat根目录下的/conf/server.xml,新增Connector(原注释里有):
<connector SSLEnabled="true" URIEncoding="UTF-8" clientAuth="false" keystoreFile="conf/rtc.keystore" keystorePass="123456" maxThreads="150" port="8443" protocol="HTTP/1.1" scheme="https" secure="true" sslProtocol="TLS"></connector>
这样你的tomcat就支持https访问了
属性说明:
port: 这个port属性(默认值是8443)是 TCP/IP端口数码,Tomcat在其上监听安全连接。你可以把它更改成任何你愿意要的数值(如默认的https通信,数目是443)。不过,在许多操作系统中,要想在比1024小的端口数码上运行Tomcat,需要特殊的设置。
redirectPort: 如果你在这里更改端口数值,你还必须更改在non-SSL连接器上的redirectPort 这个属性特定的值。这允许Tomcat自动地redirect那些试图访问有安全限制页面的用户,指明根据 Servlet 2.4 Specification要求,SSL是必需的
clientAuth: 如果你想要Tomcat要求所有的SSL客户在使用这个socket时出示用户认证书,把这个值设定为 true 。如果你想要Tomcat要求出示用户认证书,但是如果没有认证书也可以, 就把这个值设定为want 。
keystoreFile: 如果你产生的keystore文件不在Tomcat期望的默认地方(一个叫做.keystore 的文件在Tomcat运行的主目录),就添加这个属性。你可以指定一个绝对路径名称, 或者一个由$CATALINA_BASE环境变量而派生的相对路径名称。
keystorePass: 如果你使用一个不同的keystore(以及认证书)密码,而不是Tomcat期望的密码 (就是changeit),添加这个元素。
keystoreType: 如果使用一个PKCS12 keystore的话,就添加这个element。 有效的值是JKS 和 PKCS12
sslProtocol: 要在这个socket上被使用的加密/解密协定。如果你在使用Sun的JVM,我们不提倡更改 这个值。据报道,TLS协定的IBM’s 1.4.1 实现与一些通用的浏览器不兼容。 如果是这样,就使用value SSL
ciphers: 这个socket允许使用的由逗号分隔开的加密密码列单。默认的情况下,任何可用的密码都允许被使用。
algorithm: 可用的X509算法。默认是Sun的实现( SunX509 )。 对于IBM JVMs,你应该使用值 IbmX509。对于其他卖主,查阅JVM文档资料来 找正确的值。
truststoreFile: 用来验证用户认证书的TrustStore文件。
truststorePass: 访问TrustStore的密码。默认值就是keystorePass的值。
truststoreType: 如果你在使用与KeyStore不同格式的TrustStore,添加这个元素。 合法的值是JKS和PKCS12
keyAlias: 如果 keystore 里面有多个 key,你可以为用这个选项为加入的 key 起一个名字。 如果没有指定名字,使用时 keystore 内的第一个 key 将会被使用
三、用浏览器访问你的应用
输入:https://localhost:9443/ccm/web,能够访问说明你的应用已经处于SLL安全通道中了。
四、用httpClient访问https
利用官方的一个例子来说明:
public class ClientCustomSSL { public final static void main(String[] args) throws Exception { DefaultHttpClient httpclient = new DefaultHttpClient(); try { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream instream = new FileInputStream(new File("d:\\rtc.keystore")); try { //加载keyStore d:\\rtc.keystore trustStore.load(instream, "123456".toCharArray()); } finally { try { instream.close(); } catch (Exception ignore) {} } //穿件Socket工厂,将trustStore注入 SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore); //创建Scheme Scheme sch = new Scheme("https", 9443, socketFactory); //注册Scheme httpclient.getConnectionManager().getSchemeRegistry().register(sch); //创建http请求(get方式) HttpGet httpget = new HttpGet("https://localhost:9443/ccm/rootservices"); System.out.println("executing request" + httpget.getRequestLine()); HttpResponse response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); System.out.println("----------------------------------------"); System.out.println(response.getStatusLine()); if (entity != null) { String ss = EntityUtils.toString(entity); EntityUtils.consume(entity); } } finally { httpclient.getConnectionManager().shutdown(); } } }
运行程序:
executing requestGET https://localhost:9443/ccm/rootservices HTTP/1.1
—————————————-
HTTP/1.1 200 OK
状态码200,说明已经成功访问到RTC了,访问到了,但只能通过OSLC查看rootservices,要进行进一步的操作,还需要认证,具体细节尚在学习中,有待总结后发出来分享。
上一篇: 用Java发起HTTP请求与获取状态码(含状态码列表) 下一篇: 电脑开机停留在正在启动windows画面问题分析及解决