打算给新开发的应用做https方式访问,采用双向认证的方式(即客户端需要校验服务器端证书,服务器端也需要校验客户端证书),在网上找了半天,都是东一句西一句的,没有一个比较全的,经过一番周折,终于搭起来了。讲讲主要的思路:
- 先给服务器端与客户端发证书(我用的是openssl)
- 创建服务器端的keystore,里面包含服务器端个人证书(带私钥)和可信任的CA根证书与客户端证书。
- 配置jetty.xml,设置https参数,包括端口号,keystore库位置,truststore库位置,口令,和双向认证方式。
1、用openssl发证
#在当前目录下创建openssl.cnf配置文件,可从openssl安装目录下拷贝一份,主要修改string_mask,从nombstr改为utf8only
string_mask = utf8only
#创建根证书私钥
openssl genrsa -des3 -out cakey.pem -passout pass:12345678 1024
#创建自签名的根证书
openssl req -utf8 -new -x509 -days 7300 -key cakey.pem -passin pass:12345678 -out cacert.crt -config openssl.cnf -set_serial 1 -subj "/CN=XX证书中心/OU=XX证书中心/O=XXXX公司"
#创建服务器的私钥
#openssl genrsa -des3 -out server.key 1024
#创建服务器的待签证书
openssl req -utf8 -new -key server.key -days 7300 -out server.csr -passin pass:12345678 -passout pass:12345678 -subj /CN=localhost/OU=XX证书中心/O=XXXX公司
#签发服务器证书(pem格式)
openssl ca -utf8 -config openssl.cnf -passin pass:12345678 -batch -in server.csr -out server.crt
#生成带私钥的pkcs12格式服务器证书
openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx -passin pass:12345678 -passout pass:12345678
#转换pem(base64)编码格式的服务器证书为der(二进制)编码格式
openssl x509 -in server.crt -inform pem -out server.der -outform der
#客户端证书生成依照服务器生成步骤再做一遍(注意,根证书不需要再次生成)。
2、导入证书到keystore中
#导入服务器个人证书(带私钥)到keystore中
keytool -importkeystore -srckeystore server.pfx -srcstoretype PKCS12 -keystore server.jks -srcstorepass 12345678 -deststorepass 12345678
#导入ca根证书和客户端证书到可信任证书链中
keytool -import -keystore server.jks -keypass 12345678 -storepass 12345678 -alias ca -trustcacerts -file cacert.crt
keytool -import -keystore server.jks -keypass 12345678 -storepass 12345678 -alias client -trustcacerts -file client.der
3、jetty.xml的配置(精简型,只运行一个应用,线程数也设置的很少)
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure id="Server" class="org.mortbay.jetty.Server">
<Set name="ThreadPool">
<New class="org.mortbay.thread.BoundedThreadPool">
<Set name="minThreads">1</Set>
<Set name="maxThreads">5</Set>
</New>
</Set>
<Call name="addConnector">
<Arg>
<New class="org.mortbay.jetty.security.SslSelectChannelConnector">
<Set name="Port"><SystemProperty name="jetty.port" default="8443"/></Set>
<Set name="maxIdleTime">30000</Set>
<Set name="Acceptors">1</Set>
<Set name="AcceptQueueSize">100</Set>
<Set name="keystore"><SystemProperty name="jetty.home" default="." />/etc/server.jks</Set>
<Set name="password">12345678</Set>
<Set name="keyPassword">password</Set>
<Set name="truststore"><SystemProperty name="jetty.home" default="." />/etc/server.jks</Set>
<Set name="trustPassword">12345678</Set>
<Set name="needClientAuth">true</Set>
</New>
</Arg>
</Call>
<Set name="handler">
<New id="Handlers" class="org.mortbay.jetty.handler.HandlerCollection">
<Set name="handlers">
<Array type="org.mortbay.jetty.Handler">
<Item>
<New class="org.mortbay.jetty.webapp.WebAppContext">
<Set name="contextPath">/</Set>
<Set name="resourceBase">webapp/</Set>
<Call name="addServlet">
<Arg>org.mortbay.jetty.servlet.DefaultServlet</Arg>
<Arg>/</Arg>
</Call>
</New>
</Item>
</Array>
</Set>
</New>
</Set>
</Configure>
配置好后,运行jetty,可在控制台窗口输出中看到启动信息。
4、浏览器中导入根证书cacert.crt和客户端证书client.pfx,然后访问
http://localhost:8443/