打算给新开发的应用做https方式访问,采用双向认证的方式(即客户端需要校验服务器端证书,服务器端也需要校验客户端证书),在网上找了半天,都是东一句西一句的,没有一个比较全的,经过一番周折,终于搭起来了。讲讲主要的思路:
#在当前目录下创建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
#客户端证书生成依照服务器生成步骤再做一遍(注意,根证书不需要再次生成)。
#导入服务器个人证书(带私钥)到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
<?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,可在控制台窗口输出中看到启动信息。
http://localhost:8443/